使用OpenSSL生成TLS配置文件
引言
最近在搭建SDP项目的通信模块时,需要建立控制器和客户端的双向TLS加密,这部分采用OpenSSL生成密钥和证书的方式实现。本篇文章用于记录OpenSSL的简易使用方法,通过本文可以快速地生成Netty可用的密钥证书。
构建步骤
本文的构建环境为 Ubuntu 22.04,其自带了 OpenSSL,其他平台用户可能需要首先安装 OpenSSL,具体步骤如下:
- 生成CA的私钥
ca.key
和自签名证书ca.crt
,用于 SSL/TLS 通信的证书认证,当前自签名证书有效期为 365 天,即一年1
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:4096 -keyout ca.key -out ca.crt
- 生成服务器(即Controller)的私钥
server.key
,证书签名请求server.csr
以及签名证书server.crt
1
2
3
4# server.key 为密钥长度为 2048 位的 RSA 私钥,证书有效期为 365 天
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -out server.crt - 生成客户端(即Client)的私钥
client.key
,证书签名请求client.csr
以及签名证书client.crt
1
2
3
4# 同上,证书有效期为 31 天
openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csr
openssl x509 -req -days 31 -in client.csr -CA ca.crt -CAkey ca.key -out client.crt - 转换为 netty 可以识别的密钥格式
1
2openssl pkcs8 -topk8 -inform PEM -in server.key -outform PEM -nocrypt -out server_pkcs8.key
openssl pkcs8 -topk8 -inform PEM -in client.key -outform PEM -nocrypt -out client_pkcs8.key - *CA可以通过以下指令去核实证书
1
2openssl verify -purpose sslserver -CAfile ca.crt server.crt
openssl verify -purpose sslclient -CAfile ca.crt client.crt
至此我们在当前目录下可以得到以下文件:
ca.key ca.crt ca.srl client.crt client.key client.csr client_pkcs8.key server.crt server.key server.csr server_pkcs8.key
其中 *_pkcs8.key
文件就是 Netty 配置 TLS 时能够识别的
PKCS8 密钥格式。
可能遇到的问题
- CA
签发证书时提示如下,是指我们在签发证书时需要指定一个生成证书的序列号,可以在签发前
echo "01" > ca.srl
避免提示1
2
3
4
5
6
7
8$ openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -out server.crt
Signature ok
subject=C = CN, ST = JiangSu, L = Nanjing, O = SEU, OU = CyberScience, CN = 6209, emailAddress = ShijieQ@outlook.com
Getting CA Private Key
ca.srl: No such file or directory
139954133366592:error:06067099:digital envelope routines:EVP_PKEY_copy_parameters:different parameters:crypto/evp/p_lib.c:93:
139954133366592:error:02001002:system library:fopen:No such file or directory:crypto/bio/bss_file.c:69:fopen('ca.srl','r')
139954133366592:error:2006D080:BIO routines:BIO_new_file:no such file:crypto/bio/bss_file.c:76: - 使用 CA 的自签名证书签发密钥证书后,可能会出现无法 CA
无法认证的情况,需要检查在签发时 Common Name 不能和 CA 相同
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20$ openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:4096 -keyout ca.key -out ca.crt
Generating a RSA private key
.++++
...................................................................++++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:JiangSu
Locality Name (eg, city) []:Nanjing
Organization Name (eg, company) [Internet Widgits Pty Ltd]:XXX
Organizational Unit Name (eg, section) []:XXXX
Common Name (e.g. server FQDN or YOUR name) []:XXXX # 这个不能和控制器以及客户端相同
Email Address []:ShijieQ@outlook.com
使用OpenSSL生成TLS配置文件
http://shijieq.github.io/2023/03/17/OpenSSL/使用OpenSSL生成TLS配置文件/