Python Eclipse Paho 客户端 - 与 MQTT 代理的 TLS 连接异常 : No ciphers available

标签 python ssl mqtt paho

我正在尝试使用 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 版本所致?我现在有点迷失,也许有人知道如何解决这个问题。

编辑:我自己让它工作,但仍然不确定为什么现在它能工作。

  1. 已更改context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
  2. 已更改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/

相关文章:

javascript - 如何在 Javascript 中访问 JSON 对象的键?

python - 结合 node.js 和 Python

python - 如何获取列表列表中可能对的列表 - python

ssl - Kafka安全实现问题SASL SSL和SCRAM

c# - 无法使用 HttpWebRequest 下载某些 https 主页

javascript - MQTT Javascript

javascript - 如何从 json-schema 创建表单?

python - 如何使用 docker-py (docker SDK) 将文件从主机复制到容器

java - 临时 RSA key 与临时 DH key ?

node.js - Node js setinterval 在连接时无法与 mqtt 客户端一起使用