Я тестирую API, который использует curl_exec
php-функцию и сертификат CA, но что-то идет не так, и я немного потерялся.
Я настроил SSL на свой apache VirtualHost и выглядит нормально (открытие https:://[myVHost]
… работает).
Однако вызов curl API возвращает мне это сообщение:
SSL peer certificate or SSH remote key was not OK
Я не очень разбираюсь в SSL, поэтому у меня мало идей о причине этого.
ОБНОВИТЬ:
Это код, который я использую в своем запросе cURL, я прокомментировал 2 строки и изменил их значение (посмотрите на строку «TODO»), и таким образом он работает, но это всего лишь работа arround …
$opts[CURLOPT_URL] = $url; $opts[CURLOPT_RETURNTRANSFER] = true; $opts[CURLOPT_CONNECTTIMEOUT] = 50; $opts[CURLOPT_TIMEOUT] = 100; $headers = array( 'Accept: application/json', "User-Agent: APIXXX-PHP-Client"); $opts[CURLOPT_HTTPHEADER] = $headers; $opts[CURLOPT_USERPWD] = $env->getApiKey() . ':'; if (certificatePresent()) { // $opts[CURLOPT_SSL_VERIFYPEER] = true; // $opts[CURLOPT_SSL_VERIFYHOST] = 2; // TODO: SET IT BACK $opts[CURLOPT_SSL_VERIFYPEER] = 0; $opts[CURLOPT_SSL_VERIFYHOST] = 0; $opts[CURLOPT_CAINFO] = $path } curl_setopt_array($curl, $opts); $response = curl_exec($curl);
Вероятно, вы используете самоподписанный SSL-сертификат, который не будет передан, если установлены параметры CURLOPT_SSL_VERIFYPEER.
Существует два решения:
Если вы отключите проверку, вы не можете быть уверены, действительно ли вы общаетесь с хостом. Так что это зависит от уровня безопасности, который вам нужен.
Хотя я отвечаю на старый пост, я думаю, что это поможет новым зрителям –
Вы можете проверить проблему, добавив
$opts[CURLOPT_VERBOSE] = 1
Для самоподписанного сертификата ваш клиент может подключаться к серверу с использованием IP-адреса, потому что имя хоста недоступно в кеше DNS. В этом случае COMMON NAME (CN) вашего сертификата сервера должно совпадать с IP-адресом сервера (при создании сертификата сервера укажите IP-адрес как общее имя). Когда вы сделаете это правильно, вы увидите это сообщение:
общее имя: 192.168.0.1 (соответствует)
Здесь пример 192.168.0.1.
Вы правы, когда хотите включить SSL_VERIFYPEER
если вы беспокоитесь о атаках «человек в середине».
Является ли ваш $path
установленным для указания сертификата (или пакета сертификатов), предоставленного владельцем API? Этот сертификат читается пользователем веб-сервера? Если да, подтвердили ли вы, что сертификат (ы) совпадает с тем, когда вы вручную посещаете адрес https в браузере и проверяете сертификат?
Если вы не можете заставить его работать, а API, к которому вы подключаетесь, имеет сертификат SSL, который работает в вашем обычном браузере без предупреждений, вы должны установить $path
для вашего корневого пакета CA на своем сервере.
Вы можете создать действительный сертификат SSL и убедиться, что он хранится в надежной папке.
Действительный сертификат SSL можно создать, включив в командную строку разработчика VS2012
. (Это можно получить, набрав разработчика в начале)
Следующая команда создает самозаверяющий сертификат, который может быть использован для тестирования веб-приложения, использующего Secure Sockets Layer (SSL) на веб-сервере с URL-адресом www.example.com
. OID, определяемый параметром -eku
идентифицирует этот сертификат как SSL server certificate
. Сертификат хранится в моем магазине и доступен на уровне машины (а не на пользователе). Закрытый ключ сертификата является экспортируемым, а сертификат действителен с May 10, 2010 through December 22, 2011
.
Makecert -r -pe -n CN = "www.example.com" -b 05/10/2010 -e 12/22/2011 -eku 1.3.6.1.5.5.7.3.1 -ss my -sr localmachine -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12
Подробнее о том, как создать сертификат SSL
Теперь убедитесь, что этот сертификат доверен, это можно сделать, набрав CERTMGR
в cmd.
теперь созданный сертификат находится в папке ПЕРСОНАЛ. скопируйте его и вставьте его в ПАДЕНЦИЮ НАПРЯЖЕННЫХ ЛЮДЕЙ.
Это должно сделать трюк. Дайте мне знать, если это не сработает.
Я была такая же проблема. Я следую инструкциям здесь: http://siteber.com/download-failed-ssl-peer-certificate-or-ssh-remote-key-was-not-ok/, и он исправил мою.
в основном я пошел в /etc/resolv.conf
и заменить
Сервер OpenDNS:
208.67.222.222
208.67.220.220
С
Общие DNS-серверы Google:
nameserver 8.8.8.8 nameserver 8.8.4.4
Рядом с CURLOPT_SSL_VERIFYPEER
есть два других параметра, которые могут быть изменены на false
/ 0
:
CURLOPT_SSL_VERIFYHOST CURLOPT_SSL_VERIFYSTATUS
Помните, что вы должны исправить свои сертификаты и настройки SSL вместо отключения безопасности!