AWS IoTにRubyのMQTTクライアントから接続しようとすると「SSL_connect returned=1 errno=0 state=error: certificate verify failed (unable to get local issuer certificate) (OpenSSL::SSL::SSLError)」になる

AWS IoTで証明書を作成し、これを使ってRubyのMQTTクライアントからAWS IoTに接続しようとするとエラーになる。

⦿ コード

$ vi mqtt.rb
require 'rubygems'
require 'mqtt'

client = MQTT::Client.connect(
           host: 'xxxxxxxxxxxxxx-ats.iot.ap-northeast-1.amazonaws.com',
           port: 8883,
           ssl: true,
           cert_file: '<AWS IoTで作成した「このモノの証明書」>',
           key_file: '<AWS IoTで作成した「プライベートキー」>',
           ca_file: '<AWS IoTの「ルートCA ダウンロード」のページから取得したルートCA証明書>')
:

⦿ 実行結果

$ ruby mqtt.rb
:
SSL_connect returned=1 errno=0 state=error: certificate verify failed (unable to get local issuer certificate) (OpenSSL::SSL::SSLError)

これは既にレガシー扱いになったVeriSign発行のルートCA証明書を使っているからであり、Amazon Trust Services発行のルートCA証明書を使えば問題なく動作する。

・ 関連資料・記事
[Amazon Web Services] AWS IoTでMQTTブローカーを作りArduinoからのセンシングデータをSNS通知する手順
[Amazon Web Services] AWS IoTでMQTTブローカーを作りArduinoからのセンシングデータをSNS通知する手順(AWS CLI編)

参考サイト

元記事はこちら

AWS IoTにRubyのMQTTクライアントから接続しようとすると「SSL_connect returned=1 errno=0 state=error: certificate verify failed (unable to get local issuer certificate) (OpenSSL::SSL::SSLError)」になる