openssl生成.pem证书文件

  1. 生成方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1、生成RSA密钥的方法 

openssl genrsa -des3 -out privkey.pem 2048
这个命令会生成一个2048位的密钥,同时有一个des3方法加密的密码,如果你不想要每次都输入密码,可以改成:
openssl genrsa -out privkey.pem 2048
建议用2048位密钥,少于此可能会不安全或很快将不安全。

2、生成一个证书请求
openssl req -new -key privkey.pem -out cert.csr
这个命令将会生成一个证书请求,当然,用到了前面生成的密钥privkey.pem文件
这里将生成一个新的文件cert.csr,即一个证书请求文件,你可以拿着这个文件去数字证书颁发机构(即CA)申请一个数字证书。CA会给你一个新的文件cacert.pem,那才是你的数字证书。

如果是自己做测试,那么证书的申请机构和颁发机构都是自己。就可以用下面这个命令来生成证书:
openssl req -new -x509 -key privkey.pem -out cacert.pem -days 1095
这个命令将用上面生成的密钥privkey.pem生成一个数字证书cacert.pem

3、使用数字证书和密钥
有了privkey.pem和cacert.pem文件后就可以在自己的程序中使用了,比如做一个加密通讯的服务器

参考原文【使用OpenSSL生成证书 pem文件的生成 celery Security】

  1. 校验生成证书md5是否匹配
1
2
3
openssl x509 -noout -modulus -in certificate.crt | openssl md5
openssl rsa -noout -modulus -in privateKey.key | openssl md5
openssl req -noout -modulus -in CSR.csr | openssl md5

参考原文【SSL在线工具】

  1. 服务器代码配置
1
2
3
4
5
6
7
8
9
10
11
12
13
if a.sc.Protocol == "wss" {
config := &tls.Config{}
config.NextProtos = []string{"http/1.1"}

config.Certificates = make([]tls.Certificate, 1)
config.Certificates[0], err = tls.LoadX509KeyPair(a.sc.CertFile, a.sc.KeyFile)
if err != nil {
logger.Logger.Error(err)
return nil
}

ln = tls.NewListener(ln, config)
}
  1. 客户端代码配置
1
2
3
4
5
6
// wss需有下行配置
dialer := websocket.Dialer{TLSClientConfig: &tls.Config{RootCAs: nil, InsecureSkipVerify: true}}
conn, _, err := dialer.Dial("wss://192.168.1.106:33002/", nil)
if err != nil {
log.Fatal(err)
}

参考原文【go使用wss连接websocket服务器端,并发送数据,和接收服务器端不断传进来的消息】

  1. 附带一个js使用ws简历连接方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<!DOCTYPE html>
<html>
<head>
<title>WebSocket Test</title>
</head>
<body>
<script>
var ws = new WebSocket("ws://192.168.1.106:33002/");
ws.onopen = function() {
console.log("WebSocket connection opened.");

var arrBuffer = new ArrayBuffer(12); // 初始化Byte的二进制数据缓冲区
var dataView = new DataView(arrBuffer);

// 第三个参数 true字节按照小端写入,false大端
dataView.setUint16(0, 12, true);
dataView.setUint16(2, 1, true);
dataView.setUint32(4, 1, true);
dataView.setUint16(8, 2, true);
dataView.setUint16(10, -1004, true);
ws.send(arrBuffer);
};
ws.onmessage = function(event) {
console.log("Received message: " + event.data);
};
ws.onclose = function() {
console.log("WebSocket connection closed.");
};
ws.onerror = function(event) {
console.log("WebSocket error: " + event.data);
};
</script>
</body>
</html>