4

PHP SOAPクライアントを使用してSOAPサービスを利用しようとしていますが、次のメッセージが表示されて失敗します。

SoapFault: SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://domain.com/webservice.asmx?wsdl' : failed to load external entity "https://domain.com/webservice.asmx?wsdl"\n in /Users/andrewdchancox/Projects/test/testsoap.php on line 10

wsdlファイルをダウンロードし、apacheのローカルインスタンスから提供しましたが、問題なく読み込まれます。私が考えることができる唯一のことは、Webサービスが自己署名証明書を使用してSSLで実行されていることです-wsdlを取得すると、次のエラーが発生します:

--2012-09-11 16:28:39--
https://domain.com/webservice.asmx?wsdl
Resolving domain.com (domain.com)... 11.111.111.11
Connecting to domain.com (domain.com)|11.111.111.11|:443... connected.
ERROR: The certificate of ‘domain.com’ is not trusted.
ERROR: The certificate of ‘domain.com’ hasn't got a known issuer.

私はグーグルで検索し、PHP SOAPクライアントのPHPドキュメント(http://php.net/manual/en/class.soapclient.phpとそのコンストラクター)を完全に読みました-http: //www.php.net/manual/ en / soapclient.soapclient.phpで、役立つものが見つかりませんでした。

誰かアイデアがありますか?

4

1 に答える 1

6

これは2年前のことですが、答えに値すると思います。

PHPのSoapClientクラスは、PHPストリームを使用してHTTP経由で通信します。さまざまな理由で、SSL over PHPストリームは安全ではありません1が、この場合の問題は、安全すぎることです。

ソリューションに向けた最初のステップはstream_context、SoapClient2を構築するときにオプションを使用することです。これにより、より高度なSSL設定を指定できるようになります3

// Taken from note 1 below.
$contextOptions = array(
    'ssl' => array(
        'verify_peer'   => true,
        'cafile'        => '/etc/ssl/certs/ca-certificates.crt',
        'verify_depth'  => 5,
        'CN_match'      => 'api.twitter.com',
        'disable_compression' => true,
        'SNI_enabled'         => true,
        'ciphers'             => 'ALL!EXPORT!EXPORT40!EXPORT56!aNULL!LOW!RC4'
    )
);
$sslContext = stream_context_create($contextOptions);
// Then use this context when creating your SoapClient.
$soap = new SoapClient('https://domain.com/webservice.asmx?wsdl', array('stream_context' => $sslContext));

この問題の理想的な解決策は、独自のCA証明書を作成し、それを使用してSSL証明書に署名し、CA証明書をに追加することcafileです。不正なCAがドメインの誰かの証明書に署名するのを避けるために、その証明書だけをに含める方がよいかもしれませんが、それが常に実用的であるとは限りません。cafile

実行していることが安全である必要がない場合(テスト中など)、ストリームコンテキストでSSL設定を使用して、接続のセキュリティを低下させることもできます。このオプションallow_self_signedでは、自己署名証明書が許可されます。

$contextOptions = array(
    'ssl' => array(
        'allow_self_signed' => true,
    )
);
$sslContext = stream_context_create($contextOptions);
$soap = new SoapClient('https://domain.com/webservice.asmx?wsdl', array('stream_context' => $sslContext));

リンク:

  1. ディープエンドを生き残る:PHPセキュリティ-トランスポート層セキュリティ(HTTPS、SSL、およびTLS)-PHPストリーム
  2. PHP:SoapClient :: SoapClient
  3. PHP:SSLコンテキストオプション
于 2014-12-10T16:22:25.543 に答える