带有 ssl LetsEncrypt 证书和自签名客户端证书的 mosquitto 代理
mosquitto broker with ssl LetsEncrypt certificate and self signed client certificate
我已经读过这篇文章,但我不确定我是否理解正确。
情况是我的 duckdns 服务器有用于 ssl 的 LetsEncrypt 证书。
我也想将它重新用于 mosquitto 服务器,我将其配置为
listener 8884
allow_anonymous false
password_file /mosquitto/config/passwords
certfile /mosquitto/ssl/live/xxxxxx.duckdns.org/fullchain.pem
keyfile /mosquitto/ssl/live/xxxxxx.duckdns.org/privkey.pem
tls_version tlsv1.2
其中certfile和keyfile是LetsEncrypt生成的。这按预期工作。
不过,现在要将其公开到 Web,我宁愿使用客户端证书。
据我了解,我应该使用“私有”CA,否则任何由 LetsEncrypt 签署的证书都可以作为有效的客户端。
所以我在配置中添加了以下几行
require_certificate true
use_identity_as_username true
cafile /mosquitto/certs/ca.crt
其中 ca.crt 是我用
生成的证书
openssl genrsa -out ca.key 4096
openssl req -new -x509 -days 36500 -key ca.key -out ca.crt
并使用
生成客户端证书
openssl genrsa -out keyfile.key 4096
openssl req -new -key keyfile.key -out keyfile.csr
openssl x509 -req -days 36500 -in keyfile.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out keyfile.crt
我检查了客户端证书是否使用 openssl verify 正确签名。
现在通过调用
mosquitto_pub --cafile /mosquitto/certs/ca.crt --key keyfile.key --cert keyfile.crt -h xxxxxx.duckdns.org -p 8884 -t broker/hello -m "online"
我收到一个 TLS 错误,在 mosquitto 日志中我看到了
OpenSSL Error[0]: error:1404A418:SSL routines:ST_ACCEPT:tlsv1 alert unknown ca
我想我混淆了服务器证书和具有不同 CA 的客户端证书,但我没有弄清楚我做错了什么以及如何达到目标。
任何关于我的操作错误的帮助或提示,我们将不胜感激。
问题是您传递给 mosquitto_pub
命令的 CA 证书。
mosquitto_pub 使用传递给它的 ca 证书来验证代理提供的证书以验证其自身,因此它应该指向具有 Let's Encrypt 根 CA 的某个地方。 CA 证书不应链接到客户端用于身份验证的 cert/key。
所以您可能应该将它指向系统 CA 证书包,例如
mosquitto_pub --capath /etc/ssl/certs --key keyfile.key --cert keyfile.crt -h xxxxxx.duckdns.org -p 8884 -t broker/hello -m "online"
我已经读过这篇文章,但我不确定我是否理解正确。
情况是我的 duckdns 服务器有用于 ssl 的 LetsEncrypt 证书。
我也想将它重新用于 mosquitto 服务器,我将其配置为
listener 8884
allow_anonymous false
password_file /mosquitto/config/passwords
certfile /mosquitto/ssl/live/xxxxxx.duckdns.org/fullchain.pem
keyfile /mosquitto/ssl/live/xxxxxx.duckdns.org/privkey.pem
tls_version tlsv1.2
其中certfile和keyfile是LetsEncrypt生成的。这按预期工作。
不过,现在要将其公开到 Web,我宁愿使用客户端证书。 据我了解,我应该使用“私有”CA,否则任何由 LetsEncrypt 签署的证书都可以作为有效的客户端。
所以我在配置中添加了以下几行
require_certificate true
use_identity_as_username true
cafile /mosquitto/certs/ca.crt
其中 ca.crt 是我用
生成的证书openssl genrsa -out ca.key 4096
openssl req -new -x509 -days 36500 -key ca.key -out ca.crt
并使用
生成客户端证书openssl genrsa -out keyfile.key 4096
openssl req -new -key keyfile.key -out keyfile.csr
openssl x509 -req -days 36500 -in keyfile.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out keyfile.crt
我检查了客户端证书是否使用 openssl verify 正确签名。 现在通过调用
mosquitto_pub --cafile /mosquitto/certs/ca.crt --key keyfile.key --cert keyfile.crt -h xxxxxx.duckdns.org -p 8884 -t broker/hello -m "online"
我收到一个 TLS 错误,在 mosquitto 日志中我看到了
OpenSSL Error[0]: error:1404A418:SSL routines:ST_ACCEPT:tlsv1 alert unknown ca
我想我混淆了服务器证书和具有不同 CA 的客户端证书,但我没有弄清楚我做错了什么以及如何达到目标。
任何关于我的操作错误的帮助或提示,我们将不胜感激。
问题是您传递给 mosquitto_pub
命令的 CA 证书。
mosquitto_pub 使用传递给它的 ca 证书来验证代理提供的证书以验证其自身,因此它应该指向具有 Let's Encrypt 根 CA 的某个地方。 CA 证书不应链接到客户端用于身份验证的 cert/key。
所以您可能应该将它指向系统 CA 证书包,例如
mosquitto_pub --capath /etc/ssl/certs --key keyfile.key --cert keyfile.crt -h xxxxxx.duckdns.org -p 8884 -t broker/hello -m "online"