web-dev-qa-db-ja.com

PHP SoapClientで証明書の検証を無効にします

概要:
ビルトインのSoapClientクラスをPHP=で強制的にHTTPS経由で無効な証明書を持つサーバーに接続する方法はありますか?

なぜそれをしたいのですか?
DNSエントリまたは証明書がまだないサーバーに新しいアプリケーションを展開しました。 SoapClientbeforeでDNSエントリを設定し、証明書を修正して、それに接続してみてください。これを行う最も合理的な方法はテスト中にクライアントに証明書を無視させるだけです。

これが大きなセキュリティリスクであることに気づきませんか?
これはテスト専用です。サービスが実稼働に入ると、有効な証明書が配置され、クライアントはそれを検証するように強制されます。

56
MW.

SoapClient は、パラメータでstream contextを取ります。これは、自分で作成できます。これにより、トランスポートレイヤーのほぼすべての側面を制御できます。

$context = stream_context_create([
    'ssl' => [
        // set some SSL/TLS specific options
        'verify_peer' => false,
        'verify_peer_name' => false,
        'allow_self_signed' => true
    ]
]);

$client  = new SoapClient(null, [
    'location' => 'https://...',
    'uri' => '...', 
    'stream_context' => $context
]);

ドキュメンテーション:

94
Kaii

受け入れられた答えは機能しますが、非WSDLモードでのみです。これを[〜#〜] wsdl [〜#〜]モードで使用しようとすると(つまり、最初の引数としてWSDLファイルのURLを渡します) )WSDLファイルをダウンロードするときにストリームコンテキストが無視されるという事実に直面します。そのため、WSDLファイルが壊れた証明書を持つサーバーにもある場合、失敗し、ほとんどの場合メッセージfailed to load external entityをスローします。詳細は here および here をご覧ください。

提案されているように、最も簡単な方法は、WSDLファイルを手動でダウンロードし、ローカルコピーをSoapClientに渡すことです。たとえば、受け入れられた回答からまったく同じストリームコンテキストを使用して、file_get_contentsでダウンロードできます。

SoapServerを作成するときにもこれを行う必要があることに注意してください。

12
tobik

PHP 5.6.8の正しいリストは

'ssl' => array('verify_peer_name'=>false, 'allow_self_signed' => true),
3
Will T