无法使用客户端证书(没有找到密钥或错误的密码?)

时间:2016-03-01 19:22:52

标签: php ssl curl soap ssl-certificate

我正在尝试使用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收到以下错误:无法使用客户端证书(找不到密钥或错误的密码短语?)

我做错了什么......

2 个答案:

答案 0 :(得分:1)

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

{{1}}

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

感谢@ drew010寻求帮助。

答案 1 :(得分:0)

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

您还需要使用CURLOPT_SSLKEY来提供cURL以及证书的相应私钥,-----BEGIN PRIVATE KEY-----是以ssl_file_relative_address.pem开头的文件。

如果私钥位于CURLOPT_SSLKEYPASSWD,请尝试将私钥复制到单独的文件中。

如果私钥已加密,您可以使用public static MvcHtmlString Test<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) { var someCondition = false; if (someCondition) { // Return some domain specific html. return new MvcHtmlString("<div></div>"); } else { var result = expression.Compile(); TModel model = html.ViewData.Model; var value = result(model); var r = new MvcHtmlString(value.ToString()); return r; } } 指定密码。