SoapFault异常[HTTP]无法连接到主机:使用本地SSL证书

时间:2014-01-13 22:36:35

标签: php web-services soap ssl wsdl

我正在尝试使用PHP Soap客户端连接到具有本地SSL文件的SOAP Web服务。 由于本地SSL证书无法正常使用PHP,我已经下载了WSDL文件并将其保存在本地。

现在,当我尝试连接到webservices时,我收到此错误:

SoapFault exception: [HTTP] Could not connect to host in /var/www/index.php:38 Stack trace: #0 [internal function]: SoapClient->__doRequest('__call('GetTests', Array) #2 /var/www/index.php(38): SoapClient->GetTests() #3 {main}

我正在使用Debian Wheezy服务器。 当我在Stackoverflow上做了一些阅读时,我发现你应该启用我安装的openssl并根据phpinfo()加载;

运行脚本时我会这样做:

soap.wsdl_cache_enabled = 0
soap.wsdl_cache_ttl = 0

在我的/ etc / hosts文件中,我添加了该服务以确保

我将防火墙设置为接受SOAP:

ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:1664
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:1664

我尝试了PHP文件中的几个设置,比如使用TLS或SSLv3等。 以上都没有帮助。

这是我的剧本:

error_reporting(E_ALL ^ E_NOTICE);
ini_set('soap.wsdl_cache_enabled',0);
ini_set('soap.wsdl_cache_ttl',0);

$wsdl = "/var/www/php/soap.wsdl";
$url =  "https://www.soaptest.nl/api/soap";
$pem = "/var/www/php/my_interface.p12";

$client = new SoapClient(
    $wsdl,
    array(
        "location" => "https://www.soaptest.nl/api/soap",
        //"uri" => "http://www.soaptest.nl/api",
        "local_cert" => $pem,
        "passphrase" => "mypassforthepem",
        "soap_version" => SOAP_1_1,
        "trace" => true,
        "exceptions" => 0,
        "features" => SOAP_SINGLE_ELEMENT_ARRAYS
    )
);

print $client->GetTests();

因此,到目前为止,我所做的所有设置似乎都没有效果。 我可能会忘记某件事或做一些我不应该做的事,但我再也看不到了。

请帮帮我,让我知道更多。 提前谢谢。

2 个答案:

答案 0 :(得分:2)

我通过使用openssl将PEM文件拆分为两个单独的密钥和crt文件解决了这个问题:

openssl pkcs12 -in certname.pem -nocerts -out key.pem -nodes
openssl pkcs12 -in certname.pem -nokeys -out bla.crt

使用它并在代码中设置这些值,它确实有效。

答案 1 :(得分:0)

问题可能是因为安装WS的服务器没有配置远程连接。

我的方案如下:

WebServices soap: 用java编程并部署在jboss中

客户端: PHP

我遇到了同样的问题,在我的例子中,在java中开发WS并将其发布在jboss服务器7.1.1上。最后,当测试SOAP UI连接没有问题但想要消费时,我标记了错误:

SoapFault异常:[HTTP]无法连接到主机...堆栈跟踪:#0 [内部功能]:SoapClient - > __ doRequest('__ call('GetTests',Array)#2 /var/www/index.php 38):SoapClient-> GetTests()#3 {main}

我给你的解决方案是在部署Ws的服务器上配置它以允许输出ws。

在我的例子中是配置jboss的standalone.xm

standalone.xml行位于

<Subsystem xmlns = "urn: jboss: domain: webservices: 1.1">
            <Modify-wsdl-address> true </ modify-wsdl-address>
            <Wsdl-host> $ {jboss.bind.address: 127.0.0.1} </ wsdl-host>
            <Endpoint-config name = "Standard-Endpoint-Config" />
            <Endpoint-config name = "Recording-Endpoint-Config">
                <Pre-handler-chain name = "recording-handlers" protocol-bindings = "## SOAP11_HTTP ## SOAP11_HTTP_MTOM ## SOAP12_HTTP ## SOAP12_HTTP_MTOM">
                    <Handler name = "RecordingHandler" class = "org.jboss.ws.common.invocation.RecordingServerHandler" />
                </ Pre-handler-chain>
            </ Endpoint-config>
        </ Subsystem>

substituting
<! - remote ip of wsl $ {jboss.bind.address: 127.0.0.1} ->

ip
<Wsdl-host> 192.168.1.73 </ wsdl-host>

重新启动jboss,并且已经允许从任何客户端连接