Я делаю это:
$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_CAINFO, getcwd().'/public.pem');
curl_setopt($ch, CURLOPT_SSLCERT, getcwd().'/private.key');
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, '1234');
curl_setopt($ch, CURLOPT_SSLKEYPASSWD, '1234');
curl_setopt($ch, CURLOPT_URL, "http://api-xxxxxx.duosecurity.com/auth/v2/preauth");
$dataa = curl_exec($ch);
Я получаю эту ошибку: unable to use client certificate (no key found or wrong pass phrase?)
Что мне не хватает? Если код в порядке, не могли бы вы, пожалуйста, как сгенерировать пару сертификатов для этой цели используется либо openssl
ИЛИ ЖЕ ssh-keygen
?
Вот как вы подключаетесь к Yahoo через HTTPS
$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-v-s-server-certificates.aspx
Узнав, что первоначальный вопрос касается API duosecurity, а не обычного http-соединения Yahoo, я посмотрел на API-документы duo и 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 (ПАРОЛЬ) и SSLKEY (ПАРОЛЬ), чтобы включить сертификаты на стороне клиента. Маловероятно, что вашим сертификатам на стороне клиента требуется CA — CURLOPT_CAINFO используется только для идентификации партнера, а не для вас.
Других решений пока нет …