最近做MQTT的开发,需要加OpenSSL功能,记录下来方便回顾
1.配置相关证书
1.1 生成ca证书和key
openssl req -new -x509 -days 36500 -keyout ca.key -out ca.crt
键入命令输出如下:
Generating a RSA private key
.............................................................+++++
.........................................................................+++++
writing new private key to 'ca.key'
Enter PEM pass phrase:【输入CA私钥密码,后面签名会用】
Verifying - Enter PEM pass phrase:【再次输入】
——-----
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]:【国家代码,两个字母】
State or Province Name (full name) [Some-State]:【省】
Locality Name (eg, city) []:【市】
Organization Name (eg, company) [Internet Widgits Pty Ltd]:【公司】
Organizational Unit Name (eg, section) []:【组织名,可以不填】
Common Name (e.g. server FQDN or YOUR name) []:【可以不填,但是一定不要和sever、client端证书的这个字段相同】
Email Address []:【邮件,随意填写】
1.2 配置server端的相关证书
1.2.1 server私钥文件
openssl genrsa -out server.key 2048
注:moquitto服务端最好不要设置密码会导致无法连接,如果是自行开发的服务端可以使用密码:openssl genrsa -des3 -out server.key 2048
1.2.2 server证书请求文件
openssl req -out server.csr -key server.key -new
键入指令输出如下:
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]:【国家代码】
State or Province Name (full name) [Some-State]:【省】
Locality Name (eg, city) []:【市】
Organization Name (eg, company) [Internet Widgits Pty Ltd]:test_sdk
Organizational Unit Name (eg, section) []:【组织名,可不填】
Common Name (e.g. server FQDN or YOUR name) []:【服务端所在IP或域名】
Email Address []:【邮件,随意填写】
——
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:【可不填】
An optional company name []:【可不填】
1.2.3 自签名server证书
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 36500
键入命令输出如下:
Signature ok
subject=....【这里是上面证书请求文件输入的内容】
Enter pass phrase for ca.key:【这里输入CA私钥的密码】
1.3 配置client端相关证书
配置步骤和【server】端相同,但是私钥文件可以使用密码,因为我们可以在开发时可以设置私钥使用的密码
2.配置mosquitto
修改mosquitto.conf配置文件
端口:
port 8883
——
ca文件绝对路径:
cafile /Users/xxx/Desktop/ssl_1.1.0j/openssl_0315/ca.crt
——
server端证书文件绝对路径:
certfile /Users/xxx/Desktop/ssl_1.1.0j/openssl_0315/server.crt
——
server端私钥文件绝对路径:
keyfile /Users/xxx/Desktop/ssl_1.1.0j/openssl_0315/server.key
——
如果是使用【mosquitto_sub/mosquitto_pub】简单测试可以设置下面两项:
require_certificate true
use_identity_as_username true
——
到此已经配置完成了,启动服务端、sub、pub就可以了,如果客户端私钥设置了密码则启动时需要输入密码
启动sub:mosquitto_sub -h 【ip或域名】 -p 【端口】 -t 【主题】 --cafile 【ca证书文件路径】 --cert 【client证书文件路径】 --key 【client私钥文件路径】
|
启动pub:mosquitto_pub -h【ip或域名】 -p 【端口】 -t 【主题】 -m 【消息】--cafile 【ca证书文件路径】 --cert 【client证书文件路径】 --key 【client私钥文件路径】
注意:如果是单向认证,则需要把服务端的【require_certificate 】设置为‘false’或注释掉,然后mosquitto的‘sub’、‘pub’客户端的参数中去掉【--cert】和【--key】两个参数即可,【CA】证书则服务和客户端要一致,要设置都设置否则都不设置,即【--cafile】参数根据设置决定添加与否
如果是自己实现的实现pub、sub功能且需要【用户名、密码】则需要设置【password_file】文件,将【require_certificate】、【use_identity_as_username】设置为【false或者注释掉】。
使用【mosquitto_passwd】生成的【用户名、密码】时则可以在上面启动sub、pub命令后添加参数 "-u 【用户名】 -P 【密码】",这里的“P”是大写的,小写表示端口。
网友评论