繁体   English   中英

使用代理时,PHP SoapClient无法通过HTTPS访问Web服务

[英]PHP SoapClient unable to access webservice over HTTPS when using proxy

在PHP中使用SoapClient (版本5.3.10)时遇到一个我无法找到解决方案的问题。

HTTPS和Proxy的组合用于联系Web服务给我带来了真正的痛苦。 有没有办法让这个工作?

给定以下设置:

$WSDL = 'https://(...).php?wsdl';

$params =  array(
    'proxy_host' => 'localhost',
    'proxy_port' => 3128
);

这有效:

$client = new SoapClient($WSDL);
var_dump($client->__getFunctions());
var_dump($client->__call('someFunc', array()));

这在某些时候会产生错误:

$client = new SoapClient($WSDL, $params);
var_dump($client->__getFunctions());
var_dump($client->__call('someFunc', array()));

我尝试了一些曲折尝试以缩小问题的范围:

  • $WSDL设置为基于HTTP的服务时,这两种方法均适用。
  • 当在本地下载基于HTTPS的服务的$WSDL并将$WSDL设置为此时,失败的方法会生成函数,但是在尝试调用该函数时会失败。

从使用HTTPS-url初始化客户端到启用了wsdl和代理的PHP退出,并显示以下错误:

Fatal error: Uncaught SoapFault exception:
 [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://(...).php?wsdl' :
  failed to load external entity https://(...).php?wsdl

使用本地存储的WSDL定义文件初始化客户端时,PHP退出并显示以下错误:

Fatal error: Uncaught SoapFault exception:
 [HTTP] Bad Request in test.php:19
 Stack trace: #0 [internal function]: SoapClient->__doRequest

从我的角度来看,这似乎是一个PHP错误,但希望可以找到解决方法。
我必须去诸如NuSoap之类的图书馆吗?
在另一个版本的PHP中是否已解决此问题?
我想念什么吗?

在本地主机上使用Fiddler2代理时遇到此问题。 不得不导出Fiddler的根证书并像这样显式设置cafile选项

$client = new SoapClient($url, [
        'proxy_host' => 'localhost', 
        'proxy_port' => 8888,
        'stream_context' => stream_context_create([ 
            'ssl' => [ 'cafile' => 'C:\path\to\FiddlerRoot.pem' ] ])
        ]);

...以捕获对服务的https访问。

使用在Base-64 encoded X.509 (.CER)选项的Personal存储中,使用DO_NOT_TRUST_FiddlerRoot-CE条目的certmgr.msc导出FiddlerRoot.pem

我必须使用wsdl文件的本地副本,并且正在使用以下选项:

  array(
    'trace' => 1,
    'exceptions' => true,
    'cache_wsdl' => WSDL_CACHE_NONE,
    'proxy_host' => self::PROXY_HOST,
    'proxy_port' => self::PROXY_PORT,
    'proxy_login' => self::PROXY_USER,
    'proxy_password' => self::PROXY_PASS,
  )

也许选项tracecache_wsdl会帮助您。

我在防火墙后面。 我必须设置代理和端口才能使代码正常工作。

$client = new SoapClient($wsdl, [
        "trace" => 1,
        "exceptions" => 1,
        "proxy_host" => "PROXY_HOST_STRING",
        "proxy_port" => PROXY_PORT_NUMBER
    ]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM