无法使用PHP连接到SSL加密的Web服务

问题描述 投票:4回答:2

我从提供者那里得到了两个证书文件,一个是.cer格式的,另一个是.p7b格式的。然后我将p7b证书转换为p12证书。有了这个证书,我就能从浏览器连接到wsdl。然后我继续使用我在本网站上找到的一些说明将该证书转换为.pem格式。

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

然后使用以下命令将证书与密钥组合在一起:

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);
    }
}

这是错误:

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-certificate:

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

我假设它应该可以以某种方式使它工作,因为我能够通过我的浏览器访问wsdl,使用.p12证书。但我无法找到解决方案,以便我如何继续。提前致谢。

php soap ssl pem pkcs#12
2个回答
0
投票

我觉得你这里有一些问题。首先,我不认为SoapClient对象的构造函数正在使用本地证书的选项。 options数组不支持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

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

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

在你的情况下保存它我不确定,但有一些东西指向某种类型的信任商店。

© www.soinside.com 2019 - 2024. All rights reserved.