CURL Ошибка подключения SSL 35 с ошибкой NSS -5961
У меня есть удаленный сервер Windows 7, доступный только через HTTPS на порту 768. Сервер использует подписанный сертификат из ЦС, указанного на локальном сервере CentOS.
Всякий раз, когда я пытаюсь получить доступ к удаленному серверу через cURL, используя следующую команду, он выдает следующие ошибки:
[[email protected] certs]# curl -3 -v https://1.1.1.1:768/user/login
* About to connect() to 1.1.1.1 port 768 (#0)
* Trying 1.1.1.1... connected
* Connected to 1.1.1.1 (1.1.1.1) port 768 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none
* NSS error -5961
* Closing connection #0
* SSL connect error
curl: (35) SSL connect error
(Обратите внимание, что IP-адрес был скрыт по соображениям безопасности).
Я запускаю следующую версию cURL:
curl 7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
Стоит отметить, что это работает на двух других удаленных серверах, которые работают под управлением Windows XP, а не Windows 7.
Я попытался заставить cURL использовать SSLv3 (используя флаг -3 и флаг -SSLv3) без успеха.
Я только что проверил ту же команду CURL на Raspberry Pi, которая работает с Raspbian, и успешно смогла подключиться. Поэтому я считаю, что это может быть проблема с версией cURL, используемой на сервере CentOS. Малина pi запускает следующую версию:
curl 7.26.0 (arm-unknown-linux-gnueabihf) libcurl/7.26.0 OpenSSL/1.0.1e zlib/1.2.7 libidn/1.25 libssh2/1.4.2 librtmp/2.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap pop3 pop3s rtmp rtsp scp sftp smtp smtps telnet tftp
Features: Debug GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP
Ответы
Ответ 1
curl
, когда NSS читает сертификаты Root CA по умолчанию от "/etc/pki/tls/certs/ca-bundle.crt"
в формате PEM.
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
Вы можете указать другой (ваш) сертификат CA (или пакет в NSS Shared DB) с помощью параметра curl --cacert
с файлом PEM, содержащим сертификат CA ( с).
Если вы не укажете сертификат вручную с помощью параметра --cacert
, NSS будет автоматически выбирать правильный из базы данных NSS (расположенный в /etc/pki/nssdb
). Вы можете указать его псевдоним с помощью параметра curl --cert
, этого должно быть достаточно, если ключ встроен в сертификат, если вы не можете указать файл PEM с помощью ключа сертификата с помощью --key
. Если ключ защищен парольной фразой, вы можете дать ему параметр curl --pass
, чтобы вы могли импортировать свой сертификат в общую БД NSS с помощью nss-tools (yum install nss-tools
)
Добавление сертификата (общая командная строка)
certutil -d sql:/etc/pki/nssdb -A -t <TRUSTARGS> -n <certificate nickname> -i <certificate filename>
О TRUSTARGS
Укажите атрибуты доверия для изменения в существующем сертификате или для применения к сертификату при его создании или добавления в базу данных.
Существует три доступных категории доверия для каждого сертификата, выраженный в этом порядке: "SSL, электронная почта, подписка на объект". В каждом категория position использует ноль или более следующих кодов атрибутов:
- p запрещено (явно не доверено)
- P Доверенный peer
- c Действительный CA
- T Надежный ЦС для выдачи клиентских сертификатов (подразумевает c)
- C Надежный ЦС для выдачи сертификатов сервера (только для SSL) (подразумевается c)
- u Сертификат может использоваться для аутентификации или подписания.
- w Отправить предупреждение (использовать с другими атрибутами для включения предупреждения, когда сертификат используется в этом контексте)
Коды атрибутов для категорий разделяются запятыми и весь набор атрибутов, заключенных в кавычки. Например:
-t "TCu, Cu, Tuw"
Доверяя корневому сертификату ЦС для выдачи сертификатов сервера SSL
certutil -d sql:/etc/pki/nssdb -A -t "C,," -n <certificate nickname> -i <certificate filename>
Импорт промежуточного сертификата CA
certutil -d sql:/etc/pki/nssdb -A -t ",," -n <certificate nickname> -i <certificate filename>
Доверяя сертификат самозаверяющего сервера
certutil -d sql:/etc/pki/nssdb -A -t "P,," -n <certificate nickname> -i <certificate filename>
Добавление личного сертификата и закрытого ключа для проверки подлинности SSL-клиента
pk12util -d sql:/etc/pki/nssdb -i PKCS12_file_with_your_cert.p12
Список всех сертификатов, хранящихся в базе данных NSS
certutil -d sql:/etc/pki/nssdb -L
Сведения о листинге сертификата
certutil -d sql:/etc/pki/nssdb -L -n <certificate nickname>
Удаление сертификата
certutil -d sql:/etc/pki/nssdb -D -n <certificate nickname>
Надеюсь, что это поможет.
Ответ 2
Что происходит
Звучит так, как будто вы испытываете проблему с таймаутом при подключении к серверу Windows 7.
Возможные решения
Один из возможных ответов указывает, что основная причина ошибки 5961 оказалась проблемой настройки сетевого MTU. Неясно, есть ли у вас доступ к серверу Windows 7 или к полным компонентам среды, чтобы определить точную причину таймаута, вызывающего сбои подключения. Я бы проверил MTU на сервере Windows 7 и сравнил настройку MTU с настройками других серверов. Если вы обнаружите, что вам нужно изменить настройки, вы можете следовать этой процедуре .
Ответ 3
Эта ошибка также выдается, когда протокол ssl не поддерживается сервером. Попробуйте указать все варианты/протоколы в файле server.xml.
Ответ 4
Недавно я столкнулся с той же проблемой в окне CentOS 6. Оказалось, что сервер не обновлялся довольно долго, а версия NSS была слишком старой. Исправлено обновлением как curl, так и NSS:
yum update -y nss curl libcurl
Ответ 5
Это также произойдет, когда шифры между клиентом и сервером не перекрываются.
Например, сервер принимает только шифр ECHDE, но клиент (какой-то старый curl, построенный с помощью nss) не имел этого шифрования.
в этом случае сервер отправит TCP RST клиенту для прекращения попытки подключения SSL, когда обнаружит, что не перекрывается шифрование (клиент будет включать поддерживаемый шифр в "приветствие клиента" ).