12

TLDR

で https エンドポイントに接続できないようですSoapClient。私の wget が a を返すのでhandshake failure、それが原因だと思います。

を使用してこのサーバーに SOAP リクエストを送信するにはどうすればよいPHPですか?

完了

SOAP サーバー (https) に接続しようとしています。クライアント証明書認証がないため、接続は非常に簡単なはずですが、残念ながらそうではありません。

Could not connect to host問題は、メッセージを受け取り続けることです。

私が使用している接続方法は別のサーバーで機能しており、このサーバーの場所を正しく設定していることを確認しました (私が制御するサーバーに変更し、そこで応答を得ています)。問題は、サーバーへの https/ssl 接続にあると思われます。

状況

  • Soapclientローカルにある wsdl に基づいてPHP を作成しています。
  • エンドポイントを変更すると、Request ヘッダーと Response ヘッダーが取得され、すべてが期待どおりに機能します。
  • マシンはサーバーから到達可能ですが、接続に使用すると目に見える問題がありますwget(以下を参照) SSL 接続を確立できません。
  • この問題は、openssl 接続でも見られます (以下を参照)。

私が試したこと。

「繋がらない!」という話題が多いですが、当然「ルーターの調子が悪い、アドレスを打ち間違えた」なども多いです。提案されたこれらの設定を何度も試しましたが、実際の理由から「うまくいかなかった」ことを確認するための「カットアンドペースト」ソリューションとして. 私からのいくつかのコメントが追加されました.

stream_contextwsdl オプションの を作成しています。私が試してみました

$context = stream_context_create(
              array(
                'ssl' => array(
                           'verify_peer' => false,  //default
                           'allow_self_signed' => true, //needs verify peer, tried that
                           'ciphers'=>"SHA1", // quite random.
                   ),
                'https' => array(
                           'curl_verify_ssl_peer'  => false,
                           'curl_verify_ssl_host'  => false
                          )
      )
            );
$options['stream_context'] = $context;

(最初は と のオプションのみ。ssl次に配列を追加し、最後に にキーを追加しました。)verify_peerallow_self_signedhttpsciphersssl

このバグへの参照を見つけましたが、1) その警告が表示されない、2) プロキシに関連しているように見える、3) 私のバージョンにはもうバグがないはずです。私は走っていますphp 5.3.10

URLを取得しようとすると、次のようになります。

    wget https://[[servername]]/SOAP
    Resolving [[servername]] ([[servername]])... xxx.xxx.xxx.xxx
    Connecting to [[servername]]([[servername]])|xxx.xxx.xxx.xxx|:443... connected.
    OpenSSL: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure

openssl で接続しようとすると、次のようになります。

$ openssl s_client -connect [[server]]:443 -state
CONNECTED(00000003)
SSL_connect:before/connect initialization
SSL_connect:unknown state
SSL3 alert read:fatal:handshake failure
SSL_connect:error in unknown state
3074463944:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:724:

しかし、ssl3 を強制すると、期待どおりの結果が得られます

$ openssl s_client -ssl3 -connect [[server]]:443 -state
CONNECTED(00000003)
SSL_connect:before/connect initialization
SSL_connect:SSLv3 write client hello A
SSL_connect:SSLv3 read server hello A
**happy certificate stuff. this is good**
Protocol  : SSLv3
Cipher    : DHE-RSA-AES256-SHA
**more happy certificate stuff. **

ssl_version を 3 に設定して、この質問から curl-wrapper を追加しようとしました(これはopenssl上記のコマンドで動作するようです)。そのラッパーはいくつかのパラメーターを破棄するため、これがどの程度完全かはわかりません。さらに、チェックを明示的に false に設定しない限り、ハンドシェイク エラーが発生します。それを行うと (以下を参照)、空の応答が返されます。

curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, false);

原因

上記のように、ssl ハンドシェイクが疑われますが、修正方法がわかりません。接続は別の wsdl、別の場所が設定された同じ wsdl などで機能するため、wsdl またはクライアントの作成に問題があるとは思いません。頭痛の種は純粋にこの (https) エンドポイントです。

追加のテスト。

上記の curl ラッパーを使用したテストと同様に、@halfwarr がコメントで示唆しているように、最小限の石鹸封筒を送信してみました。Als は空の応答を返します。

したがって、上記では、サーバーから絞り出す方法があるように見えhttp 204ますが、それはほとんど成功していません。しかし、それは2番目の問題になる可能性がありますか?わからない。

私はssl3を試して強制する必要があると思いますが、方法がわかりません(これも間違ったパスである可能性があるため、ここでXYの問題を起こさないようにしています:)

4

3 に答える 3

1

面白い。これを追加してみてください:

wget https://[[SERVER]]/soap/ —post-file=request.xml —header=”Content-Type: text/xml” -O response.xml

これにより、response.xml という名前のファイルとして結果が保存されます。

于 2013-06-05T09:37:30.440 に答える
1

最新バージョンの PHP 5.5.3 では、SSL バージョンを設定できます。stream_context を使用できる他の人を見たことがありますが、同様に機能させることができませんでした。

回避策とフェイル セーフとして、catch を使用して SOAP エンベロープ リクエストを取得しました (上記でテストしたものと同様)。

$xml = $client->__getLastRequest()

curl 経由で送信します。


curl_setopt($ch, CURLOPT_SSLVERSION, 3);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

それは私が少なくとも前進することを可能にします。

于 2013-09-10T00:30:32.440 に答える
0

で有効php_openssl.dllにしましたphp.iniか?

参照:

PHP SOAP が SSL WSDL ソースに接続できない

于 2013-06-06T18:06:03.250 に答える