結論
simplexml_load_file
を呼び出す前に下記のコードにて、stream_context
を設定してあげればいい。 なお、 'allow_self_signed'=> true
または'verify_peer' => false
のいずれかを設定すればOK。
1 | $context = stream_context_create(array('ssl'=>array( |
解説
PHP5.6以降において、OpenSSL関連の処理の変更がありました。
PHP: PHP 5.6.x における OpenSSL 関連の変更 - Manual
暗号化されたすべてのクライアントストリームで、ピア検証がデフォルトで有効になりました。 デフォルトでは、OpenSSL のデフォルト CA バンドルを使ってピア証明書を検証します。 たいていの場合は、正しい SSL 証明書を持つサーバーと通信するならこれを変更する必要はありません。 OpenSSL が、よく知られた CA バンドルを使うように設定されているからです。
そのため、自己署名証明書のURLに対して、simplexml_load_file
を実行するとfalse
が返ってくるようになりました。ステージング環境や、本番環境は正式なSSL証明書を使うので問題がないのですが、開発環境などで自己署名証明書を使う場合に困ってました。
あれこれ調べた結果、下記の2つの関数を使って事前にstream_context
を設定してあげれば許容することが出来るというのが分かりました。
PHP: libxml_set_streams_context - Manual
PHP: simplexml_load_file - Manual
PHPソースコードのチェック
php-5.6.36
該当ファイル ext/openssl/xp_ssl.c
該当関数 451 static int apply_peer_verification_policy(SSL *ssl, X509 *peer, php_stream *stream TSRMLS_DC)
1 | 463 must_verify_peer = GET_VER_OPT("verify_peer") |
verify_peer
の設定がfalse
でなければ、基本的にピア検証を行う。
php-5.5.38
該当ファイル ext/openssl/openssl.c
該当関数 4573 int php_openssl_apply_verification_policy(SSL *ssl, X509 *peer, php_stream *stream TSRMLS_DC)
1 | 4581 /* verification is turned off */ |
verify_peer
の設定がtrue
でなければ、ピア検証は行わない。
まとめ
5.6以上で、自己署名証明書を使った開発環境での simplexml_load_file
は
verify_peer
をfalse
-> php5.5 以前と同じ状態allow_self_signed
をtrue
-> 証明書のチェックを行うが、自己署名証明書をOKとする。
のどちらかで許容してあげることができます。
おまけ
5.6以降のPHP7.0, 7.1, 7.2で上記の設定について検証しましたが、問題なく動作しました。