cURL SSL连接错误35与NSS错误-5961

问题描述 投票:18回答:5

我有一个远程Windows 7服务器,只能通过端口768上的HTTPS访问。服务器使用来自本地CentOS服务器中列出的CA的签名证书。

每当我尝试使用以下命令通过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标志)但没有成功。


我刚刚在运行Raspbian的Raspberry Pi上测试了相同的CURL命令,并且能够成功连接。因此,我认为在CentOS服务器上使用的cURL版本可能存在问题。 raspberry 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
curl ssl windows-7 centos
5个回答
16
投票

带有NSS的curl默认从Paz格式的"/etc/pki/tls/certs/ca-bundle.crt"读取根CA证书。

* Initializing NSS with certpath: sql:/etc/pki/nssdb
* CAfile: /etc/pki/tls/certs/ca-bundle.crt

您可以通过curl的选项NSS Shared DB和包含CA证书的PEM文件指定另一个(您的)CA证书(或--cacert上的捆绑包)。

如果未使用--cacert选项手动指定证书,NSS会尝试自动从NSS数据库(位于/etc/pki/nssdb)中选择正确的证书。您可以通过curl的选项--cert指定它的昵称,如果密钥嵌入在证书中,这应该足够了,否则您可以使用--key指定带有证书密钥的PEM文件。如果密钥受密码短语保护,您可以通过curl的选项--pass给它,这样您就可以使用nss-toolsyum install nss-tools)将证书导入NSS共享数据库

添加证书(通用命令行)

certutil -d sql:/etc/pki/nssdb -A -t <TRUSTARGS> -n <certificate nickname> -i <certificate filename>

关于TRUSTARGS

指定要在现有证书中修改的信任属性,或在创建证书或将其添加到数据库时应用于证书。

每个证书有三种可用的信任类别,按此顺序表示:“SSL,电子邮件,对象签名”。在每个类别位置使用以下零个或多个属性代码:

  • 禁止(明确不信任)
  • P值得信赖的同行
  • c有效的CA.
  • T值得信任的CA颁发客户端证书(暗示c)
  • C受信任的CA颁发服务器证书(仅限SSL)(隐含c)
  • u证书可用于身份验证或签名
  • 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>

希望这可以帮助。


9
投票

我最近在CentOS 6盒子里遇到了同样的问题。事实证明,服务器已经有一段时间没有更新,NSS版本太旧了。通过更新curl和NSS修复:

yum update -y nss curl libcurl

1
投票

发生了什么

听起来好像在连接到Windows 7服务器时遇到超时问题。

可能的解决方案

一个可能的answer表明错误的根本原因5961被证明是网络MTU设置问题。目前尚不清楚您是否可以访问Windows 7服务器或环境的完整组件,以确定导致连接失败的超时的确切原因。我会检查Windows 7 Server的MTU并将MTU设置与其他服务器的MTU设置进行比较。如果您发现需要修改设置,可以按照此procedure进行操作。


1
投票

当服务器不支持ssl协议时,也会发出此错误,请尝试在server.xml文件中指定所有变体/协议。


0
投票

当客户端和服务器之间的密码不重叠时,也会发生这种情况。

例如,服务器只接受ECHDE密码,但客户端(使用nss构建的一些旧版本curl)没有此密码。

在这种情况下,服务器将发送TCP RST到客户端,以便在发现没有密码重叠时终止SSL连接尝试(客户端将在“客户端问候”中包含支持的密码)。

© www.soinside.com 2019 - 2024. All rights reserved.