参考资料EMQX官网博客:
启用SSL单向验证
购买证书
如果有购买证书的话,就不需要自签名证书。
为方便 EMQ X 配置,请将购买的证书文件重命名为 emqx.crt,证书密钥重命名为 emqx.key
启用SSL双向验证
1. centos 7 安装openssl
1.1 方式一
$ yum install openssl
1.2 方式二
官网地址 选择版本进行下载
当前最新版本为OpenSSL_1_1_1k.tar.gz
- 选择一个服务器文件夹地址,放入压缩包,并解压
tar -zxvf OpenSSL_1_1_1k.tar.gz
- 新建安装目录
mkdir /usr/local/openssl
- 进入解压后的文件目录
cd OpenSSL_1_1_1k
- 生成编译文件
./config --prefix=/usr/local/openssl
- make安装
make && make install
- 验证安装
cd /usr/local
ldd /usr/local/openssl/bin/openssl
#能出现版本号则成功
openssl version
如果出现gcc、make等command not found,需要安装gcc
yum -y install gcc
2. openssl生成证书
crt证书可参考:https://www.cnblogs.com/xiaohanlin/p/10213966.html
2.1 方式一(已验证成功)
来源 简单的证书制作
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -subj "/CN=www.emqx.io" -out ca.pem
openssl genrsa -out server.key 2048
openssl req -new -key ./server.key -out server.csr -subj "/CN=127.0.0.1"
openssl x509 -req -in ./server.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out server.pem -days 3650 -sha256
openssl genrsa -out client.key 2048
openssl req -new -key ./client.key -out client.csr -subj "/CN=127.0.0.1"
openssl x509 -req -in ./client.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out client.pem -days 3650 -sha256
2.2 方式二 使用配置文件
先新建openssl.cnf文件。
将证书需要的国家、机构等信息填入,方便生成证书。
如果不使用此配置,可在每次生成证书的时候,根据提示填入国家、机构等信息,将下面bash命令中的 ==-config ./openssl.cnf ==省略即可。
2.2.1 使用openssl自带配置文件(没有验证)
cp /etc/pki/tls/openssl.cnf ./
rm -rf /etc/pki/CA/*.old
## 生成证书索引库数据库文件
touch /etc/pki/CA/index.txt
## 指定第一个颁发证书的序列号
echo 01 > /etc/pki/CA/serial
使用默认的配置,可在生成证书命令后增加 -subj “/C=CN/ST=hangzhou/O=EMQ/CN=RootCA” 修改配置。
参考emqx自签二级证书
2.2.2 自制配置文件(验证时返回18)
[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 = Jiangsu
localityName = NanJing
organizationName = EMQX
commonName = EH
[req_ext]
subjectAltName = @alt_names
[v3_req]
subjectAltName = @alt_names
[alt_names]
DNS.1 = kb.example.com
DNS.2 = helpdesk.example.org
DNS.3 = systems.example.net
IP.1 = 192.168.1.1
IP.2 = 192.168.69.14
SubjectAltName 可以包含email 地址,ip地址,正则匹配DNS主机名,等等。
其中:
commonName_default: 证书的主域名
organizationName_default: 企业/单位名称
organizationalUnitName_default:企业部门
localityName_default: 城市
stateOrProvinceName_default: 省份
countryName_default: 国家代码,一般都是CN(大写)
[alt_names]: 后面为备用名称列表,可以是域名、泛域名、IP地址
2.2.3 生成自签名CA证书
先生成2048长度的随机Key,再用此Key生成EMQX根证书ca.pem,有效期10年(3650)
openssl genrsa -out ca.key 2048
openssl req -x509 -new -config ./openssl.cnf -key ca.key -sha256 -days 3650 -out ca.pem
2.2.4 生成服务端证书
生成步骤与上面类似。创建emqx.key,生成证书请求emqx.csr,签发证书。
openssl genrsa -out emqx.key 2048
openssl req -new -key ./emqx.key -config openssl.cnf -out emqx.csr
openssl x509 -req -in ./emqx.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out emqx.pem -days 3650 -sha256 -extensions v3_req -extfile openssl.cnf
2.2.5 生成客户端证书
双向连接认证还需要创建客户端证书。创建client.key,生成证书请求emqx.csr,签发证书。
openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csr -subj "/C=CN/ST=Jiangsu/L=SuZhou/O=EMQX/CN=client"
openssl x509 -req -days 3650 -in client.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out client.pem
3. EMQX/EMQTTD 开启SSL双向验证
将前文中通过 OpenSSL 工具生成的 emqx.pem、emqx.key 及 ca.pem 文件拷贝到 EMQ X 的 etc/certs/ 目录下,并参考如下配置修改 emqx.conf:
listener.ssl.external.keyfile = etc/certs/emqx.key
## 注意:如果 emqx.pem 是证书链,请确保第一个证书是服务器的证书,而不是 CA 证书。
listener.ssl.external.certfile = etc/certs/emqx.pem
## 注意:ca.pem 用于保存服务器的中间 CA 证书和根 CA 证书。可以附加其他受信任的 CA,用来进行客户端证书验证。
listener.ssl.external.cacertfile = etc/certs/ca.pem
## 开启双向认证
listener.ssl.external.verify = verify_peer
## 禁止单向认证
listener.ssl.external.fail_if_no_peer_cert = true
4.EMQX重启并使用客户端验证
./emqx/bin/emqx start
使用 MQTT X工具或mqtt fx都可。