卷曲SSL请求400错误请求

时间:2014-08-21 20:26:01

标签: php curl ssl https openssl

我正在尝试使用php和curl发出请求。下面是我在命令行中使用的一个工作示例

curl -k --cacert c:/cert/server_ca.pem  --cert c:/cert/signed_client_cert.pem --key c:/cert/cert_req_rsa_private_key.pem 
继续我到目前为止所说的,它返回了一个400错误的请求,有没有人知道我怎么能得到更多有用的错误或者我可能做错了什么?

ini_set('display_errors',1);
//phpinfo();

$cert = "C:/cert/signed_client_cert.pem";
$key = "C:/cert/cert_req_rsa_private_key.pem";
$pass = "key1123";
$caInfo = "C:/cert/server_ca.pem";


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.apitest.com/v/2/products/04003274058");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/xml'));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_CAINFO, $caInfo);
curl_setopt($ch, CURLOPT_SSLCERT, $cert);
curl_setopt($ch, CURLOPT_SSLKEY, $key);
curl_setopt($ch, CURLOPT_VERBOSE, true);
//curl_setopt($ch, CURLOPT_SSLCERTPASSWD, $pass);
//curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');
//curl_setopt($ch, CURLOPT_SSLKEYPASSWD, $pass);
//curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');


$response = curl_exec($ch);
echo curl_error($ch);
echo var_dump($response);

2 个答案:

答案 0 :(得分:2)

curl命令不完整,因此很难说出可能(或可能不同)的内容。但是从命令行开始,Curl使用Accept: */*;并且不使用Content-Type(参见下面的curl www.google.com的Wireshark捕获)。

要阅读AcceptContent-Type之间的差异,请参阅网站管理员堆栈交换上的Difference between accept and content-type http headers

enter image description here


只是自行车脱落,但这有改进的余地:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

如果您觉得必须使用它,请选择匿名协议。它将保存服务器不发送其证书,因为无论如何都没有验证。

答案 1 :(得分:0)

奇怪的是这个问题似乎是Php卷曲中的一个错误,我切换到httprequest并且它有效