我有一个远程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
带有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-tools(yum 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>
希望这可以帮助。
我最近在CentOS 6盒子里遇到了同样的问题。事实证明,服务器已经有一段时间没有更新,NSS版本太旧了。通过更新curl和NSS修复:
yum update -y nss curl libcurl
当服务器不支持ssl协议时,也会发出此错误,请尝试在server.xml文件中指定所有变体/协议。
当客户端和服务器之间的密码不重叠时,也会发生这种情况。
例如,服务器只接受ECHDE密码,但客户端(使用nss构建的一些旧版本curl)没有此密码。
在这种情况下,服务器将发送TCP RST到客户端,以便在发现没有密码重叠时终止SSL连接尝试(客户端将在“客户端问候”中包含支持的密码)。