Сбой проверки SSL-сертификата с помощью Kohana - PullRequest
2 голосов
/ 21 марта 2012

Я пытаюсь использовать HTTPS в моей локальной среде с Kohana, но он выдает следующую ошибку, кто-нибудь знает, как это исправить?

Request_Exception [ 0 ]: Error fetching remote /protected/someFunctionCall.json [ status 0 ] SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

Я строю по почтовым запросам так:

$url = "https://www.foobar.com:18443";          
$data = http_build_query($params);

// This uses POST - http://kohanaframework.org/3.2/guide/kohana/requests#external-requests
$request = Request::factory($url)
        ->method(Request::POST)
        ->body($data)
        ->headers('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');

$response = $request->execute();

Я сгенерировал свои собственные сертификаты с OpenSSL, следуя этому руководству:

(ответ Саймона): Как разрешить HTTPS для Apache на локальном хосте?

1 Ответ

4 голосов
/ 21 марта 2012

Скорее всего, вы видите эту ошибку, потому что вы используете самозаверяющий сертификат, которому клиент SSL не доверяет.Я не знаком с Kohana или PHP, но я думаю, что клиент, вероятно, использует openssl под прикрытием.Где-то должен быть файл с именем что-то вроде cacerts.pem или ca-bundle.crt, который содержит якоря доверия.Эти якоря доверия являются сертификатами CA, которым доверяет клиентское программное обеспечение.Если сервер использует сертификат, выданный одним из этих ЦС, вы не должны получить ошибку.То, что вы можете попробовать, это добавить свой самоподписанный сертификат сервера в конец файла сертификата CA (например, cacerts.pem).Убедитесь, что ваш сертификат в формате PEM при добавлении.Сертификат в формате PEM ограничивается следующими строками:

  • -----BEGIN CERTIFICATE-----

  • -----END CERTIFICATE-----

В качестве альтернативы, может быть какая-то опция, чтобы сказать клиенту принять любой сертификат сервера.Не очень хорошая практика безопасности, но хорошо, как временное решение, если вы просто попробуете что-то самостоятельно.Например, в cURL есть возможность сделать это.

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

Правильный подход в cURL - указать файл, содержащий якоря доверия.Этот фрагмент кода основан на статье, на которую я ссылаюсь ниже.

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, getcwd() . "/CAcerts/MyTrustedCerts.crt")

Использование CURLOPT_CAINFO, позволяет указать имя файла, содержащего ваши доверительные якоря.Этот файл должен содержать один или несколько сертификатов, которые клиентское программное обеспечение будет использовать для проверки сертификатов сервера.

Кроме того, CURLOPT_SSL_VERIFYHOST, установленный в 2, указывает cURL проверить наличие общего имени, а также убедиться, что оно соответствует указанному имени хоста.В рабочих средах значение этой опции должно быть равно 2 (значение по умолчанию).

Эта статья Использование cURL в PHP для доступа к сайтам, защищенным HTTPS (SSL / TLS) имеет некоторые обходные пути /исправляет эту ошибку при использовании cURL в PHP.

...