使用CURLOPT_SSLCERT在https服务器上进行卷曲身份验证错误

时间:2017-04-24 09:21:56

标签: php ssl curl

我很欣赏这已被多次询问但在查看答案后我仍然收到以下错误:

Curl error: Peer certificate cannot be authenticated with known CA certificates

我有以下代码,该代码适用于非https版本的网站(不同的服务器),但是,它不能在运行https的实际网站上工作。我的假设是它尝试验证网站上的SSL证书,而不是$cert_path中指定的.pem文件。

我说实话,我在SSLCERTCAINFO之间感到困惑但是我已经将以下内容添加到我的php.ini文件中并检查以确保它们&# 39;重新设置正确,它们是。

// php.ini
curl.cainfo = "/path/to/.pem";
openssl.cafile = "/path/to/.pem";

正如我之前所说,以下内容适用于网站的舞台版本,而不是现场版本。任何帮助将不胜感激。

// php curl snippet
$cert_path = '/path/to/.pem';

$options = array(
    CURLOPT_SSL_VERIFYHOST => true,
    CURLOPT_SSL_VERIFYPEER => true,
    CURLOPT_SSLCERT => $cert_path,
    CURLOPT_SSLCERTPASSWD => $password,
    CURLOPT_CAINFO => $cert_path,
    CURLOPT_HTTPAUTH => CURLAUTH_ANY,
    CURLOPT_URL => $url,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $xml_post_string,
    CURLOPT_HTTPHEADER => $headers
);      

curl_setopt_array( $ch, $options );

如果我将VERIFYPEER设置为false,它会连接,但我的假设是,这不会安全地传递数据?

谢谢。

1 个答案:

答案 0 :(得分:0)

我已经成功实现了这项工作,但有一些事情需要注意,可能有助于将来的某些人。

  1. 该网站由123reg托管,我们得到他们的支持通知我不接受第三方SSL证书。虽然我被告知这最终我的代码确实有效。
  2. 我重新生成了我的.pem文件,所以这对我有利。
  3. 我的最终代码如下:我也完全剥离了php.ini代码。

    // These two variables will differ depending on your payload for Curl
    $xml_post_string = '...';
    $headers = array();
    
    // This will differ based on your endpoint
    $url = 'endpoint.url';
    
    $password = 'password'; 
    $cert_path = '/path/to/.pem';
    
    $ch = curl_init();
    
    $options = array(
        CURLOPT_SSL_VERIFYHOST => 2,
        CURLOPT_SSL_VERIFYPEER => true,
        CURLOPT_SSLCERT => $cert_path,
        CURLOPT_SSLCERTTYPE => "PEM",
        CURLOPT_SSLCERTPASSWD => $password,
        CURLOPT_HTTPAUTH => CURLAUTH_ANY,
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => $xml_post_string,
        CURLOPT_HTTPHEADER => $headers
    );
    
    curl_setopt_array( $ch, $options );
    
    $response = curl_exec($ch); 
    curl_close($ch);