uzullaがブログ

uzullaがブログです。

Azure App ServiceのPHPつかっていてcurlがSSLのエラーを吐くので対処

github.com

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が悪いのではなくてcurlhttps通信の検証が出来ないエラーです。

解決策

証明書を指定しましょう。これが自分で書いたコードなら

curl_setopt($c, CURLOPT_CAINFO, __DIR__.'cacert.pem');

みたいなことをかけばOKなんですが、今回はSDKの中なので、そういった雑なことはしたくない。

正しい解決策としては、curl.cainfophp.iniにかけばOKですね。ただ、このcurl.cainfoは置くだけでつかえる.user.iniでは指定できないPHP_INI_SYSTEMの範囲なので、もう一手間かけます。

公式ドキュメントにも記載があります。

azure.microsoft.com

上記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の話なので、それより前にすれば(げふん)