我正在测试PC和服务器上使用Mosquitto版本1.4.8。可通过ha.euroicc.com访问该服务器。 我已经使用以下脚本生成了证书和密钥:
#! /usr/bin/env bash
# Create the CA Key and Certificate for signing Client Certs
openssl genrsa -out ca.key 4096
openssl req -new -x509 -days 365 -key ca.key -out ca.crt
# Create the Server Key, CSR, and Certificate
openssl genrsa -out server.key 1024
openssl req -new -key server.key -out server.csr
# We're self signing our own server cert here. This is a no-no in production.
openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
# Create the Client Key and CSR
openssl genrsa -out client.key 1024
openssl req -new -key client.key -out client.csr
# Sign the client certificate with our CA cert. Unlike signing our own server cert, this is what we want to do.
# Serial should be different from the server one, otherwise curl will return NSS error -8054
openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 02 -out client.crt
# Verify Server Certificate
openssl verify -purpose sslserver -CAfile ca.crt server.crt
# Verify Client Certificate
openssl verify -purpose sslclient -CAfile ca.crt client.crt
除通用名称外,我到处都放置了“ d”,“ dd”和“ dddd”。 ca的通用名称是“ d”,服务器/客户端的通用名称是“ ha.euroicc.com”。
服务器/客户端的CN必须为该值,否则根本不起作用!
我当前的蚊子配置文件:
pid_file /var/run/mosquitto.pid
persistence true
persistence_location /var/lib/mosquitto/
persistence_file mosquitto.db
log_dest syslog
log_dest stdout
log_dest topic
log_type error
log_type warning
log_type notice
log_type information
connection_messages true
log_timestamp true
password_file /etc/mosquitto/passwd
log_dest file /var/log/mosquitto/mosquitto.log
include_dir /etc/mosquitto/conf.d
allow_anonymous false
port 8883
cafile /etc/mosquitto/certs/ca.crt
keyfile /etc/mosquitto/certs/server.key
certfile /etc/mosquitto/certs/server.crt
require_certificate true
我使用此命令从测试PC订阅:
mosquitto_sub -h ha.euroicc.com -t "topic/test" -u "damjan" -P "damjan" -p 8883 --cafile ca.crt --key client.key --cert client.crt
并得到以下错误: 在测试PC上:
Error: A TLS error occurred.
在服务器上:
1532564086: OpenSSL Error: error:14089086:SSL
routines:ssl3_get_client_certificate:certificate verify failed
1532564086: Socket error on client <unknown>, disconnecting.
我尝试了在服务器端未设置 require_certificate 的情况,并且在这种情况下,未在客户端使用客户端密钥/证书和订阅正常。这意味着用户名/密码参数很好。
这意味着我要么生成有问题的证书和密钥,或者我的mosquitto.conf错误,要么我正在使用mosquitto_sub出现问题。也许还有其他东西吗?
我在这里真的很茫然,不知道下一步该怎么做... 每一点信息都会有所帮助。
答案 0 :(得分:1)
在升级到 2.0 时遇到了类似的问题,因为更新了 TLS/SSL 绑定,一些已知的弱算法不再受支持。
在我的例子中,证书的签名是 sha1WithRSAEncryption
,其中 sha1 是弱部分。例如,同样如此。 MD5。
使用 openssl x509 -text -noout -in your.crt
使用 sha256WithRSAEncryption
重新签署证书为我修复了它。
无需创建新密钥。
您可以根据现有密钥和证书信息创建新的 CSR:
openssl x509 -x509toreq -in sha1.crt -signkey sha1.key -out sha256-new.csr -sha256
或在再次签署现有 CSR 时覆盖算法:
openssl x509 -req -days 360 -in sha1.csr -CA DummyCA-DonotTrust.pem -CAkey DummyCA-DonotTrust.pem -CAcreateserial -out sha256.crt -sha256
最近的 openssl 版本应该默认使用 sha256。
Debian 已使用 openssl-1.1.1 更改默认设置,请参阅 https://wiki.debian.org/ContinuousIntegration/TriagingTips/openssl-1.1.1 并设置 CipherString = DEFAULT@SECLEVEL=2
。
要获取支持的算法列表,请运行:openssl ciphers -s -v 'ALL:@SECLEVEL=2'
答案 1 :(得分:0)
好,所以问题在于我正在测试PC上生成所有文件,然后将其发送到服务器。
我尝试在服务器上生成所有内容,然后将适当的文件复制到测试PC上,一切正常。
我一直关注http://rockingdlabs.dunmire.org/exercises-experiments/ssl-client-certs-to-secure-mqtt。更改较少,例如主机名等。
答案 2 :(得分:0)
我遇到了同样的问题。 要修复它,在生成 server.crt 时,使用将运行 Mqtt 代理的机器的 IP 地址回答问题“通用名称”。