it-swarm.com.ru

SSL-сертификат или удаленный ключ SSH не были в порядке

Я тестирую API, который использует функцию curl_exec php и сертификат CA, но что-то идет не так, и я немного растерялся.

Я настроил SSL на моем Apache VirtualHost и выглядит нормально (открытие https:://[myVHost]... работает).

Однако вызов API curl возвращает мне это сообщение: 

  • SSL peer certificate or SSH remote key was not OK

Я не очень разбираюсь в SSL, поэтому у меня мало идей о причинах этого.

Обновление:

Это код, который я использую в своем запросе cURL, я прокомментировал 2 строки и изменил их значение (посмотрите на строку 'TODO'), и таким образом он работает, однако это всего лишь работа вокруг ...

$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);
9
WonderLand

Вероятно, вы используете самозаверяющий сертификат SSL, который не пройдет, если установлены параметры CURLOPT_SSL_VERIFYPEER.

Есть два решения: 

  1. Купите действующий сертификат SSL.
  2. Отключить проверку SSL в Curl. ( добавить опцию --insecure )

Если вы отключите проверку, вы не сможете быть уверены, действительно ли вы общаетесь с вашим Хостом . Так что это зависит от уровня безопасности, который вам нужен.

4
Daniel Milde

Хотя я отвечаю на старый пост, я думаю, что это поможет новым зрителям

Вы можете проверить проблему, добавив

$opts[CURLOPT_VERBOSE] = 1

Для самозаверяющего сертификата ваш клиент может подключиться к серверу, используя IP-адрес, поскольку имя хоста недоступно в кеше DNS. В этом случае COMMON NAME (CN) сертификата сервера должен совпадать с IP-адресом сервера (укажите IP-адрес как общее имя при создании сертификата сервера). Когда вы делаете это правильно, вы можете увидеть это сообщение: 

общее имя: 192.168.0.1 (соответствует)

Здесь 192.168.0.1 является примером.

2
rrsuj

Кроме CURLOPT_SSL_VERIFYPEER есть еще две настройки, которые можно изменить на false/0:

CURLOPT_SSL_VERIFYHOST
CURLOPT_SSL_VERIFYSTATUS

Помните, что вы должны исправить свои сертификаты SSL и настройки вместо того, чтобы отключить безопасность!

1
waibelp

Я была такая же проблема. Я следую инструкции здесь: 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

0
Andrew

Вы можете создать действительный сертификат SSL и убедиться, что он хранится в надежной папке. 

Действительный сертификат SSL можно создать, включив в команду разработчика следующую команду VS2012. (Это можно получить, набрав в начале разработчика)

Следующая команда создает самозаверяющий сертификат, который можно использовать для тестирования веб-приложения, использующего протокол 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 22.12.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.

теперь созданный сертификат находится в папке PERSONAL. Скопируйте его и вставьте в ДОВЕРЕННУЮ ПАПКУ ЛЮДЕЙ.

Это должно сделать свое дело. Дайте мне знать, если это не сработает. 

0
Abhishek

Вы правы, если хотите включить SSL_VERIFYPEER, если беспокоитесь о нападениях типа «человек посередине».

Ваш $path установлен для указания на сертификат (или пакет сертификатов), предоставленный владельцем API? Этот сертификат читается пользователем веб-сервера? Если да, проверили ли вы, что сертификат (ы) такой же, как когда вы посещаете адрес https вручную в браузере и проверяете сертификат?

Если вы не можете заставить его работать, и API, к которому вы подключаетесь, имеет сертификат SSL, который работает в вашем обычном браузере без предупреждений, вы сможете установить $path для своего корневого пакета CA на своем сервере.

0
Jhong