ESP32電子工作ファンのブログ

ESP32を使った電子工作の話題。その他備忘録など。

Macを使ってSSL化しているWebサイトのルート証明書をpem形式で保存する方法

現在、ESP32を使ってYahoo!の気象情報APIを使いたいなぁと思っています。
developer.yahoo.co.jp

Arduino core for the ESP32を使っているので、YahooのWebAPIにアクセスするにはWifiClientSecureライブラリを使います。
色々調べると、YahooのWebAPIは常時SSLになっています。WifiClientSecureを使うにはサイトのルート証明書のデータを設定しなければなりません。

Macを使ってSSL化しているWebサイトのルート証明書をpem形式で保存する方法

f:id:riraosan:20190608155747j:plain

  • デベロッパーツールから「Security」を選択する
  • Securityから「View certificate」ボタンを押下する

f:id:riraosan:20190608155917j:plain

  • 「Baltimore CyberTrust Root」から発行されていることを確認

f:id:riraosan:20190608160006j:plain

  • 「キーチェーン」を起動して「Baltimore CyberTrust Root」を検索
  • 「Baltimore CyberTrust Root」のコンテキストメニューを表示して、「"Baltimore CyberTrust Root"を書き出す...」を選択

f:id:riraosan:20190608160029j:plain

  • フォーマットを「pem形式」に変更

f:id:riraosan:20190608160053j:plain

  • 保存ボタンを押下する

→ファイルの中身はbase64エンコードされている。

f:id:riraosan:20190608160145p:plain

こいつをソースコードに埋め込んでWifiClientSecureライブラリに渡してやるとSSL通信が出来ます。

const char* yahooapi_root_ca= \
     "-----BEGIN CERTIFICATE-----\n" \
     "MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ\n" \
     "RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD\n" \
     "VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX\n" \
     "DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y\n" \
     "ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy\n" \
     "VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr\n" \
     "mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr\n" \
     "IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK\n" \
     "mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu\n" \
     "XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy\n" \
     "dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye\n" \
     "jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1\n" \
     "BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3\n" \
     "DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92\n" \
     "9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx\n" \
     "jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0\n" \
     "Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz\n" \
     "ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS\n" \
     "R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp\n" \
     "-----END CERTIFICATE-----\n";
WiFiClientSecure client;

setup(){
   client.setCACert(yahooapi_root_ca);