OpenSSL生成自签名证书


第一种方式(使用命令)

生成私钥

openssl genrsa -out server.key 1024

使用私钥生成自签名的cert证书文件,以下是通过参数只定证书需要的信息

openssl req -new -x509 -days 3650 -key server.key -out server.crt -subj "/C=CN/ST=Shanghai/L=Shanghai/O=JY/OU=JY/CN=test.domain.com/emailAddress=test@email.com"
C                      = GB 国家
ST                     = Test State or Province 省
L                      = Test Locality 市
O                      = Organization Name 组织机构名
OU                     = Organizational Unit Name 组织单位名
CN                     = Common Name 域名
emailAddress           = test@email.address 邮箱

参考链接:https://www.openssl.org/docs/man1.0.2/man1/openssl-req.html

第二种方式(交互)

通过openssl生成私钥

openssl genrsa -out server.key 1024

根据私钥生成证书申请文件csr

openssl req -new -key server.key -out server.csr

根据命令行向导来进行信息输入

ps.Common Name可以输入:*.yourdomain.com,这种方式生成通配符域名证书

使用私钥对证书申请进行签名从而生成证书

openssl x509 -req -in server.csr -out server.crt -signkey server.key -days 3650

第三种方式

openssl req -new -x509 -keyout server.key -out server.crt -config openssl.cnf

openssl.cnf

[ req ]
default_bits           = 2048
default_keyfile        = keyfile.pem
distinguished_name     = req_distinguished_name
attributes             = req_attributes
prompt                 = no
output_password        = mypass

[ req_distinguished_name ]
C                      = GB
ST                     = Test State or Province
L                      = Test Locality
O                      = Organization Name
OU                     = Organizational Unit Name
CN                     = Common Name
emailAddress           = test@email.address

[ req_attributes ]
challengePassword              = A challenge password

给MQTT生成双向认证证书

SSL/TLS 证书准备

在双向认证中,一般都使用自签名证书的方式来生成服务端和客户端证书,因此本文就以自签名证书为例。

通常来说,我们需要数字证书来保证 TLS 通讯的强认证。数字证书的使用本身是一个三方协议,除了通讯双方,还有一个颁发证书的受信第三方,有时候这个受信第三方就是一个 CA。
和 CA 的通讯,一般是以预先发行证书的方式进行的。也就是在开始 TLS 通讯的时候,我们需要至少有 2 个证书,一个 CA 的,一个 MQTT 的,MQTT 的证书由 CA 颁发,并用 CA 的证书验证。

在这里,我们假设您的系统已经安装了 OpenSSL。使用 OpenSSL 附带的工具集就可以生成我们需要的证书了。

生成自签名 CA 证书

首先,我们需要一个自签名的 CA 证书。生成这个证书需要有一个私钥为它签名,可以执行以下命令来生成私钥:

openssl genrsa -out ca.key 2048

这个命令将生成一个密钥长度为 2048 的密钥并保存在 ca.key 中。有了这个密钥,就可以用它来生成 MQTT 的根证书了:

openssl req -x509 -new -nodes -key ca.key -sha256 -days 36500 -out ca.pem

根证书是整个信任链的起点,如果一个证书的每一级签发者向上一直到根证书都是可信的,那个我们就可以认为这个证书也是可信的。有了这个根证书,我们就可以用它来给其他实体签发实体证书

生成服务端证书

实体(在这里指的是 MQTT)也需要一个自己的私钥对来保证它对自己证书的控制权。生成这个密钥的过程和上面类似:

openssl genrsa -out mqtt.key 2048

新建 openssl.cnf 文件

vi openssl.cnf

req_distinguished_name :根据情况进行修改,

alt_names: BROKER_ADDRESS 修改为 MQTT 服务器实际的 IP 或 DNS 地址,例如:IP.1 = 127.0.0.1,或 DNS.1 = broker.xxx.com

注意:IP 和 DNS 二者保留其一即可,如果已购买域名,只需保留 DNS 并修改为你所使用的域名地址。

[req]
default_bits  = 2048
distinguished_name = req_distinguished_name
req_extensions = req_ext
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
countryName = CN
stateOrProvinceName = Guangdong
localityName = Shenzhen
organizationName = MQTT
commonName = CA
[req_ext]
subjectAltName = @alt_names
[v3_req]
subjectAltName = @alt_names
[alt_names]
IP.1 = BROKER_ADDRESS
DNS.1 = BROKER_ADDRESS

然后以这个密钥和配置签发一个证书请求:

openssl req -new -key ./mqtt.key -config openssl.cnf -out mqtt.csr

然后以根证书来签发 MQTT 的实体证书:

openssl x509 -req -in ./mqtt.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out mqtt.pem -days 36500 -sha256 -extensions v3_req -extfile openssl.cnf

生成客户端证书

双向连接认证还需要创建客户端证书,首先需要创建客户端密钥:

openssl genrsa -out client.key 2048

使用生成的客户端密钥来创建一个客户端请求文件:

openssl req -new -key client.key -out client.csr -subj "/C=CN/ST=Guangdong/L=Shenzhen/O=MQTT/CN=client"

最后使用先前生成好的服务端 CA 证书来给客户端签名,生成一个客户端证书:

openssl x509 -req -days 36500 -in client.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out client.pem

文章作者: 江湖义气
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 江湖义气 !
  目录