php - cURL 无法使用客户端证书(未找到 key 或密码短语错误?)

标签 php ssl curl

我已经阅读并尝试了不同帖子中的数千种解决方案,但似乎没有一种适合我。这三个就是例子。

cURL is unable to use client certificate , in local server

php openssl_get_publickey() and curl - unable to use client certificate (no key found or wrong pass phrase?)

Getting (58) unable to use client certificate (no key found or wrong pass phrase?) from curl

我收到了一个 .p12 证书,我在 https://www.sslshopper.com/ssl-converter.html 中将其转换为 .pem 文件

密码正确,否则无法转换。

$xml = 'my xml here';
$url = 'https://qly.mbway.pt/Merchant/requestFinancialOperationWS';

$headers = array( 
    'Content-Type: text/xml; charset="utf-8"', 
    'Content-Length: ' . strlen($xml), 
    'Accept: text/xml', 
    'Cache-Control: no-cache', 
    'Pragma: no-cache'
); 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_TIMEOUT, 60); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSLCERT, base_url() . 'public/cert.pem');
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, 'my password here');
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); 

$data = curl_exec($ch); 

if(!$data)
    print_r('ERROR: ' . curl_error($ch));
else
    print_r('SUCCESS: ' . curl_error($ch));

我已经尝试使用 SoapUI 应用程序并且工作正常但是使用 cURL 我收到错误:

unable to use client certificate (no key found or wrong pass phrase?)

我试过没有成功:

  1. 禁用 CURLOPT_SSL_VERIFYPEER 和/或 CURLOPT_SSL_VERIFYHOST
  2. 添加 CURLOPT_SSLKEYTYPE 和/或 CURLOPT_SSLKEY 字段

编辑 1:

除了 cURL 之外,我一直在尝试使用 SOAPClient,似乎错误可能出在 header 上。

print_r($soapClient) 之后的标题如下:

Host: qly.mbway.pt
Connection: Keep-Alive
User-Agent: PHP-SOAP/5.5.9-1ubuntu4.14
Content-Type: application/soap+xml; charset=utf-8; action=""
Content-Length: 1750

我想知道如何删除 action=""?我试图在更改 header 方面扩展原始类但没有成功。

class MySoapClient extends SoapClient 
{   
   public function __construct($wsdl, $options = array())
   {
     $ctx_opts = array('http' => array('header' => array('Content-Type' => 'application/soapyyyyyml')));

     $ctx = stream_context_create($ctx_opts);

     parent::__construct($wsdl, array('stream_context' => $ctx));
   }
}

最佳答案

通过 cURL 解决

问题是 pem 文件的路径。

我正在使用 base_url() 。 'public/cert.pem' 但这是不可能的。相反,我需要使用一个相对路径,例如 ./public/cert.pem

关于php - cURL 无法使用客户端证书(未找到 key 或密码短语错误?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33740014/

相关文章:

Java SSL 客户端-服务器 : unable to find valid certification

ssl - 是否必须使用 SSL?

java - 在 Java 中为 SOLR curl 等效的 POST

linux - 从不同目录运行 BASH 脚本时出现问题(目录在路径中)

PHP数据库连接类问题

php - 如何将php数组中的不同变量加在一起

php - 如何在 Yii Framework 中获取当前路由器?

php - 使用 PHP 从标记名中有冒号的 RSS 提要获取附件标记

c++ - Microsoft Windows SChannel SSPI 自检?

python - curl --noproxy "*"相当于 Python 的请求模块