繁体   English   中英

mosquitto MQTT代理和具有SSL / TLS的Java客户端

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM