[英]Issues connecting to mosquitto broker with node mqtt client via SSL/TLS
[英]mosquitto MQTT broker and Java client with SSL / TLS
我正在使用mosquitto和Eclipse PAHO Java客户端。
在普通的TCP套接字上,一切正常。 但是现在我想使用SSL进行认证(不一定需要加密)。
首先,我按照http://mosquitto.org/man/mosquitto-tls-7.html中的说明进行操作
在mosquitto客户端中,如果没有--insecure选项,我将无法发布消息,这意味着我必须
mosquitto_pub -h <server-ip> -p <port> -t "/topic1/test" -m "testmsg" --cafile ca_cert.pem --cert client.crt --key client_priv.key --tls-version tlsv1.2 --insecure
否则 ,mosquitto控制台上会出现协议错误,提示
1379576698: OpenSSL Error: error:14094416:SSL routines:SSL3_READ_BYTES:sslv3 alert certificate unknown
1379576698: OpenSSL Error: error:140940E5:SSL routines:SSL3_READ_BYTES:ssl handshake failure
1379576698: Socket read error on client (null), disconnecting.
-不安全意味着不检查服务器证书主机名是否与远程主机名匹配。
对我来说有点奇怪的是,我正在尝试使用TLS,但是代理使用SSL进行响应。
但是我试图在我的Java paho客户端中启用SSL支持,我坚持这里的示例: https ://gist.github.com/sharonbn/4104301
如您在示例中看到的,
SSLContext context = SSLContext.getInstance("TLSv1")
这是否意味着我正在尝试连接TLSv1,对吗? 不幸的是我得到了
javax.net.ssl.SSLHandshakeException: message_unknown
我尝试切换到TLSv1.2(因为它已经在mosquitto_pub中为我工作了),并通过
SSLContext context = SSLContext.getInstance("TLSv1.2")
但后来我得到了
NoSuchAlgorithmException: Unknown protocol: TLSv1.2
我不知道哪一方应该是未知的...
顺便说一句:如果我愿意
mosquitto_pub -h <server-ip> -p <port> -t "/topic1/test" -m "testmsg" --cafile ca_cert.pem --cert client.crt --key client_priv.key --tls-version tlsv1 --insecure
结果是
1379595808: OpenSSL Error: error:1408A10B:SSL routines:SSL3_GET_CLIENT_HELLO:wrong version number
1379595808: Socket read error on client (null), disconnecting.
如果我在Java客户端中尝试也一样
1379595995: OpenSSL Error: error:1408A10B:SSL routines:SSL3_GET_CLIENT_HELLO:wrong version number
1379595995: Socket read error on client (null), disconnecting.
所以我想我必须在Java客户端上使用/启用tlsv1.2。 但是如何?
有人可以帮助我吗? 在此先多谢! 和平
这里有几点。
首先,您应该查看生成正确的证书。 如文档所述,-不安全不应该在生产中使用,因此值得重点关注。 mosquitto-tls中的示例非常基础。 如果遵循该过程,则必须将服务器证书的commonName设置为与服务器的主机名匹配。 如果要在本地计算机上进行测试,请使用commonName = localhost。 我不能太强调使用--insecure使得使用TLS基本毫无意义。 创建证书的一种更好的方法是添加一些subjectAltName条目,以定义哪些主机名和/或IP地址对该证书有效。 https://github.com/binarybucks/mqttitude/blob/master/tools/TLS/generate-CA.sh中提供了使用此功能生成证书的示例。 请注意,您需要使用mosquitto 1.2.1才能正常工作。 。
进入TLS版本问题。 听起来非常像您的JRE不支持TLSv1.2。 根据此问题,您至少需要针对TLSv1.2的IBM JRE 6/7或Oracle JRE / OpenJDK 7。 尝试在各处使用TLSv1,以确保Java代码在其他地方没有问题。 通过在配置文件中的定义服务器证书的位置使用选项tls_version tlsv1
,可以将mosquitto配置为使用TLSv1。
术语TLS和SSL经常互换使用。 除了引用旧协议版本时,实际上不应再使用SSL,但是SSL一直存在,当人们说SSL时,它们通常表示TLS。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.