2010-09-27 42 views
4

我从提供程序获取了两个证书文件,一个格式为.cer格式,另一个格式为.p7b格式。然后我将p7b证书转换为p12证书。凭借此证书,我可以从我的浏览器连接到wsdl。 然后我开始使用我在本网站上找到的一些说明将该证书转换为.pem格式。使用PHP连接到SSL加密的Web服务时遇到问题

cat test.pem key.pem > cert.pem 

我的继承人为Web服务类结构:

public function __construct() { 
    $wsdl_url = 'https://url.to/web_service?wsdl'; 
    $pass = 'passphrase'; 
    $cert = 'cert.pem'; 

    try { 
     $this->client = new SoapClient($wsdl_url, array('local_cert' => $cert, 'passphrase' => $pass)); 
    } catch(SoapFault $e) { 
     print_r($e); 
    } 
} 

这里是错误:

openssl pkcs12 -clcerts -nokeys -out test.pem -in mycert.p12 
openssl pkcs12 -nocerts -out key.pem -in mycert.p12 

然后使用以下命令用钥匙梳理证书

SSL operation failed with code 1. OpenSSL Error messages: error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca in /var/www/html/.. 

试图使用验证证书:

openssl verify cert.pem 

给了我以下错误:

error 20 at 0 depth lookup:unable to get local issuer certificate 

我也尝试使用下面的OpenSSL命令创建的.pem证书:

openssl pkcs12 -in mycert.p12 -out mycert.pem 

验证这给了我好,但PHP给了我以下错误:

Unable to set local cert chain file `mycert.pem'; Check that your cafile/capath settings include details of your certificate and its issuer 

我假设它应该有可能以某种方式工作,因为我可以通过我的浏览器使用.p12证书来访问wsdl。但是我无法找到解决方案,我应该如何继续。 在此先感谢。

回答

0

我想你在这里有几个问题。首先,我不认为您的SoapClient对象的构造函数正在使用本地证书的选项。选项数组不支持SSL配置选项。其次,鉴于您提供给SoapClient的选项未被使用,Open SSL正在抱怨远程主机上的证书是自我认证证书。

我认为应该有可能解决这个问题,但是没有玩代码,我不能确定所有的选项。我认为你需要使用stream_context_create()来创建一个自定义的流上下文来设置你需要的SSL选项(看看http://ca.php.net/stream_context_create和SSL的上下文选项)。然后可以将它作为config数组中的stream_context选项传递给SoapClient对象。使用stream_context你可以设置你需要的各种SSL选项,这些选项将覆盖默认值。

对不起,我不能更精确地选择你需要设置的选项。希望在流式上下文中解决您的问题。

0

我在想,它无法找到颁发您随附的证书的根证书。

证书通常由签名机构签署并签发,您的客户需要知道签名机构的公钥。如果你的证书是一个自签名证书,那么它并不重要。

要检查 openssl x509 -text -noout -in key.pem

检查输出,查找发行人。如果发行者与证书的CN不同,那么您需要来自提供证书的签名机构的根证书。

您通常可以通过使用浏览器打开您的wsdl地址并检查证书链并从层次结构选项卡导出根证书来获取它。

你把它保存在你的位置的地方我不确定,但是会有些东西指向某种类型的信任存储。