内容は随時更新します。
突っ込みや、追加の情報あればコメント・編集リクエストいただけれれば幸いです。
このページでは、PHP プログラムから外部のサーバにセキュア接続するケースについてまとめていきます。
クライアントからの接続を待ち受けるケースについては、この記事には記載しません。
POODLE 対応においては、SSL v2, SSL v3 以下による接続を無効化することになるので、そういった対応を行った際に影響を受けるケース/受けないケースについてまとめます。
影響を受けるケース
fsockopen() で ssl://, sslv2://, sslv3:// を使ってホストを指定した場合
fsockopen()
関数では第一引数の $hostname
に URL スキームを付加することで、トランスポート方式を選択できます。
トランスポート方式の指定については以下のマニュアルがあります。
PHP: Internet ドメイン: TCP、UDP、SSL、および TLS - Manual
ssl:// は SSL V2 での接続を試みます。 あるいはリモートホストの設定によっては SSL V3 での接続を試みます。 sslv2:// および sslv3:// は、SSL V2 と SSL V3 のどちらのプロトコルを 使用するかを明示的に指定します。
というわけで、少なくとも ssl://
, sslv2://
, sslv3://
を使用した場合は確実に影響を受けるようです。
(tls:// なら本当に影響を受けないのか、またシームレスに移行できるのか、については調査中)
ストリームラッパーで https を指定した場合
PHP はファイルシステム関数で https:// を指定することで https で URL にアクセスすることができます。
PHP 5.6 からは、ストリームラッパーのコンテキストオプションで SSL/TLS のバージョンを選択できます。
PHP: PHP 5.6.x における OpenSSL 関連の変更 - Manual
<?php
stream_context_set_default([
'ssl' => [
'crypto_method' => STREAM_CRYPTO_METHOD_TLS_CLIENT,
],
]);
echo file_get_contents('https://www.google.com/');
以下のようにすると使用された SSL/TLS のバージョンが確認できます。
<?php
stream_context_set_default([
'ssl' => [
'crypto_method' => STREAM_CRYPTO_METHOD_TLS_CLIENT,
'capture_session_meta' => true,
],
]);
file_get_contents('https://www.google.com/');
$ctx = stream_context_get_default();
$meta = stream_context_get_options($ctx);
var_dump($meta['ssl']['session_meta']['protocol']);
デフォルトでより上位のバージョンが選択されるので、サーバが脆弱でなければ大丈夫です。
皆様からの情報をお待ちしてます。