php – 使用soapclient连接到https主机:如何解决SSL问题?

TLDR

我似乎无法使用SoapClient连接到https端点.因为我的wget返回一个握手失败,我怀疑是原因.

如何使用PHP对此服务器执行SOAP请求?

完成

我正在尝试连接到一个SOAP服务器(https).它没有客户端证书认证,所以连接应该很简单,但遗憾的是它不是.

问题是我不断得不到连接到主机的消息.

我正在使用的连接方法正在为另一台服务器工作,我已经验证我正在正确设置此服务器的位置(将其更改为我控制的服务器,并且我在那里得到响应).我怀疑问题是与服务器的https / ssl连接.

情况

>我正在创建一个基于我在本地的wsdl的PHP Soapclient.
>如果我更改端点,我得到请求和响应标头,一切都按预期工作.
>机器是可以从我的服务器,虽然有一个问题可见,当我使用wget连接到它(见下文)
无法建立SSL连接.
> openssl连接也可以看到问题(见下文)

我试过的

有很多关于“无连接”的主题,但是显然有很多“我的路由器不好,我在地址等中打错了”.我尝试了多次提出的这些设置,但更多的是作为一个“cut’n’paste”解决方案,以确保它不起作用“然后脱离真正的推理.我的一些评论添加

为wsdl选项创建一个stream_context.我努力了

$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;

(首先只有具有verify_peer和allow_self_signed的ssl选项,然后我添加了https数组,最后我将密码键加到了ssl.)

我发现参考this bug,但1)我没有得到警告,2)它似乎是代理相关的,3)我的版本不应该有bug.我正在运行PHP 5.3.10

当我尝试wget的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. **

我已经尝试从this question添加curl-wrapper,ssl_version设置为3(因为这似乎适用于上面的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的服务器,但这几乎没有成功.但这可能是第二个问题?不确定.

我假设我需要尝试强制ssl3,但我不知道如何(这可能是错误的路径,所以我试图没有an XY problem这里:)

有趣.尝试添加
wget https://[[SERVER]]/soap/ —post-file=request.xml —header=”Content-Type: text/xml” -O response.xml

这将保存结果作为一个名为response.xml的文件.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...