我下面生成的 .keystore文件也可以用 .jks 后缀代替, jks 的意思就是 java keystore, 另外需要知道 .cer文件是二进制的, .pem文件是文本文件, 本质都是一样的, 他们可以互相转换。 java 语言操作的是二进制的文件, 其他的一些脚本语言, 可能操作的是PEM格式的文件。看具体情况吧。
keytool -genkey -v -alias server_ks -keysize 2048 -keyalg RSA -dname "CN=www.abc.com" -keypass 123456 -storepass 123456 -keystore ./server.keystore -validity 36500
创建客户端keystore
keytool -genkey -v -alias client_ks -keysize 2048 -keyalg RSA -dname "CN=www.abc.com" -keypass 123456 -storepass 123456 -keystore ./client.keystore -validity 36500
导出服务端证书
keytool -export -v -alias server_ks -keystore ./server.keystore -storepass 123456 -file ./server.cer
导出客户端证书
keytool -export -v -alias client_ks -keystore ./client.keystore -storepass 123456 -file ./client.cer
将服务端证书导入到客户端trustkeystroe
keytool -import -v -alias xxx -keystore ./clientTrust.jks -storepass 123456 -file ./server.cer
将客户端证书导入到服务端trustkeystroe
keytool -import -v -alias xxx -keystore ./serverTrust.jks -storepass 123456 -file ./client.cer
把二进制的CER文件转换为文本的PEM文件
openssl x509 -in ./xxx.cer -inform der -outform pem -out ./xxx.pem
把文本的PEM文件转换为二进制的CER文件
openssl x509 -in ./xxx.pem -inform pem -outform der -out ./xxx.cer
jks文件(java key store文件)转化为浏览器可以加载的PKCS12格式
keytool -importkeystore -srckeystore ./client.keystore -destkeystore ./browser.p12 -srcstoretype JKS -deststoretype PKCS12 -keypass 123456 -storepass 123456
storetype 类型有 JKS, JCEKS, PKCS12, PKCS11 and DKS
下面的命令查看证书是否已经添加到信任列表中了
keytool -list -keystore ./serverTrust.jks
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
Netty WebSocket Timer Service
</head>
<br>
<body>
<br>
<script type="text/javascript">
var socket;
if (!window.WebSocket)
{
window.WebSocket = window.MozWebSocket;
}
if (window.WebSocket) {
socket = new WebSocket("wss://www.abc.com:9999/");
socket.onmessage = function(event) {
var ta = document.getElementById('responseText');
ta.value="";
ta.value = event.data
};
socket.onopen = function(event) {
var ta = document.getElementById('responseText');
ta.value = "Open WebSocket success,Browser support WebSocket!";
};
socket.onclose = function(event) {
var ta = document.getElementById('responseText');
ta.value = "";
ta.value = "WebSocket closed!";
};
}
else
{
alert("Sorry,Your browser is not support WebSocket!");
}
function send(message) {
if (!window.WebSocket) { return; }
if (socket.readyState == WebSocket.OPEN) {
socket.send(message);
}
else
{
alert("WebSocket can't connect server!");
}
}
</script>
<form onsubmit="return false;">
<input type="text" name="message" value="Netty example"/>
<br><br>
<input type="button" value="Send WebSocket message" onclick="send(this.form.message.value)"/>
<hr color="blue"/>
<h3>Server response message</h3>
<textarea id="responseText" style="width:500px;height:300px;"></textarea>
</form>
</body>
</html>
源码在我的下载资源里有, 包括客户端源码和服务器端源码。 通过java客户端TCP的双向认证收发, 通过浏览器测试的websocket双向认证收发都测试通过。