2015-03-03 94 views
1

我面临调用soap函数的问题。我收到错误“无法连接到主机”。我使用的是“wamp server”,“php version 5.3.13”和“apache version 2.2.22”。使用客户端证书调用soap函数

我有.p12格式的客户端证书,wsdl文件在本地系统上可用,我已经使用soapUI-m-snapshot测试了soap调用。它工作正常!但是,当我尝试与“SoapClient”变得“无法连接到主机”相同。 我使用以下肥皂选项

$soapclient_options = array(); 
$soapclient_options['cache_wsdl'] = 'WSDL_CACHE_NONE'; 
$soapclient_options['local_cert'] = $certificatePath; 
$soapclient_options['passphrase'] = $api_certificate_passphrase; 
$soapclient_options['trace'] = true; 
$soapclient_options['connection_timeout'] = 15; 
$soapclient_options['ssl_method'] = 'SOAP_SSL_METHOD_SSLv3'; 
$soapclient_options['location'] = 'api location'; 

$client = new SoapClient($wsdl_path, $soapclient_options); 
$client->__setLocation($soapclient_options['location']); 

我是在做错误的方式的东西吗? 有人请提前告诉我,并多谢。

回答

1

PHP Soap客户端只接受pem证书。您可以使用以下隐藏证书:

openssl pkcs12 -in in.p12 -out out.pem -nodes -clcerts 
+0

感谢格雷格,我找到了同样的地方,为我工作。 – 2015-03-16 13:00:24

+0

您能否将我的答案标记为将来参考的正确答案。谢谢。 – Greg 2015-03-16 17:02:55

+0

哦!我忘记了,我是新来的。 – 2015-03-16 18:11:07

-1

需要额外的代码才能使用PHP 5.6版本。

$soapclient_options['stream_context'] = stream_context_create(
      array(
       'ssl' => array(
        'verify_peer' => false, 
        'verify_peer_name' => false, 
       ) 
      ) 
    ); 
+0

请不要这样做!它会使你的连接变得不安全,容易受到中间人攻击!它使您的客户接受任何证书,而不仅仅是你的! – Greg 2016-12-17 17:36:52

+0

这是因为您的证书可能是自签名的,未经某些全球机构(证书颁发机构)验证。正确的解决方案是拥有服务器证书并仅信任该证书。更多这里(例如卷曲,但它也适用于所有流 - file_get_contents,肥皂等):http://unitstep.net/blog/2009/05/05/using-curl-in-php-to-access -https-ssltls-protected-sites/ – Greg 2016-12-17 17:42:28

+0

感谢@Greg我不使用此解决方案。我已经转移到了不同​​的身份验证系统。 – 2016-12-19 05:17:54