у меня есть внутренний сервер (внутренний в моей сети), к которому я делаю 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, подробный файл был точно таким же, как указано выше.
Благодарю.
После публикации того же вопроса на веб-сайте cURL я получил несколько ответов, которые дали мне новые идеи, которые я попробовал и решил проблему, поэтому я решил опубликовать их здесь, на случай, если у кого-то еще возникнут похожие проблемы:
Первой подсказкой были сами коды ошибок (-12195, -12271, -12268). Кто-то дал мне URL, который объясняет их все:
http://www-archive.mozilla.org/projects/security/pki/nss/ref/ssl/sslerr.html
Я также вернулся и восстановил все свои сертификаты, следуя другому рецепту и используя более конкретные параметры. Я не могу сказать наверняка, что это имело значение (ошибки продолжали происходить), но без этого я уверен, что следующий шаг (последний, который сделал ошибку исчезающей), не будет работать …
Последний шаг (как это ни глупо) — использовать другой формат файла для сертификата CA. Вместо PEM я использую CRT. Как только я изменил его (без каких-либо других изменений), ошибка исчезла, и мои звонки начали работать.
Я надеюсь, что это поможет кому-то там …
Других решений пока нет …