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

标签 php soap ssl pem pkcs#12

我从提供商处获得了两个证书文件,一个是 .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/

相关文章:

php - 在 PHP 中减去时间

php - 使用 ajax 和 php 从动态创建的表单中删除记录

java - 使用 Spring 配置 SOAP 处理程序

asp.net - 如何拦截来自WCF客户端的原始 SOAP 请求/响应(数据)

php - 如何在不使用 cPanel 中的 .htaccess 文件的情况下强制使用 HTTPS

node.js - 如何配置axios使用SSL证书?

javascript - 使不安全的图像源成为安全的客户端

php - CSS 覆盖问题 - AdSense 阻止覆盖了我的标签(包括屏幕截图)

php - 在 MySQL 中选择时间范围时出现问题

c# - SOAP Web 服务,在不编辑代码的情况下更改命名空间?