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

时间:2014-02-19 17:03:04

标签: curl ssl windows-7 centos

我有一台远程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

5 个答案:

答案 0 :(得分:16)

带有NSS的

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

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

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

如果未使用--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禁止(明确不信任)
  •   
  • P Trusted peer
  •   
  • 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>

希望这有帮助。

答案 1 :(得分:9)

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

yum update -y nss curl libcurl

答案 2 :(得分:1)

发生了什么

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

可能的解决方案

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

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

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