PHP SOAP 客户端,通过 SSL 提供证书


PHP SOAP client with certificates over SSL

我正在尝试使用以下代码设置一个 Soap 客户端:

<?php
$wsdl           = 'https://domain.com/?wsdl';
$endpoint       = 'https://domain.com';
$certificate    = dirname(__FILE__) . '/CertWithKey.pem';
$password       = 'pwd';
$options = array(
    'location'      => $endpoint,
    'keep_alive'    => true,
    'trace'         => true,
    'local_cert'    => $certificate,
    'passphrase'    => $password,
    'cache_wsdl'    => WSDL_CACHE_NONE
);
try {
    $soapClient = new SoapClient($wsdl, $options);
} catch(Exception $e) {
    var_dump($e);
}

我得到了一个带有.crt认证文件的.p12密钥文件。使用 openssl 我将 .p12 文件转换为 .pem 文件,然后将其与 .crt 文件合并。CertWithKey.pem对我来说看起来不错,文件中有两个证书块。

无论我尝试做什么,我都会收到消息SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://domain.com/?wsdl' : failed to load external entity "https://domain.com/?wsdl"异常。

在与远程方打电话后,他们承认有请求传入,但他们正在记录此错误:ssl handshake interrupted by system [hint: stop button pressed in browser?!]

由于到目前为止我在网上没有找到任何有用的信息,我想向你们询问有关此事的一些见解。

有什么建议可以尝试吗?我正在运行 PHP 5.3.8,服务器的 IP 地址在远程方的防火墙中被列入白名单。

我已经解决了这个问题。我认为,由于有关此问题的问题数量和不同解决方案的数量,其他人将从解决方案中受益。这里是:

我使用 openssl CLI 程序将 .p12 密钥文件转换为 .pem 密钥文件。诀窍是转换发生的方式。

首先,我使用此命令对其进行了转换,并且遇到了问题中所述的问题:

openssl pkcs12 -in key.p12 -out key.pem -nodes -clcerts

虽然下面的命令做了实际的技巧:

openssl pkcs12 -in key.p12 -out key.pem -clcerts

有关更多信息,请参阅我使用的来源:https://community.qualys.com/docs/DOC-3273

        $mode = array(
            'soap_version' => 'SOAP_SSL_METHOD_SSLv2',  // use soap 1.2 client
            'trace' => 1,
            'stream_context' => stream_context_create(
            array(
                'ssl' => array(
                    'crypto_method' =>  STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT,
                    'verify_peer' => false,  // don't care about which company
                    'verify_peer_name' => false  // or company name
                    )   
                )
            )
        );
        $client = new SoapClient($x, $mode);

相同的建议:

  1. 我使用SoapClient与SSL服务连接,并且无需指定"端点"URL,一切正常。然后我建议您尝试不使用此选项;

  2. php SoapClient 有一个名为"ssl_method"的选项,您可以在其中更改此协议的某些变体。如果您知道使用什么协议,请尝试更改/指定此参数;

  3. 在参数列表中指定"verifypeer => false"和"verifyhost => false";