使用SSL / TLS的Mosquitto MQTT代理和Java客户端

3
我正在使用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。但是如何实现?

有人能帮帮我吗? 提前感谢! 和平

1个回答

6
这里有几个要点。
首先,你应该考虑生成正确的证书。如文档所述,生产环境中不应使用 --insecure,因此值得关注。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。根据 这个问题,您至少需要 IBM JRE 6/7 或 Oracle JRE/OpenJDK 7 才能支持 TLSv1.2。尝试在所有地方使用 TLSv1,以确保您的 Java 代码没有其他问题。您可以通过在配置文件中使用选项 tls_version tlsv1 来配置 mosquitto 使用 TLSv1,就在您定义服务器证书的地方。
TLS 和 SSL 术语经常互换使用。除了指旧协议版本时,SSL 实际上不应再使用,但它已经固定下来了,当人们说 SSL 时,他们通常是指 TLS。

好的,我会检查一下并希望能够提供解决方案。我的JRE存在问题,因为我必须使用1.4版本,但是由于它安装在专用移动设备上,我无法进行更新... - marrrschine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接