背景
PHPからプログラムでAPIを扱う際に、ところどころ重要な情報を通信する必要があり、どう考えても平文でやり取りするのは危険なのでHTTPSを使うことにする。Google先生で調べながら、XAMPPでPHPのSSL設定を行ったが、エラーが出て苦戦した。エラーの修復も含めて、PHP5.6、XAMPPでHTTPS通信を行う方法を書く。
環境
PHP:5.6
OS :Mac OS X
WEBサーバー: Apache(XAMPP)
PHP,HTTPSでGoogle検索すると・・・大抵以下の設定についてでてきます。
php.iniで以下の文を記述する
(▼以下の文を新規追加、もしくは頭のセミコロンをはずす)
extension=php_openssl.dll
...
...
...
(▼新規追加、もしくは頭のセミコロンをはずす)
allow_url_fopen = On
上記の2行をアクティブにしてください。そうするとHTTPSが許可されるはずです。
具体的な行の意味等は以下を参考にしてください。
→ http://hhelibex.hatenablog.jp/entry/20111225/1324794331
しかし、上記設定ではエラーが起こります。
実行したHTTPS通信のプログラムは以下の通りです。
require_once('./util/phpQuery-onefile.php');
$html = file_get_contents('https://www.google.co.jp');
$doc = phpQuery::newDocument($html);
echo $doc["title"]->text();
コードはスクレイピングをするためのもので、
こちらを参考にしています。
このコードを実行すると、
ERROR:certificate verify failed
というSSL証明書のエラーが発生しました。
SSL証明書を別途用意する必要がある
SSL証明書は、Macの私の環境では、
/xamppfiles/etc/ssl.crt/server.crt に置いてありました。
このファイルが有効期限切れかどうか確かめたかったのですが、確かめ方がよく分からなかったので、断念。
新たに別のところから用意することに。
SSL証明書の用意
curl https://curl.haxx.se/ca/cacert.pem
上記を実行すると、証明書の中身がターミナルに表示されるので、
それを新たなテキストファイルにコピペして、ca-bundle-curl.crtというファイル名にしました。
元の証明書があった/xamppfiles/etc/ssl.crt/にca-bundle-curl.crtを格納し、
php.iniに以下を追記します。
curl.cainfo = /Applications/XAMPP/xamppfiles/etc/ssl.crt/ca-bundle-curl.crt
openssl.cafile = /Applications/XAMPP/xamppfiles/etc/ssl.crt/ca-bundle-curl.crt
これで有効なSSL証明書が更新されました。
上述のプログラムを実行するとしっかりとGoogleのタイトルが表示されます。
証明書の取得で参考にしたページは
ComposerからLaravelを導入しようとしてOpenSSL周りのエラーで困った件です。
今回の症状はPHP5.5以下だと起こらないようですね。
5.6以上の話になるようです。細かい要因等は割愛。
以上。