##やろうとしていること
AWSに公開されている、次の記事の内容を試しています。
https://aws.amazon.com/jp/blogs/news/how-to-implement-mqtt-with-tls-client-authentication-on-port-443-from-client-devices-python/
サンプルプログラムを使って、MQTT Publishテストを行いたいです。
##試したこと
①前提条件のチェック
OpenSSL 1.1.1d 10 Sep 2019
Python version 2.7.16
②証明書作成
rootCA.pem
hogehoge-certificate.pem.crt
hogehoge-private.pem.key
③証明書の有効化
④ポリシーをアタッチ
④動作確認(MQTTのPublish)
プログラムを実行すると、次のエラーが発生してしまいます。
connect successが表示されないので、接続エラーが発生していると思うのですが、
原因が分からず困っております。
text
1pi@raspberrypi:~/dev/aws/pub $ python alpn_mqtt.py 22020-01-21 11:11:30,045 - root - INFO - open ssl version:OpenSSL 1.1.1d 10 Sep 2019 32020-01-21 11:11:30,051 - root - INFO - start connect 42020-01-21 11:14:30,351 - root - ERROR - exception main() 52020-01-21 11:14:30,351 - root - ERROR - e obj:{} 62020-01-21 11:14:30,352 - root - ERROR - message: 7Traceback (most recent call last): 8 File "alpn_mqtt.py", line 45, in <module> 9 mqttc.connect(aws_iot_endpoint, port=443) 10 File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 937, in connect 11 return self.reconnect() 12 File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 1071, in reconnect 13 sock = self._create_socket_connection() 14 File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 3522, in _create_socket_connection 15 return socket.create_connection(addr, source_address=source, timeout=self._keepalive) 16 File "/usr/lib/python2.7/socket.py", line 575, in create_connection 17 raise err 18error: [Errno 101] Network is unreachable
##プログラムコード
python
1from __future__ import print_function 2import sys 3import ssl 4import time 5import datetime 6import logging, traceback 7import paho.mqtt.client as mqtt 8 9IoT_protocol_name = "x-amzn-mqtt-ca" 10aws_iot_endpoint = "hogehoge" # <random>.iot.<region>.amazonaws.com 11url = "https://{}".format(aws_iot_endpoint) 12 13ca = "YOUR/ROOT/CA/PATH" 14cert = "YOUR/DEVICE/CERT/PATH" 15private = "YOUR/DEVICE/KEY/PATH" 16 17logger = logging.getLogger() 18logger.setLevel(logging.DEBUG) 19handler = logging.StreamHandler(sys.stdout) 20log_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') 21handler.setFormatter(log_format) 22logger.addHandler(handler) 23 24def ssl_alpn(): 25 try: 26 #debug print opnessl version 27 logger.info("open ssl version:{}".format(ssl.OPENSSL_VERSION)) 28 ssl_context = ssl.create_default_context() 29 ssl_context.set_alpn_protocols([IoT_protocol_name]) 30 ssl_context.load_verify_locations(cafile=ca) 31 ssl_context.load_cert_chain(certfile=cert, keyfile=private) 32 33 return ssl_context 34 except Exception as e: 35 print("exception ssl_alpn()") 36 raise e 37 38if __name__ == '__main__': 39 topic = "test/date" 40 try: 41 mqttc = mqtt.Client() 42 ssl_context= ssl_alpn() 43 mqttc.tls_set_context(context=ssl_context) 44 logger.info("start connect") 45 mqttc.connect(aws_iot_endpoint, port=443) 46 logger.info("connect success") 47 mqttc.loop_start() 48 49 while True: 50 now = datetime.datetime.now().strftime('%Y-%m-%dT%H:%M:%S') 51 logger.info("try to publish:{}".format(now)) 52 mqttc.publish(topic, now) 53 time.sleep(1) 54 55 except Exception as e: 56 logger.error("exception main()") 57 logger.error("e obj:{}".format(vars(e))) 58 logger.error("message:{}".format(e.message)) 59 traceback.print_exc(file=sys.stdout)
あなたの回答
tips
プレビュー