我正在尝试使用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();
因此,到目前为止,我所做的所有设置似乎都没有效果。 我可能会忘记某件事或做一些我不应该做的事,但我再也看不到了。
请帮帮我,让我知道更多。 提前谢谢。
答案 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,并且已经允许从任何客户端连接