ssl — PHP cURL-вызов, возвращающий ошибку 56 с ошибкой NSS -12195

у меня есть внутренний сервер (внутренний в моей сети), к которому я делаю REST API звонок от моего внешний сервер.

Я не знаю, помогает ли это, но внешний сервер работает php 5.3.6 с CURL 7.19,7.

Чтобы сделать его более безопасным (кроме брандмауэра, который ограничивает внешние IP-адреса, которые могут вызывать мой внутренний сервер только статический IP-адрес моего внешний сервер), я сгенерировал самозаверяющий сертификат сервера SSL для моего внутреннего сервера.

Я также сгенерировал Сертификат клиента быть использованным моим внешний сервер при совершении звонков.

Звонки осуществляются с использованием cURL библиотека PHP. Страница, которая выполняет вызовы, выглядит следующим образом (эта страница была создана как «доказательство концепции», чтобы увидеть, что вызов действительно может быть выполнен):

<?php

$mycurl = curl_init();
$verbose = fopen('curl_error_log','a');
$url_site = 'https://internal.server.com/api_test.php';

$options = array(
CURLOPT_HEADER => false
,CURLOPT_RETURNTRANSFER => true
,CURLOPT_VERBOSE => true
,CURLOPT_STDERR => $verbose
,CURLOPT_HTTPHEADER => array('Accept: application/json')
,CURLOPT_CAINFO => realpath('/certs/server/certs.pem')
,CURLOPT_CAPATH => realpath('/certs/server')
,CURLOPT_SSL_VERIFYPEER => true
,CURLOPT_SSL_VERIFYHOST => 2
,CURLOPT_SSLCERT => realpath('/certs/client.crt.pem')
,CURLOPT_SSLKEY => realpath('/certs/client.key.pem')
,CURLOPT_SSLCERTTYPE => 'PEM'
,CURLOPT_URL => $url_site
);

curl_setopt_array($mycurl, $options);
$webResponse =  curl_exec($mycurl);
fclose($verbose);

?>
<html>
<head>
<title></title>
</head>
<body>
<p>Error: <?php echo curl_error($mycurl); ?></p>
<p>Error no.: <?php echo curl_errno($mycurl); ?></p>
<p>Result: <?php echo $webResponse; ?></p>
</body>
</html>

НОТА: предыдущая итерация этого «доказательства концепции», без использования Сертификат клиента работал красиво. В этой версии CURLOPT_VERIFYPEER а также CURLOPT_VERIFYHOST были установлены на ЛОЖНЫЙ и все SSL … а также CA … варианты отсутствовали.

Возвращающаяся страница выглядит так:

Error: SSL read: errno -12195

Error no.: 56

Result:

И подробный файл (curl_error_log) имеет это:

* About to connect() to internal.server.com port 443 (#0)
*   Trying 111.222.333.444... * connected
* Connected to internal.server.com (111.222.333.444) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
*   CAfile: /certs/server/certs.pem
CApath: /certs/server
* SSL connection using TLS_DHE_RSA_WITH_AES_128_CBC_SHA
* Server certificate:
*   subject: CN=internal.server.com,OU=BI,O=ABC Corp,L=City,ST=State,C=CO
*   start date: Apr 13 15:15:38 2015 GMT
*   expire date: Apr 12 15:15:38 2016 GMT
*   common name: internal.server.com
*   issuer: CN=internal.server.com,OU=BI,O=ABC Corp,L=City,ST=State,C=CO
> GET /api_test.php HTTP/1.1
Host: internal.server.com
Accept: application/json

* NSS: client certificate from file
*   subject: CN=internal.server.com,OU=BI,O=ABC Corp,L=City,ST=State,C=CO
*   start date: Apr 13 15:26:48 2015 GMT
*   expire date: Apr 12 15:26:48 2016 GMT
*   common name: internal.server.com
*   issuer: CN=internal.server.com,OU=BI,O=ABC Corp,L=City,ST=State,C=CO
* SSL read: errno -12195
* Closing connection #0

Любые идеи о том, что я делаю неправильно или чего не хватает? Почему я получаю эту ошибку?

РЕДАКТИРОВАТЬ: Я пытался играть с CURLOPT_SSLVERSION =>. Сначала я установил его на 3 и ошибка немного изменилась. Я все еще получил точно такой же подробный вывод, но ближе к основанию, где он читает «SSL прочитано: errno -12195«, стало «SSL прочитано: errno -12271».

Затем я меняю версию на 2, и он разбился раньше, дав мнеОшибка NSS -12268«вокруг строки 6 подробного вывода.

Наконец, когда я попытался 4 или же 5, подробный файл был точно таким же, как указано выше.

Благодарю.

0

Решение

После публикации того же вопроса на веб-сайте cURL я получил несколько ответов, которые дали мне новые идеи, которые я попробовал и решил проблему, поэтому я решил опубликовать их здесь, на случай, если у кого-то еще возникнут похожие проблемы:

Первой подсказкой были сами коды ошибок (-12195, -12271, -12268). Кто-то дал мне URL, который объясняет их все:

http://www-archive.mozilla.org/projects/security/pki/nss/ref/ssl/sslerr.html

Я также вернулся и восстановил все свои сертификаты, следуя другому рецепту и используя более конкретные параметры. Я не могу сказать наверняка, что это имело значение (ошибки продолжали происходить), но без этого я уверен, что следующий шаг (последний, который сделал ошибку исчезающей), не будет работать …

Последний шаг (как это ни глупо) — использовать другой формат файла для сертификата CA. Вместо PEM я использую CRT. Как только я изменил его (без каких-либо других изменений), ошибка исчезла, и мои звонки начали работать.

Я надеюсь, что это поможет кому-то там …

1

Другие решения

Других решений пока нет …