第一种方式(使用命令)
生成私钥
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.cnfopenssl.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.cnfreq_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