无法使用客户端证书(未找到密钥或密码短语错误?)

unable to use client certificate(no key found or wrong pass phrase?)

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

要求是

We need to pass the ssl certificate and pass the Username and Password

    $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 收到以下错误:无法使用客户端证书(未找到密钥或密码短语错误?)

我做错了什么...

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

您还需要使用 CURLOPT_SSLKEY 向 cURL 提供证书的相应私钥,这是一个以 -----BEGIN PRIVATE KEY-----.

开头的文件

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

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

找到解决方案。它需要中级 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 的帮助。