ошибка соединения curl SSL 35 с ошибкой NSS -5961
у меня есть удаленный сервер Windows 7, который доступен только через HTTPS на порту 768. Сервер использует подписанный сертификат из центра сертификации, указанного на локальном сервере CentOS.
всякий раз, когда я пытаюсь получить доступ к удаленному серверу через cURL с помощью следующей команды, он выдает следующие ошибки:
[usr@serv 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
5 ответов
curl
С NSS прочитайте корневые сертификаты 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 общая БД) по варианту curl --cacert
с файлом PEM, содержащим сертификат(ы) CA.
если вы не укажете сертификат вручную с помощью --cacert
опция, NSS пытается выбрать правильный из базы данных NSS (находится в /etc/pki/nssdb
) автоматически. Вы можете укажите его ник с помощью опции curl --cert
, этого должно быть достаточно, если ключ встроен в сертификат, если нет, вы можете указать файл PEM с ключом сертификата, используя --key
. Если ключ защищен парольной фразой, вы можете дать его опцией curl --pass
таким образом, вы можете импортировать свой сертификат в общую БД NSS с помощью НСС-инструменты (yum install nss-tools
)
добавление сертификата (общая команда line)
certutil -d sql:/etc/pki/nssdb -A -t <TRUSTARGS> -n <certificate nickname> -i <certificate filename>
о TRUSTARGS
укажите атрибуты доверия, которые необходимо изменить в существующем сертификате или применить к сертификату при его создании или добавлении в базу данных.
существует три категории доверия для каждого сертификата, выражается в таком порядке: "SSL, email, подпись объекта". В каждом позиция категории используйте ноль или более следующих кодов атрибутов:
- p запрещено (явно не доверяют)
- P доверенный peer
- C действительный CA
- T доверенный CA для выдачи сертификатов клиента (подразумевает c)
- C доверенный CA для выдачи сертификатов сервера (только SSL) (подразумевает c)
- сертификат у можно использовать для удостоверения подлинности или подписания
- w отправить предупреждение (используйте с другими атрибутами, чтобы включить предупреждение, когда сертификат используется в этом контексте)
коды атрибутов для категорий, разделенных запятыми, и весь набор атрибутов, заключенный в кавычки. Например:
- t "TCu, Cu, Tuw"
доверие корневому сертификату CA для выдачи сертификатов сервера 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 DB
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>
надеюсь, что это помогает.
недавно я столкнулся с той же проблемой в коробке CentOS 6. Оказалось, что сервер не обновлялся уже довольно давно и версия NSS была слишком старой. Исправлено путем обновления curl и NSS:
yum update -y nss curl libcurl
что происходит
Это звучит так, как будто вы испытываете проблему тайм-аута при подключении к серверу Windows 7.
Возможные Решения
один из возможных ответ указывает на первопричину ошибки 5961 оказалась проблема настройки MTU сети. Неясно, есть ли у вас доступ к серверу Windows 7 или полным компонентам среды, чтобы определить точную причину тайм-аута это приводит к сбою соединения. Я бы проверил MTU сервера Windows 7 и сравнил настройку MTU с настройкой других серверов. Если вы обнаружите, что вам нужно изменить настройки, вы можете следовать этому процедура.
эта ошибка также выдается, когда протокол ssl не поддерживается сервером, попробуйте указать все варианты / протоколы на сервере.XML-файл.
Это произойдет, когда шифры между клиентом и сервером не перекрываются.
например, сервер принимает только шифр ECHDE, но клиент (некоторая старая версия curl, построенная с nss) не имел этого шифра.
в этом случае сервер сначала отправит TCP клиенту для завершения попытки подключения SSL, когда он обнаружит, что шифр не перекрывается (клиент будет включать поддерживаемый шифр в "клиент hello").