我正在尝试使用 eclipse paho 客户端的 python 实现创建到 TLS (TLSv1) 安全 MQTT 代理(启用了 MQTT 插件的 Rabbitmq)的连接。对于基于 paho 的 java 实现的 MQTTFX 应用程序,同样可以正常工作。为此,我使用自签名证书。
Java version uses:
CA-File: ca_certificate.crt
Client Certificate client_cert.crt
Client Key File: client_key.key
Python Version should use:
CA-File: ca_certificate.pem
Client Certificate: client_cert.pem
Client key file: client_key.key
我尝试建立这样的连接:
import ssl
import paho.mqtt.client as paho
# Locations of CA Authority, client certificate and client key file
ca_cert = "ca_certificate.pem"
client_cert = "client_certificate.pem"
client_key = "client_key.pem"
# Create ssl context with TLSv1
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
context.load_verify_locations(ca_cert)
context.load_cert_chain(client_cert, client_key)
# Alternative to using ssl context but throws the exact same error
# client.tls_set(ca_certs=ca_cert, certfile=client_cert, keyfile=client_key, tls_version=ssl.PROTOCOL_TLSv1)
client = paho.Client()
client.username_pw_set(username="USER", password="PASSWORD")
client.tls_set_context(context)
client.tls_insecure_set(False)
client.connect_async(host="HOSTNAME", port="PORT")
client.loop_forever()
这会导致以下错误:
ssl.SSLError: [SSL: NO_CIPHERS_AVAILABLE] no ciphers available (_ssl.c:997)
我是否需要显式传递代理支持的密码,或者可能是由于较旧的 openssl 版本所致?我现在有点迷失,也许有人知道如何解决这个问题。
编辑:我自己让它工作,但仍然不确定为什么现在它能工作。
- 已更改
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
到context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
- 已更改
client.tls_insecure_set(False)
到client.tls_insecure_set(True)
最佳答案
PROTOCOL_TLSv1
强制客户端仅使用旧的 TLS v1.0,除非您明确强制您的代理仅使用不太可能匹配的相同版本。
使用PROTOCOL_TLS_CLIENT
将允许Python在整个TLS v1.0到TLS v1.3范围内进行协商,直到找到客户端和代理都支持的一个。
如果不了解有关代理使用的证书的更多信息,则很难回答为什么必须设置client.tls_insecure_set(True)
。它是否包含与您用于连接的 HOSTNAME
相匹配的 CA/SAN 条目? documentation表示它将明确强制执行主机名检查。
ssl.PROTOCOL_TLS_CLIENT
Auto-negotiate the highest protocol version that both the client and server support, and configure the context client-side connections. The protocol enables CERT_REQUIRED and check_hostname by default.
关于Python Eclipse Paho 客户端 - 与 MQTT 代理的 TLS 连接异常 : No ciphers available,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71574569/