Nan*_*nne 12 php ssl https soap handshake
我似乎无法连接到带有的https端点SoapClient.当我的wget返回时handshake failure,我怀疑这是原因.
如何使用此服务器执行SOAP请求PHP?
我正在尝试连接到SOAP服务器(https).它没有客户端证书身份验证,因此连接应该非常简单,但遗憾的是它不是.
问题是我不断收到Could not connect to host消息.
我正在使用的连接方法正在为另一台服务器工作,我已经验证我正确设置了该服务器的位置(将其更改为我控制的服务器,并且我在那里得到响应).我怀疑问题出在与服务器的https/ssl连接上.
Soapclient基于本地wsdl 的PHP .wget它连接到它时会出现问题(见下文)无法建立SSL连接.有很多关于"没有连接!"的话题,但显然有很多"我的路由器坏了,我在地址等中输了一个错字".我确实尝试了多次建议的这些设置,但更多的是作为"cut'n'paste"解决方案,以确保它不起作用"然后出于真正的推理.我添加了一些评论
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;
Run Code Online (Sandbox Code Playgroud)
(首先只ssl用verify_peer和的选项allow_self_signed.然后我添加了https数组,最后我添加了ciphers密钥ssl.)
我找到了对这个bug的引用,但是1)我没有得到那个警告,2)它似乎与代理有关并且3)我的版本不应该再有bug了.我在跑php 5.3.10
当我尝试忘记网址时,我得到:
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
Run Code Online (Sandbox Code Playgroud)
如果我尝试连接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:
Run Code Online (Sandbox Code Playgroud)
但如果我强制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. **
Run Code Online (Sandbox Code Playgroud)
我试图在ssl_version设置为3的情况下从这个问题中添加curl-wrapper (因为这似乎适用于openssl上面的命令).那个包装器确实丢弃了一些参数,所以我不确定它会有多完整.此外,我仍然会收到握手错误,除非我明确将检查设置为false.如果我这样做(见下文),我会得到一个空洞的回答.
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, false);
Run Code Online (Sandbox Code Playgroud)
如上所述,我怀疑ssl握手,但我不知道如何解决它.我不怀疑wsdl或客户端创建的问题,因为连接确实与另一个wsdl,具有不同位置集的wsdl相同.这纯粹是这个(https)端点让我感到头疼.
就像上面用卷曲包装的测试一样,我尝试发送一个最小的肥皂信封,正如@halfwarr似乎在评论中提出的那样.Als返回一个空响应.
所以在上面似乎我确实有一种方法来挤出http 204服务器,但这并不成功.但这可能是第二个问题?不确定.
我想我需要尝试强制ssl3,但我不知道如何(这也可能是错误的路径所以我试图在这里没有XY问题 :)
有趣的。尝试添加这个:
\n\nwget https://[[SERVER]]/soap/ \xe2\x80\x94post-file=request.xml \xe2\x80\x94header=\xe2\x80\x9dContent-Type: text/xml\xe2\x80\x9d -O response.xml\nRun Code Online (Sandbox Code Playgroud)\n\n这会将结果保存为名为response.xml 的文件。
\n