Azure App ServiceのPHPつかっていてcurlがSSLのエラーを吐くので対処
LINEのMessaging APIをたたくSDKがあり、今これをつかったアプリをかいておりますが、Azure App Serviceでうごかしてみています。
で、App ServiceにはいってるPHPにはca証明書の指定がないようで、以下の様なエラーがでました。*1
PHP Fatal error: Uncaught LINE\LINEBot\Exception\CurlExecutionException: SSL certificate problem: unable to get local issuer certificate in D:\home\site\vendor\linecorp\line-bot-sdk\src\LINEBot\HTTPClient\CurlHTTPClient.php:110 Stack trace: #0 D:\home\site\vendor\linecorp\line-bot-sdk\src\LINEBot\HTTPClient\CurlHTTPClient.php(73): LINE\LINEBot\HTTPClient\CurlHTTPClient->sendRequest('POST', 'https://api.lin...', Array, Array) (以下略)
皆さんご存じでしょうが、これはSDKが悪いのではなくてcurlがhttps通信の検証が出来ないエラーです。
解決策
証明書を指定しましょう。これが自分で書いたコードなら
curl_setopt($c, CURLOPT_CAINFO, __DIR__.'cacert.pem');
みたいなことをかけばOKなんですが、今回はSDKの中なので、そういった雑なことはしたくない。
正しい解決策としては、curl.cainfo
をphp.iniにかけばOKですね。ただ、このcurl.cainfo
は置くだけでつかえる.user.ini
では指定できないPHP_INI_SYSTEM
の範囲なので、もう一手間かけます。
公式ドキュメントにも記載があります。
上記URLから抜粋すると、以下のような感じです。
1. アプリの設定 (キー PHP_INI_SCAN_DIR、値 d:\home\site\ini) を Web アプリに追加する 2. d:\home\site\ini ディレクトリに settings.ini ファイルを作成します。 3. 設定を settings.ini ファイルに追加します。たとえば curl.cainfo="%ProgramFiles(x86)%\Git\bin\curl-ca-bundle.crt" 4. 変更内容を読み込むには、Web アプリを再起動します。
ただ、やってみて午前四時の脳にウケたんですが、%ProgramFiles(x86)%\Git\bin\curl-ca-bundle.crt
これは無いです。
なので、d:\home\site
とかに
https://curl.haxx.se/ca/cacert.pem
をダウンロードして保存し、settings.php
には
curl.cainfo=d:\home\site\cacert.pem
などと記述しましょう。これで正しく通信できるはずです。
まとめ
PHP_INI_SYSTEMも変更できるAzure の App Service最高! これくらいは最初から設定されててほしいな!
こちらからは以上です。
*1:これは多分PHP7の話なので、それより前にすれば(げふん)