2014-02-11 83 views
1

我在使用SOAP运行方法时遇到问题。我正在使用Apache和PHP。通过https访问PHP Soap呼叫

这是PHP代码:

$opts = array(
    'ssl' => array('ciphers'=>'RC4-SHA') 
); 

ini_set('soap.wsdl_cache_enabled',0); 
ini_set('soap.wsdl_cache_ttl',0); 

$client = new SoapClient('https://host?wsdl', array (
'stream_context' => stream_context_create($opts), 
"trace" => 1, 
"exceptions" => 0, 
"connection_timeout"=>2000)); 
var_dump($client->__getFunctions()); 

$params = array ("key" => "value"); 
$result = $client->availabeFunction($params); 
var_dump($result); 

__getFunctions()它返回了我所有的可用功能。

然后,当我试图调用带参数的可用函数。

它返回我strage错误消息:

public 'faultstring' => string 'Could not connect to host' (length=25) 
public 'faultcode' => string 'HTTP' (length=4) 

所以我相信这是由于一些原因是通过HTTP,而不是通过HTTPS连接。

我抬头看了一下网页,在某些情况下,他们正在使用.pem文件的local_cert值。

它拥有它吗?或者我错过了别的东西?

回答

0

的解决方案是很容易,因为我thoguht这将是:

ini_set('soap.wsdl_cache_enabled',0); 
ini_set('soap.wsdl_cache_ttl',0); 

$location = 'https://host'; 

$client = new SoapClient($location . '?wsdl', array (
"trace" => 1, 
"exceptions" => 0, 
"connection_timeout"=>2000, 
"location"=>$location // <- this was the reqiured parameter 
)); 

其他的都是和以前一样。 这是由WSDL文件配置造成的原因,而不是https URL,它具有http。

+0

这枚“有效”,你绝对**不要**想这样做。为什么?因为'https://'封装器在PHP 5.6之前默认禁用了对等证书验证。通过消除你基本上说过的ssl上下文,*“我不在乎谁是这个转移的另一端,我完全信任他们。”*如果你正在处理数据,你不希望我成为能够阅读或修改这不是正确的解决方案。 – rdlowrey

2

这是一个openssl库的bug。

在第一次尝试加入这个禁用SSL检查PARAMS

"stream_context" => stream_context_create(
    array(
     'ssl' => array(
      'verify_peer'  => false, 
      'verify_peer_name' => false, 
     ) 
    ) 
) 

而旁边尝试在位置链接无法使用?WSDL,尝试使用类似 的.wsdl

+1

可以证实这在我的情况下是有效的,在5.4和5.5中相同的脚本可以正常工作,我只需要在'verify_peer'之外添加'verify_peer_name'=> false'以使5.6工作。 –