Mosquitto SSL证书验证失败

时间:2018-11-06 10:06:13

标签: ssl openssl mosquitto

我正在测试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出现问题。也许还有其他东西吗?

我在这里真的很茫然,不知道下一步该怎么做... 每一点信息都会有所帮助。

3 个答案:

答案 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 地址回答问题“通用名称”。