带有两个证书文件和 "Could not connect to host" 的 SOAP

SOAP with two certificates file and "Could not connect to host"

我在将 PHP 与 API 连接时遇到问题,需要使用 SSL 证书。问题是当我 运行 我的 PHP 代码得到 "Could not connect to host".

我能够像这样使用 CURL 连接到服务提供商:

$wsdl       = 'https://example.com/Case.svc';
$certFile   = getcwd() . '/certificate.crt';
$keyFile    = getcwd() . '/key.pem';
$password   = 'password';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,           $wsdl);
curl_setopt($ch, CURLOPT_SSLCERT,       $certFile);
curl_setopt($ch, CURLOPT_SSLKEYPASSWD,  $password);
curl_setopt($ch, CURLOPT_SSLKEY,        $keyFile);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$output = curl_exec($ch);

var_dump(curl_errno($ch));
var_dump(curl_error($ch));

但是,我无法使用 SOAP 执行此操作:

$options=array(
            'soap_version'   => SOAP_1_2,
            'trace' => true,
            'cache_wsdl' => WSDL_CACHE_NONE,
            'exceptions' => 1,
            'encoding' => 'UTF-8',  
            'stream_context'=>stream_context_create(
                          array(
                            'ssl'=>array(
                                'verify_peer'=>true
                                ,'allow_self_signed'=>false
                                ,'cafile'=>'certificate.crt'
                                ,'verify_depth'=>5
                                )
                            )
                        ), 
                        'local_cert' => 'key.pem',
            'passphrase' => 'password',     
        );

    $client = new SoapClient("Case.wsdl", $options);

结果为 "Could not connect to host"。

问题可能出在证书本身,也许我需要将两个证书合并到一个文件中。我看到很多人有同样的问题,大多数人都没有得到答案。

为什么 SOAP 代码返回 "Could not connect to host",我该如何解决?

您可以从一些地方开始:

1) certificate.crt 到底是什么?它是客户端证书还是 CA 证书?您正在使用 CURLOPT_SSLCERT(设置客户端证书),但在 SoapClient 中使用 'cafile' 文件指令(设置 CA 证书文件)。

2) 您使用的是 CURLOPT_SSL_VERIFYPEER = false,但在另一个片段中您使用的是 verify_peer.

因此,尝试使用相同类型的环境对这些更改进行更多调试。

如果您的证书是自签名的,则无需设置 cafile。 cafile 仅适用于 CA 链。 local_cert 需要同时拥有:证书(叶)和私钥连接例如:

-----BEGIN CERTIFICATE-----  
MIIDsDCCApgCAWUwDQ....  
-----END CERTIFICATE-----  
-----BEGIN RSA PRIVATE KEY-----  
MIIEpAIBAAKCAQEAsMGypi...  
-----END RSA PRIVATE KEY-----

出于某种原因,自签名证书在 ubuntu 上对我不起作用,但在 mac os.

上工作正常