Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php EPP呼叫上的客户端证书_Php_Ssl_Curl_Ssl Certificate_Epp - Fatal编程技术网

Php EPP呼叫上的客户端证书

Php EPP呼叫上的客户端证书,php,ssl,curl,ssl-certificate,epp,Php,Ssl,Curl,Ssl Certificate,Epp,我试图在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_seto

我试图在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\u SSLKEY
选项单独提供

我猜证书是从CA颁发给您的,并安装在您的浏览器中。发生这种情况时,浏览器会将私钥存储在与证书分离的安全位置(取决于操作系统和浏览器)

大多数浏览器不允许您在不加密(提供密码)的情况下导出证书和私钥。但是根据PEM文件的内容,没有相应的私钥

要解决此问题,您可能需要执行以下几个步骤:

  • 再次从浏览器导出证书,并确保其中包含私钥
  • Win/Linux上的Chrome和Windows上的Internet Explorer将要求您输入密码。证书应导出为PKCS#12(.p12)文件
现在的问题是私钥是加密的,据我所知,cURL需要对私钥进行解密

  • 使用
    openssl
    解密私钥,并将证书和密钥导出为PEM格式
  • openssl pkcs12-in cert.p12-nodes
    (这将要求您在从浏览器导出时输入用于加密的密码)(cert.p12是pkcs12格式的证书和私钥。
    -nodes
    允许私钥在不加密的情况下导出)
这将以PEM格式打印到标准输出证书和密钥

您应该看到两个部分:

-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----


您很可能已经拥有证书,但需要将私钥保存到另一个文件中由于它在服务器上未加密,请务必正确设置权限,通常
0400
,因此其他用户无法访问它

我认为问题在于您的证书文件不包含私钥,并且没有使用指向证书对应私钥的
CURLOPT\u SSLKEY
选项单独提供

我猜证书是从CA颁发给您的,并安装在您的浏览器中。发生这种情况时,浏览器会将私钥存储在与证书分离的安全位置(取决于操作系统和浏览器)

大多数浏览器不允许您在不加密(提供密码)的情况下导出证书和私钥。但是根据PEM文件的内容,没有相应的私钥

要解决此问题,您可能需要执行以下几个步骤:

  • 再次从浏览器导出证书,并确保其中包含私钥
  • Win/Linux上的Chrome和Windows上的Internet Explorer将要求您输入密码。证书应导出为PKCS#12(.p12)文件
现在的问题是私钥是加密的,据我所知,cURL需要对私钥进行解密

  • 使用
    openssl
    解密私钥,并将证书和密钥导出为PEM格式
  • openssl pkcs12-in cert.p12-nodes
    (这将要求您在从浏览器导出时输入用于加密的密码)(cert.p12是pkcs12格式的证书和私钥。
    -nodes
    允许私钥在不加密的情况下导出)
这将以PEM格式打印到标准输出证书和密钥

您应该看到两个部分:

-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----


您很可能已经拥有证书,但需要将私钥保存到另一个文件中由于该证书在服务器上未加密,请务必正确设置权限,通常为
0400
,以便其他用户在导出证书时无法访问该证书

证书是否包含私钥?@drew010否,即使我从comodo买了一个付费ssl,但这也不能解决我的问题。你想做什么
CURLOPT_SSLCERT
用于指定用于与远程服务器进行身份验证的客户端身份验证证书。一些CA使用它们代替密码登录来管理您的帐户,但客户端证书并不常见。您是在寻找
CURLOPT_CAINFO
吗?@drew010我尝试了这两种方法,但都无效,网站希望我在请求时使用客户端证书。OK只是确认一下。问题是cURL似乎没有客户端证书的私钥,这会导致错误“无法设置私钥文件”。您的crt文件似乎是PEM格式,所以它应该是base64编码的。它是否包含一行
----开始加密私钥------
----开始RSA私钥------
或您是否只看到
----开始证书------
?当您导出证书时,它是否包含私钥?@drew010否,即使我从comodo买了一个付费ssl,但这也不能解决我的问题。你想做什么
CURLOPT_SSLCERT
用于指定用于与远程服务器进行身份验证的客户端身份验证证书。一些CA使用它们代替密码登录来管理您的帐户,但客户端证书并不常见。您是在寻找
CURLOPT_CAINFO
吗?@drew010我尝试了这两种方法,但都无效,网站希望我在请求时使用客户端证书。OK只是确认一下。问题是cURL似乎没有客户端证书的私钥,这会导致错误“无法设置私钥文件”。您的crt文件似乎是PEM格式,因此