【问题标题】:curl command with certificates to php SoapClient (BankID)带有证书的 curl 命令到 php SoapClient (BankID)
【发布时间】:2017-04-13 05:02:51
【问题描述】:

基于https://www.bankid.com/assets/bankid/rp/bankid-relying-party-guidelines-v2.13.pdf

我正在工作curl 命令:

curl https://appapi.test.bankid.com/rp/v4?wsdl -E --cacert /path/to/BankID_SSL_Root_Certification_Authority_TEST.pem --cert /path/to/ServerCertificate.cer --key /path/to/PrivateKey.key

ServerCertificate.cer 和 PrivateKey.key 是使用 openssl 命令从 PFX 证书 (https://www.bankid.com/assets/bankid/rp/FPTestcert2_20150818_102329.pfx) 中提取的。

但我不能让它与 PHP SoapClient 一起工作:

SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://appapi.test.bankid.com/rp/v4?wsdl' : failed to load external entity "https://appapi.test.bankid.com/rp/v4?wsdl"

我将不胜感激。

【问题讨论】:

  • 如果你不需要这个 SoapClient 东西,不管是什么,这很容易翻译成原生 php curl_api。 $curlh=curl_init('appapi.test.bankid.com/rp/v4?wsdl'); curl_setopt_array($curlh,array(CURLOPT_SSH_PRIVATE_KEYFILE=>'/path/to/PrivateKey.key', CURLOPT_SSLCERT=>'/path/to/ServerCertificate.cer', CURLOPT_SSLKEY=> "/path/to/PrivateKey.key", ) ); curl_exec($curlh);我认为
  • 您好,感谢您的建议。 “SoapClient 的东西”是php.net/manual/en/class.soapclient.php
  • 您似乎需要提供证书才能访问 WSDL。 SoapClient 不支持这一点,您只能将证书文件用于实际的 SOAP 调用。但是您可以尝试下载 WSDL 并将其保存在本地,然后使用 SoapClient 指向本地 WSDL 文件。

标签: php curl soap https


【解决方案1】:

谢谢大家的回答。

解决办法:

  1. openssl pkcs12 -in FPTestcert2_20150818_102329.pfx -nocerts -out key.pem -nodes
  2. openssl pkcs12 -in FPTestcert2_20150818_102329.pfx -nokeys -out cert.pem
  3. openssl rsa -in key.pem -out server.key
  4. 复制
    -----BEGIN RSA PRIVATE KEY----- ... -----END RSA PRIVATE KEY-----
    部分来自server.key
    -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE-----
    来自cert.pem 的部分并将它们放入新的certname.pem 文件中。

然后:

try {
    $this->client = new SoapClient( $this->wsdl, array( "local_cert" => "/path_to_cert/certname.pem" ) );
} catch (Exception $e) {
    return json_encode( array( "result" => false, "reason" => $e->getMessage() ) );
}

【讨论】:

    【解决方案2】:

    为了让未来的人发现自己遇到同样的 BankID 问题,Dmitry 提供了一个非常好的教程,介绍了如何获得正确的证书,但对我有用的代码需要更多参数:

    try {
        $client = new SoapClient('https://appapi2.test.bankid.com/rp/v4?wsdl',
            ["local_cert" => "certname.pem",
             "stream_context" => [
                 "ssl" => [
                     "verify_peer" => false,
                     "verify_peer_name" => false,
                     "allow_self_signed" => true
                 ]
             ]
         ]);
    } catch (Exception $e) {
        return json_encode( array( "result" => false, "reason" => $e->getMessage() ) );
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 2010-10-18
      • 1970-01-01
      • 2017-06-29
      相关资源
      最近更新 更多