【问题标题】:unable to use client certificate(no key found or wrong pass phrase?)无法使用客户端证书(未找到密钥或密码错误?)
【发布时间】:2016-06-14 09:15:06
【问题描述】:

我正在尝试使用 CURL 对服务器进行 SOAP 调用,如下所示。

要求是

我们需要通过ssl证书并传递用户名和密码

    $ssl = "ssl_file_relative_address.pem";
    $pub_ssl_password = 'mynameiskhan';
    //Get the data
    $data = the_data_xml.xml;
    //Get the WSDL Address
    $wsdl = "address/to/wsdl?parameter=value";
    $soapUser = "Username";  //  username
    $soapPassword = "password"; // password

    $options = [
        CURLOPT_RETURNTRANSFER => TRUE,
        CURLOPT_FOLLOWLOCATION => TRUE,
        CURLOPT_SSL_VERIFYHOST => FALSE,
        CURLOPT_SSL_VERIFYPEER => FALSE,
        CURLOPT_URL => $wsdl,
        CURLOPT_SSLCERT => $ssl,
        //CURLOPT_SSLCERTPASSWD => $pub_ssl_password,
        CURLOPT_USERPWD => $soapUser.":".$soapPassword,
        CURLOPT_HTTPAUTH => CURLAUTH_BASIC
    ];

    $ch = curl_init();
    curl_setopt_array($ch , $options);
    $response = curl_exec($ch);
    //curl_close($ch);
    if (curl_errno($ch)) {
        print curl_error($ch); 
    }

我从 CURL 收到以下错误:无法使用客户端证书(未找到密钥或密码错误?)

我做错了什么...

【问题讨论】:

    标签: php ssl curl soap ssl-certificate


    【解决方案1】:

    找到解决方案。它需要一个中间 CA 证书。
    解决方案是

    $options = [
        CURLOPT_HTTPHEADER => ['Content-type: application/json'],
        CURLOPT_URL => 'https://address/to/service?param=value',
        CURLOPT_SSL_VERIFYPEER => 0,
        CURLOPT_CAINFO => getcwd()."\cacert.pem",
        URLOPT_SSLCERT => getcwd().'\cert.pem',
        CURLOPT_SSLCERTPASSWD => 'ssl_password',
        CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
        CURLOPT_USERPWD => $soapUser.":".$soapPassword,
        CURLOPT_POST => 1,
        CURLOPT_POSTFIELDS => $data
    ];
    
    $ch = curl_init();
    curl_setopt_array($ch , $options);
    $response = curl_exec($ch);
    
    if (curl_errno($ch)) {
        print curl_error($ch); 
    }else{
        print_r($response);
    }
    
    curl_close($ch);
    

    不要忘记在其内容类型中提及 CURLOPT_HTTPHEADER,这很重要。
    还可以从https://curl.haxx.se/ca/cacert.pem 下载中间证书。它包含所有有效的 CA。

    感谢@drew010 的帮助。

    【讨论】:

      【解决方案2】:

      当您使用CURLOPT_SSLCERT 指定客户端身份验证证书时,PEM 文件应包含-----BEGIN CERTIFICATE----- 行,后跟证书。

      您还需要使用CURLOPT_SSLKEY 为证书提供相应私钥的cURL,这是一个以-----BEGIN PRIVATE KEY----- 开头的文件。

      如果私钥在ssl_file_relative_address.pem 中,则尝试将私钥复制到单独的文件中。

      如果私钥是加密的,您可以使用CURLOPT_SSLKEYPASSWD指定密码。

      【讨论】:

      • SSL 证书只有在以 .pfx 格式使用时才有密码。我已经尝试使用您的建议,但仍然是同样的错误。
      • 你有对应的私钥吗? -----BEGIN PRIVATE KEY----- ?
      • 是的......我已经......正如你所说,我已经制作了一个单独的文件 -----BEGIN PRIVATE KEY----- 并在 CURLOPT_SSLKEY 中传递了它。 ..
      • 您的 cURL 版本是用 CyaSSL 而不是 OpenSSL 构建的吗?
      • .pem 证书 (ssl_file_relative_address.pem) 包含所有证书和私钥...顺便说一下,我使用的是 XAMPP(PHP、Mysql、Apache)...
      猜你喜欢
      • 2016-02-17
      • 2015-10-26
      • 1970-01-01
      • 2015-06-30
      • 1970-01-01
      • 2013-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多