首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用paho传递crt/pem

用paho传递crt/pem
EN

Stack Overflow用户
提问于 2016-03-09 03:37:56
回答 2查看 8K关注 0票数 2
代码语言:javascript
复制
import paho.mqtt.publish as mqtt
import paho.mqtt.client as mqttclient  
topic = "Some/Topic/Goes/Here"
my_ca_cert = open("<path_to_cert>\ca.crt", 'rb').read()
my_pri_cert = open("<path_to_cert>\private.pem", 'rb').read()
my_key_cert = open("<path_to_cert>\certificate.pem", 'rb').read()

mqttc = mqttclient.Client("Python_Ex_Pub")
mqttc.tls_set(my_ca_cert, certfile=my_pri_cert, keyfile=my_key_cert)
mqttc.connect("<gateway_address>", 8883)
mqttc.publish(topic_name, "This is a test pub from Python.")
mqttc.loop(timeout=2.0, max_packets=1)

当我运行脚本时,抛出了以下错误:

代码语言:javascript
复制
Traceback (most recent call last):
  File "mqtt_pub_test.py", line 9, in <module>
    mqttc.tls_set(my_ca_cert, certfile=my_pri_cert, keyfile=my_key_cert)
  File "C:\Python27\lib\site-packages\paho\mqtt\client.py", line 557, in tls_set

    raise IOError(ca_certs+": "+err.strerror)
IOError: -----BEGIN CERTIFICATE-----
<cert_info_here>
-----END CERTIFICATE-----: No such file or directory

我通读了paho文档页面上的TLS示例,但就是不明白我应该如何在代码中传递crt / pem文件。有一次,我只指向了包含文件的文件夹,甚至到了chmod 777这个文件夹,但在这一点上,我在运行时被python拒绝访问。

任何帮助都会被附注

EN

回答 2

Stack Overflow用户

发布于 2016-10-28 03:29:44

您是否希望进行TLS客户端身份验证(即,您的Python脚本需要向服务器/ MQTT代理进行身份验证)?或者,您是否希望Python脚本的行为像web浏览器一样,并且只验证服务器证书?

如果您只需要后者,我已经成功地在Paho Python客户机中使用了tls_set()方法,当我将它指向一个包含服务器证书的PEM文件时。这是您需要在tls_set()上传递的惟一参数,以便让Paho客户端验证服务器证书,并使用TLS连接到代理。例如:

代码语言:javascript
复制
mqttc.tls_set("/home/bob/certificates/mqttbrokercertificate.pem")

如何获取PEM格式的mqtt broker证书?

代码语言:javascript
复制
openssl s_client -host mqtt.broker.hostname.com -port 8883 -showcerts

将输出重定向到一个文件,并删除文件中除"BEGIN CERTIFICATE“和"END CERTIFICATE”行之间的所有行(包括--请确保也包括这些行)。这是StackOverflow上关于如何使用openssl保存服务器的SSL证书的一篇好文章:

How to save server SSL certificate to a file

最后,您需要确保您的代理支持哪个版本的TLS,并确保您的Python客户端也支持它。例如,IBM Watson IoT平台需要TLS1.2。Python 2.7中的ssl模块(基于openssl构建)不支持TLS 1.2。通常,您需要Python 3.X,openssl至少为1.0.1。下面是如何在Paho客户端上设置TLS版本(不要忘记导入ssl):

代码语言:javascript
复制
 mqttc.tls_set("/home/bob/certificates/mqttbrokercertificate.pem", tls_version=ssl.PROTOCOL_TLSv1_2)

如果您想要TLS客户端身份验证,最好在另一篇文章中进行处理。但我希望这对使用Paho Python客户端进行TLS服务器身份验证有帮助。

票数 3
EN

Stack Overflow用户

发布于 2016-03-09 13:34:31

从错误中可以看出,tls_set函数希望传入的是文件的路径,而不是文件的内容。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35876516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档