0

HTTPSサーバーからWSDLのコンテンツを取得しようとしています

<?php
echo file_get_contents("https://zendsoap.lan/Zend_Soap_Server.php?wsdl");
?>

それは戻ります:

警告:file_get_contents()[function.file-get-contents]:コード1でSSL操作が失敗しました。OpenSSLエラーメッセージ:エラー:1408E0F4:SSLルーチン:func(142):reason(244)in / Applications / AMPPS / www / 4行目のzendSoap.lan/Zend_Soap_Client.php

警告:file_get_contents()[function.file-get-contents]:4行目の/Applications/AMPPS/www/zendSoap.lan/Zend_Soap_Client.phpで暗号化を有効にできませんでした

警告:file_get_contents(https://zendsoap.lan/Zend_Soap_Server.php?wsdl)[function.file-get-contents]:ストリームを開くことができませんでした:/Applications/AMPPS/www/zendSoap.lan/Zend_Soap_Client.phpで操作が失敗しました4行目

そして、WSDLの場所(https://zendsoap.lan/Zend_Soap_Server.php?wsdl)に移動できる場合:すべてが正常に見えます。

PS:WSDLファイルを共有する方法を教えてもらえますか

4

3 に答える 3

4

LockyFordがSSLの問題であることに同意します(自己署名証明書が用意されていると確信しています。SSLを使用しているため、セキュリティ上の懸念を最小限に抑えるためにいくつかの手順を実行する必要があります)。差し迫った問題に関しては、次のようなコードで修正してみてください。

$url = 'https://zendsoap.lan/Zend_Soap_Server.php?wsdl';

$contextOptions = array(
    'ssl' => array(
        'verify_peer' => true,
        'CN_match'    => 'zendsoap.lan' // assuming zendsoap.lan is the CN used in the certificate
    )
);

$sslContext = stream_context_create($contextOptions);

$wsdlContent = file_get_contents($url, NULL, $sslContext);

更新: 上記のコードを次のように変更するのは簡単な解決策のように思えるかもしれません

 'verify_peer' => false

基本的な開発には問題ないかもしれませんが、それは実際には良い考えではなく、深刻なセキュリティ上の懸念をもたらすため、本番環境では絶対に使用しないでください-PHPコードからSSL経由でリモートAPI呼び出しを適切に保護する方法に関するこの優れた記事を参照してくださいArtur Ejsmontは、このテーマの詳細と、トランスポート層のセキュリティに関するチートシートおよびOWASPによるWebサービスの保護について説明しています)

Zend Frameworkアプリケーション内からWSDLを共有することに関するポイントを理解するには、次のようなことを実行して開始できます。

// go to application/configs/application.ini
// if your APPLICATION_ENV is development then add the following line in the development section:
phpSettings.soap.wsdl_cache_enabled = 0

上記の行は、開発中にwsdlがキャッシュされるのを防ぎます。次に、SoapControllerを作成し、次のようなアクションを追加します。

public function serverAction()
{
    $baseUrl = 'http://zendsoap.lan/soap/server';

    if( isset( $_GET['wdsl'] ) ) {
        $strategy = new Zend_Soap_Wsdl_Strategy_AnyType();
        $server = new Zend_Soap_AutoDiscover($strategy);
        $server->setUri($baseUrl);
        $server->setClass('Application_Model_Web_Service');
        $server->handle();
    } else {            
        $server = new Zend_Soap_Server($baseUrl . '?wsdl');
        $server->setClass('Application_Model_Web_Service');
        $server->handle();
    }
}

上記のアプローチの良いところは、WSDLがその場で生成されることです。setClass()メソッドが呼び出され、「Application_Model_Web_Service」が唯一のパラメーターとして渡されることに気付くでしょう。構成をテストするには、そのクラスを作成して、以下のメソッドを挿入することをお勧めします。単一のメソッドを含む単純なサービスを使用して構成をテストすると、サービスをより複雑にする前にトラブルシューティングに役立ちます。メソッドの例を次に示します。

// Note: you should definitely comment your methods correctly in the class so 
// the WSDL will be generated correctly - by that I mean use @param and @return
// so the correct input and output types can be determined and added to the WSDL
// when the the ZF component generates it for you
/**     
 * @return string
 */
 public function getMessage()
 {
     return 'ok';
 }

更新: Zend_Soap_Clientを使用してWebサービスにアクセスすることに関して質問した場合も、安全なサービスにするつもりであると思われるため、安全なSOAPサービスの設定に関して別の質問をすることをお勧めします。 php。その質問であなたがやろうとしていることについてもっと説明すると、ベストプラクティスに関するさまざまな専門家からいくつかの良い情報を得ることができます:-)

)。

私はあなたがSOに不慣れであることを知っているので、あなたが答えに満足しているなら、あなたはそれを受け入れることができます。もちろん、あなたが方法を知っているときは簡単で、誰かがあなたに言うときはさらに簡単です;-)

于 2013-01-16T15:28:56.890 に答える
0

私はSOAPサーバーを定義する方法を試しましたが、Application_Model_Web_Serviceを使用する代わりにカスタムクラスを使用しただけでした。クライアントとサーバーに単一のファイルを使用しています。?wsdlなしでhttps://zendsoap.lan/Zend_Soap_Server.phpを実行すると、次のようになります。

<SOAP-ENV:Envelope>
 <SOAP-ENV:Body>
  <SOAP-ENV:Fault>
   <faultcode>WSDL</faultcode>
  <faultstring>SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://zendsoap.lan/Zend_Soap_Server.php?wsdl' : failed to load external entity "https://zendsoap.lan/Zend_Soap_Server.php?wsdl"
  </faultstring>
  </SOAP-ENV:Fault>
 </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

そして、あなたが言ったようにfile_get_contents()を試してみると、次のようになります。

Warning: file_get_contents() [function.file-get-contents]: SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:func(144):reason(134) in /Applications/AMPPS/www/zendSoap.lan/https_soap_test.php on line 16

Warning: file_get_contents() [function.file-get-contents]: Failed to enable crypto in /Applications/AMPPS/www/zendSoap.lan/https_soap_test.php on line 16

Warning: file_get_contents(https://zendsoap.lan/Zend_Soap_Server.php?wsdl) [function.file-get-contents]: failed to open stream: operation failed in /Applications/AMPPS/www/zendSoap.lan/https_soap_test.php on line 16

これが私の証明書のスクリーンショットへのリンクです:http: //i.stack.imgur.com/bKoVD.png

あなたの助けに感謝します。

于 2013-01-17T19:17:30.967 に答える
0

'verify_peer'=>falseを変更することで問題が解決しました

file_get_contents()なしでZend_Soap_Clientを使用する場合、コードを教えてください(@dkcwd)。つまり、インターネット上で'verify_peer'=>falseのようなことをするために見つけることができないオプションはありますか。

@dkcwdに感謝します

更新:私が行っていることを正確に要約しましょう。SSLを介して基本的なSOAPサーバーを作成しようとしています。実稼働WebサイトでWebサービスを利用できるようにする前に、自己署名証明書を取得した開発システムでWebサービスをテストする必要があります(現在、認証が問題になっています)。その点で私が直面している問題は次のとおりです。

  1. https://zendsoap.lan/Zend_Soap_server.php?wsdlを呼び出そうとすると、正常に動作し、wsdlを表示できます。
  2. しかし、https://zendsoap.lan/Zend_Soap_server.phpを試してみると、次のようになります。

    SOAPエラー:WSDLの解析:「https://zendsoap.lan/Zend_Soap_Server.php?wsdl」から読み込めませんでした:外部エンティティ「https://zendsoap.lan/Zend_Soap_Server.php?wsdl」の読み込みに失敗しました私がすべき何か

  3. 開発サーバーで実行しているためverify_peer=>falseにした理由は、自分で作成した証明書を検証する必要がないためですが、本番環境では明らかに証明書を検証する必要があります。

これはNuSoapで正常に機能しますが、NuSoapのほとんどのものは、PHP 5.4.6を実行しているサーバーでは非推奨になっているため、PHPのSOAP拡張機能を使用する私にとって最も信頼できるソリューションです。そして、私がZendを使用する理由は、システムをサードパーティのフレームワークからZend Frameworkに移行している最中であり、毎日、クライアントからこの新しいコンポーネントを追加するように要求されます。クライアントからのすべての新しい要求を開発する場合は、 Zendライブラリを使用すると、後の段階でZendFrameworkに簡単に移行できます。

私はそこで何らかの意味を成したと思います。

よろしくお願いします...

于 2013-01-17T19:53:48.977 に答える