我从提供商处获得了两个证书文件,一个是 .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
然后使用以下命令将证书与 key 结合起来:
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 证书:
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。但是我无法找到关于我应该如何进行的解决方案。 提前致谢。
最佳答案
我认为你这里有一些问题。首先,我认为 SoapClient 对象的构造函数没有使用您的本地证书选项。选项数组不支持 SSL 配置选项。其次,鉴于您提供给 SoapClient 的选项未被使用,Open SSL 提示远程主机上的证书是自认证证书。
我认为应该可以解决这个问题,但如果不使用代码,我无法确定所有选项。我认为您需要使用 stream_context_create() 创建自定义流上下文来设置您需要的 SSL 选项(查看 http://ca.php.net/stream_context_create 和 SSL 的上下文选项)。然后可以将其作为配置数组中的 stream_context 选项传递给 SoapClient 对象。使用 stream_context,您可以设置所需的各种 SSL 选项,这些选项将覆盖默认值。
很抱歉,我无法更准确地说明您需要设置的选项。希望使用流上下文可以解决您的问题。
关于php - 无法使用 PHP 连接到 SSL 加密的 Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3804615/