我很欣赏这已被多次询问但在查看答案后我仍然收到以下错误:
Curl error: Peer certificate cannot be authenticated with known CA certificates
我有以下代码,该代码适用于非https版本的网站(不同的服务器),但是,它不能在运行https的实际网站上工作。我的假设是它尝试验证网站上的SSL证书,而不是$cert_path
中指定的.pem文件。
我说实话,我在SSLCERT
和CAINFO
之间感到困惑但是我已经将以下内容添加到我的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,它会连接,但我的假设是,这不会安全地传递数据?
谢谢。
答案 0 :(得分:0)
我已经成功实现了这项工作,但有一些事情需要注意,可能有助于将来的某些人。
我的最终代码如下:我也完全剥离了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);