带有 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"