我正在尝试在 curl 调用中使用 cacert.org 提供的免费客户端证书。检查以下...
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://url.com');
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_SSLCERT, 'cert.crt');
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
我已将证书下载为 PEM,现在出现以下错误...
unable to set private key file: 'cert.crt' type PEM
我已经尝试了所有方法但无法修复,也尝试了谷歌。请帮忙。
最佳答案
我认为问题在于您的证书文件不包含私钥,并且没有使用指向相应私钥的 CURLOPT_SSLKEY
选项单独提供证书的 key 。
我猜证书是由 CA 颁发给您并安装在您的浏览器中。发生这种情况时,浏览器会将私钥存储在与证书分开的安全位置(取决于操作系统和浏览器)。
大多数浏览器不允许您在不加密(提供密码)的情况下导出证书和私钥。但是根据你的PEM文件的内容,没有对应的私钥。
要解决这个问题,您可能需要执行以下几个步骤:
- 再次从浏览器中导出证书并确保其中包含私钥
- Win/Linux 上的 Chrome 和 Windows 上的 Internet Explorer 将要求您输入密码。证书应导出为 PKCS#12 (.p12) 文件
现在的问题是私钥是加密的,据我所知cURL需要解密
- 使用
openssl
解密私钥并将证书和 key 导出为PEM格式 openssl pkcs12 -in cert.p12 -nodes
(这将询问您从浏览器导出时用于加密的密码)(cert.p12 是 PKCS12 格式的证书和私钥。-nodes
允许私钥不加密导出)
这将以 PEM 格式将证书和 key 打印到标准输出。
您应该看到两个部分:
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
和
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
您很可能已经拥有证书,但您需要将私钥保存到另一个文件中。 由于它在服务器上未加密,请务必正确设置权限,通常为 0400
,这样其他用户就无法访问它
关于php - EPP 调用上的客户端证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34164068/