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_context
wsdl オプションの を作成しています。私が試してみました
$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_peer
allow_self_signed
https
ciphers
ssl
このバグへの参照を見つけましたが、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の問題を起こさないようにしています:)