这就是您通过 HTTPS 连接到 yahoo 的方式
$ch = curl_init();
curl_setopt($ch, CURLOPT_VERBOSE, '1');
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, '2');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, '1');
curl_setopt($ch, CURLOPT_URL, "https://m.yahoo.com/");
$dataa = curl_exec($ch);
您不使用客户端证书与 HTTPS 主机通信。
浏览器/客户端不使用客户端证书的原因多种多样,无法在此处列出。
似乎客户端证书是一种验证或登录网站的方法 - 它们不是加密与服务器的通信的一部分。
https://en.wikipedia.org/wiki/Client_certificate
https://pilif.github.io/2008/05/why-is-nobody-using-ssl-client-certificates/
http://blogs.msdn.com/b/kaushal/archive/2012/02/18/client-certificates-vs-server-certificates.aspx
更新
在得知最初的问题涉及 duosecurity 的 API,而不是常规的 yahoo http 连接后,我查看了 duo 的 API 文档和 JS & PHP 客户端库。我找不到对客户端 SSL 证书的任何引用。
要回过头来解决“找不到密钥或密码错误”的原始错误,我们应该查看 CURLOPT_* 设置。
在原始问题中,使用 curlopt 设置错误地识别了证书和密钥。
$ch = curl_init();
curl_setopt($ch, CURLOPT_VERBOSE, '1');
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, '2');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, '1');
curl_setopt($ch, CURLOPT_SSLCERT, getcwd().'/public.pem');
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, '1234');
curl_setopt($ch, CURLOPT_SSLKEY, getcwd().'/private.key');
curl_setopt($ch, CURLOPT_SSLKEYPASSWD, '1234');
curl_setopt($ch, CURLOPT_URL, "http://api-xxxxxx.duosecurity.com/auth/v2/preauth");
$dataa = curl_exec($ch);
使用 SSLCERT(PASSWORD) 和 SSLKEY(PASSWORD) 启用客户端证书。您的客户端证书不太可能需要 CA - CURLOPT_CAINFO 仅用于帮助识别对等方,而不是您自己。