2016-12-28 31 views
2

私は、ネット上のWebサービスのために石鹸を使ってPHPでクライアントを作っています。 webserviceはhttpsで自己署名証明書を使用して実行されますが、テストではこの証明書をインストールせずに信頼する必要があります。PHP Soap SSL自分で署名した証明書を信頼する方法

SOAP-ERROR::WSDLの解析:

問題は、私はオールウェイズこのエラーが出るということは 'https://winsystemsintl.com:54904/PSAService.svc?wsdl' からロードできませんでした:外部エンティティ "https://winsystemsintl.com:54904/PSAService.svc?wsdl" をロードできませんでした。ここで

は私のコードです:

$opts = [ 
     'ssl' => [ 
      // set some SSL/TLS specific options 
      'verify_peer' => false, 
      'verify_peer_name' => false, 
      'allow_self_signed' => true 
     ], 
     'http'=>[ 
      'user_agent' => 'PHPSoapClient' 
     ] 
    ]; 

    // Initialize Soap Client 
    $this->client = new SoapClient($this->wsdl, array('ssl_method' => SOAP_SSL_METHOD_SSLv3,'soap_version' => SOAP_1_2, 'location' => 'https://winsystemsintl.com:54904/PSAService.svc','stream_context' => stream_context_create($opts), 'exceptions' => true, 'trace' => true)); 

私はwgetのでWSDLを取得することができた:

wgetの--secure-プロトコル= SSLv3のhttps://winsystemsintl.com:54904/PSAService.svc?wsdl --no-チェック-証明書

誰かが私に助けてくれることを願っています。

答えて

1

WSDLファイルをダウンロードするときにPHPがストリームコンテキストを無視するという問題があります。この問題を回避するには、WSDLファイルをダウンロードすることで、ローカルファイルシステム(私はかなりXMLを印刷するには、ここtidyを使用しています)へのすべてのスキーマをインポート:

wget --secure-protocol=SSLv3 https://winsystemsintl.com:54904/PSAService.svc?wsdl --no-check-certificate -O - | tidy -xml -indent > PSAService.svc?wsdl 
wget --secure-protocol=SSLv3 https://winsystemsintl.com:54904/PSAService.svc?xsd=xsd0 --no-check-certificate -O - | tidy -xml -indent > PSAService.svc?xsd=xsd0 
wget --secure-protocol=SSLv3 https://winsystemsintl.com:54904/PSAService.svc?xsd=xsd1 --no-check-certificate -O - | tidy -xml -indent > PSAService.svc?xsd=xsd1 
wget --secure-protocol=SSLv3 https://winsystemsintl.com:54904/PSAService.svc?xsd=xsd2 --no-check-certificate -O - | tidy -xml -indent > PSAService.svc?xsd=xsd2 
wget --secure-protocol=SSLv3 https://winsystemsintl.com:54904/PSAService.svc?xsd=xsd3 --no-check-certificate -O - | tidy -xml -indent > PSAService.svc?xsd=xsd3 

次に、あなたはPSAService.svc?wsdl(ファイル名を編集する必要がそのwgetは保存されます)、Webではなくローカルシステムを指すようにインポートを変更します。あなたの好きなエディタで置き換え、すべての機能を使用して置き換える'https://winsystemsintl.com:54904/'''と:

前:

<wsdl:types> 
    <xsd:schema targetNamespace="http://tempuri.org/Imports"> 
    <xsd:import schemaLocation="https://winsystemsintl.com:54904/PSAService.svc?xsd=xsd0" 
    namespace="http://tempuri.org/" /> 
    <xsd:import schemaLocation="https://winsystemsintl.com:54904/PSAService.svc?xsd=xsd1" 
    namespace="http://schemas.microsoft.com/2003/10/Serialization/" /> 
    <xsd:import schemaLocation="https://winsystemsintl.com:54904/PSAService.svc?xsd=xsd2" 
    namespace="http://schemas.datacontract.org/2004/07/PSA.Service.MessageObjects.Pregunta" /> 
    <xsd:import schemaLocation="https://winsystemsintl.com:54904/PSAService.svc?xsd=xsd3" 
    namespace="http://schemas.datacontract.org/2004/07/PSA.Service.MessageObjects.Respuesta" /> 
    </xsd:schema> 
</wsdl:types> 

後:

<wsdl:types> 
    <xsd:schema targetNamespace="http://tempuri.org/Imports"> 
    <xsd:import schemaLocation="PSAService.svc?xsd=xsd0" 
    namespace="http://tempuri.org/" /> 
    <xsd:import schemaLocation="PSAService.svc?xsd=xsd1" 
    namespace="http://schemas.microsoft.com/2003/10/Serialization/" /> 
    <xsd:import schemaLocation="PSAService.svc?xsd=xsd2" 
    namespace="http://schemas.datacontract.org/2004/07/PSA.Service.MessageObjects.Pregunta" /> 
    <xsd:import schemaLocation="PSAService.svc?xsd=xsd3" 
    namespace="http://schemas.datacontract.org/2004/07/PSA.Service.MessageObjects.Respuesta" /> 
    </xsd:schema> 
</wsdl:types> 

繰り返しのためにそれぞれのファイルダウンロードされました。

次に、(私はすべてのPHP/WSDLファイルが同じフォルダ内にあることを、ここで仮定)、次のようにコードを変更:今SoapClientはウェブからWSDLをダウンロードスキップした

$opts = [ 
'ssl' => [ 
    // set some SSL/TLS specific options 
    'verify_peer' => false, 
    'verify_peer_name' => false, 
    'allow_self_signed' => true 
], 
    'http'=>[ 
    'user_agent' => 'PHPSoapClient' 
    ] 
]; 

// Initialize Soap Client 
$client = new SoapClient('PSAService.svc?wsdl', array('ssl_method' => SOAP_SSL_METHOD_SSLv3,'soap_version' => SOAP_1_2, 'location' => 'https://winsystemsintl.com:54904/PSAService.svc','stream_context' => stream_context_create($opts), 'exceptions' => true, 'trace' => true)); 
var_dump($client->__getFunctions()); 

、そしてあなたストリームコンテキストを使用して通話を開始する準備が整いました。

+0

また、MITM攻撃に身を任せることもできます。 :/ – miken32

+0

はい、それは本当ですが、私は実際には本番環境でこれをしませんが、開発者が自己署名証明書を使用する必要がある場合は、テスト目的に役立ちます。 –

+0

おっとこれまでのコメントは編集できませんが、これは完全なコメントです:こんにちはクリス、ありがとうございましたが、今度はこのエラー「ホストに接続できませんでした」が表示されます。私はそれがwebservice証明書の問題かもしれないと思うので、私はそれらと話し、彼らはそれをテストする生産Webサービスのテスト資格を与えます、はい私は生産webserviceに何の問題もなく接続することができます...もう一度ありがとう。 – Nerea

関連する問題