cUrlやGuzzleで外部のAPIを利用するアプリケーションをAzure WebAppで動かした場合、証明書が見つからずAPIにHTTPSで接続できない問題が発生します。
HTTPSアクセスする際のSSL証明書の場所は、php.iniのcurl.cainfoに設定しますが、Azure Web Appではd:\home\site\ini/settings.ini
ファイルで設定できます。
公式ドキュメントは、Azure App Service Web Apps での PHP の構成方法の
「PHP_INI_SYSTEM 構成設定の変更」を参照ください。
settings.iniの場所をアプリ設定で指定
[アプリケーション設定] > [アプリの設定]に、キー PHP_INI_SCAN_DIR
、値 d:\home\site\ini
を追加します。
Kudu コンソールでsettings.iniファイルを作成
Kuduコンソールは、Web AppのURLが https://testguzzle.scm.azurewebsites.net/
出会った場合、https://testguzzle.scm.azurewebsites.net/
でアクセスできます。
以下のようにKuduコンソールが表示されたら、[Debug console] > [CMD]を選択します。
以下のように、Web Appのディレクトリ構成と、コンソールが表示されます。
ディレクトリ[site]を選択して、[+] > [New folder]を選択して、ini
フォルダを作成します。
フォルダ名に、ini
と入力します。
作成したsite
フォルダに、settings.ini
ファイルを作成します。
[+] > [New file]を選択します。
settings.ini
と入力します。
作成されたファイルの編集アイコンをクリックすると、エディタが開くので以下の内容を入力します。
; D:\homesite\init\settings.ini
; Example Settings
curl.cainfo="D:/Program Files (x86)/Git/usr/ssl/certs/ca-bundle.crt"
証明書のパスは、公式ドキュメントとは異なります。Gitは入っているので都度確認した方が良いかもしれません。
画面は以下のような感じ。
3. Web Appを再起動
Web Appを再起動するとHTTPSアクセスが可能になります。
サンプルで確認
今回の設定で実行になるのは以下のようなコードです。
curlの例
<?php
$ch = curl_init("https://www.example.com");
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_exec($ch);
curl_close($ch);
Guzzleの例
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client(['timeout' => 2.0]);
$response = $client->get('https://www.example.com/', ['stream' => true]);
$body = $response->getBody();
// Implicitly cast the body to a string and echo it
while (!$body->eof()) {
echo $body->read(1024);
}
?>
※ ファイル権限エラーが出たので、streamオプションを指定して回避しています。
sinkの設定した場合は、フォルダのパーミッションがよくわからず。。。
参考
http://tech.guitarrapc.com/entry/2015/09/09/031236#Kudu-による状態確認
付録
Composerは、[拡張機能] > [+追加]からインストールできます。
Composerを追加後は、Git push後Composerのinstallが実行されるようになります。