Назад | Перейти на главную страницу

Вызов 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, подробный файл был точно таким же, как указано выше.

Спасибо.

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

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

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

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

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

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