如何使用无密码密钥验证cURL SSL请求及PEM私钥配置问题
问题原因
你遇到的unable to set private key file: 'D:\home\site\wwwroot\wp-content\themes\alfalah-theme\certificate.pem' type PEM错误,是因为当前cURL配置仅指定了证书文件路径,没有配置证书密码对应的参数,也没有正确关联私钥。
解决步骤
- 首先确认PEM文件格式:如果你的
cert.pem是同时包含证书和私钥的合并文件,需要确保文件结构完整:先存-----BEGIN CERTIFICATE-----开头的证书内容块,再存-----BEGIN PRIVATE KEY-----(如果是加密私钥则是-----BEGIN ENCRYPTED PRIVATE KEY-----)开头的私钥内容块,无多余乱码、多余空行。如果证书和私钥是分开的两个PEM文件,需要额外准备好私钥文件的路径。 - 补全cURL配置参数:你代码中已经定义了证书密码
$cert_password但没有传入cURL配置,需要新增两个可选配置:CURLOPT_SSLCERTPASSWD:必填,传入证书密码CURLOPT_SSLKEY:如果私钥是单独文件,填写私钥文件的绝对路径,私钥和证书合并在同一个PEM文件中可省略该配置
- 修复路径兼容性:Windows环境下直接用反斜杠拼接路径可能存在转义问题,建议用
DIRECTORY_SEPARATOR常量替换硬编码的反斜杠,提升兼容性 - 最后检查文件权限:确保PHP运行的站点进程账号(如Windows IIS的IUSR、站点应用池对应的账号)有
cert.pem(以及单独的私钥文件)的读取权限。
修正后代码片段
// 先修正证书路径写法,兼容性更好 $cert_file = __DIR__ . DIRECTORY_SEPARATOR . 'cert.pem'; // 如果私钥是单独文件,再加一行定义私钥路径 // $private_key_file = __DIR__ . DIRECTORY_SEPARATOR . 'private.pem'; $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => "https://remittex.bankalfalah.com/ePRCintegrationService/Service1.svc", CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_USERAGENT => $User_Agent, CURLOPT_SSL_VERIFYHOST => true, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => $xml_data, CURLOPT_HTTPHEADER => $headers, CURLOPT_SSLCERT => $cert_file, // 新增:传入证书密码 CURLOPT_SSLCERTPASSWD => $cert_password, // 如果私钥是单独文件,新增下面这行,否则可以注释/删除 // CURLOPT_SSLKEY => $private_key_file ));
内容的提问来源于stack exchange,提问作者Access Rights
相关产品推荐
相关产品推荐

