15

httpsURLにアクセスしようとするときに、PHP ストリーム コンテキストで TLSv1.0 を強制するにはどうすればよいですか?

私はこれに沿って何かを探しています:

$context = stream_context_create(
  array(
    'ssl' => array(
      'protocol_version' => 'tls1',
    ),
  ));
file_get_contents('https://example.com/test', false, $context);

バックグラウンド

実際、 PHPSoapClient. 残念ながら、接続しようとしているサーバーは SSLv3.0/TLSv1.0 のみをサポートしており、デフォルトの TLSv1.1 ネゴシエーションで失敗します。ssl://したがって、トランスポートのプロトコルを明示的に TLSv1.0に設定したいと思います。

4

4 に答える 4

19

PHP 5.6+ ユーザー

これは、 PHP 5.6 OpenSSL の変更ページに記載されている新しい機能です。

これを書いている時点では、PHP5.6 は Beta1 であり、あまり役に立ちません。未来の人々 - 幸運を祈ります!

未来は私たちにかかっています。PHP 5.6 は問題であり、その使用を奨励する必要があります。mysql_* 関数などのかなり広く使用されているものは非推奨となるため、アップグレードの際は注意が必要です。

他のみんな

@toubsenは彼の答えで正しいです-これは直接可能ではありません。彼が提案した回避策について詳しく説明すると、サプライヤーの API サーバーが TLSv1.2 をサポートされている TLSv1.0 に正しくネゴシエートしなかった問題を回避するときに、暗号の小さなサブセットを送信すると、ネゴシエーションが正しく完了するように見えました。ストリーム コンテキスト コードは次のとおりです。

$context = stream_context_create(
    [
        'ssl' => [
            'ciphers' => 'DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:AES256-SHA:KRB5-DES-CBC3-MD5:KRB5-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:EDH-DSS-DES-CBC3-SHA:DES-CBC3-SHA:DES-CBC3-MD5:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA:AES128-SHA:RC2-CBC-MD5:KRB5-RC4-MD5:KRB5-RC4-SHA:RC4-SHA:RC4-MD5:RC4-MD5:KRB5-DES-CBC-MD5:KRB5-DES-CBC-SHA:EDH-RSA-DES-CBC-SHA:EDH-DSS-DES-CBC-SHA:DES-CBC-SHA:DES-CBC-MD5:EXP-KRB5-RC2-CBC-MD5:EXP-KRB5-DES-CBC-MD5:EXP-KRB5-RC2-CBC-SHA:EXP-KRB5-DES-CBC-SHA:EXP-EDH-RSA-DES-CBC-SHA:EXP-EDH-DSS-DES-CBC-SHA:EXP-DES-CBC-SHA:EXP-RC2-CBC-MD5:EXP-RC2-CBC-MD5:EXP-KRB5-RC4-MD5:EXP-KRB5-RC4-SHA:EXP-RC4-MD5:EXP-RC4-MD5',
        ],
    ]
);

SOAP ユーザー

PHP の SOAP クライアントは curl を使用していませんstream_context_set_default。そのため、作成されたコンテキストは、次のように 2 番目のパラメーターで SOAPClient コンストラクターに渡す必要があります。

$soap_client = new SOAPClient('http://webservices.site.com/wsdlfile.wsdl', array('stream_context' => $context));

なぜそれらの暗号?

サーバーでコマンドopenssl ciphersを実行すると、サポートされている暗号のリストが上記の形式で表示されます。実行openssl ciphers -vすると、TLSv1.2 固有のものがわかります。上記のリストは、OpenSSL によって報告されたすべての非 TLSv1.2 暗号からコンパイルされました。

openssl ciphers -v | grep -v 'TLSv1.2' | cut -d ' ' -f 1 | tr "\n" ':'

于 2014-04-17T10:21:04.890 に答える
2

拠点情報

このフィールドprotocol_versionは HTTP コンテキスト (HTTP 1.0 と 1.1) でのみ有効ですが、SSL コンテキストには影響しません。

次のマニュアル ページには、PHP のすべてのストリーム コンテキスト オプションが一覧表示されています。 コンテキスト オプションとパラメータ

すべての SSL ベースのストリーム ラッパーでは、次のオプションのみを使用できます。 SSL コンテキスト オプション

考えられる解決策/回避策

最初のアドバイス: クライアントでこれを回避するのではなく、サーバー管理者にサーバーを修正してもらいます;-)

おそらく、SSLストリームのciphersオプションを使用して、ターゲットサーバーがサポートするリスト内の正確なTLSv1.0暗号スイート(TLSv1.0に固有)を1つだけ渡すことができます。

cURL を使用するように実装を切り替えることも、おそらくここでは役に立ちません。彼らのメーリング リストのエントリによると、特定の TLS バージョンを強制するオプションがないためです。クライアントは、必要に応じて自動的にダウングレードします。

tl;dr

私は現在、PHP からの SSL 接続に TLSv1.0 を明示的に強制する方法を知りません。

于 2013-11-19T13:29:55.293 に答える