使用TLSv1.2的curl可以在客户机上工作,但不能在服务器上工作


curl with TLSv1.2 works on client but not on server

在我的ubuntu 14.04 LTS-server SSLv2和SSLv3被禁用。我在服务器上运行不同的应用程序。一个应用程序需要使用curl来连接托管在同一台机器上的另一个应用程序。

问题是,连接工作在我的ubuntu 14.04 tls - kde客户端,但不是在我的服务器本身。

在服务器和客户端上运行相同的curl-和openssl-版本:

$ curl --version
curl 7.35.0 (x86_64-pc-linux-gnu) libcurl/7.35.0 OpenSSL/1.0.1f zlib/1.2.8 libidn/1.28 librtmp/2.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp smtp smtps telnet tftp
Features: AsynchDNS GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP
$ openssl version
OpenSSL 1.0.1f 6 Jan 2014

在客户端我得到

$ sudo curl -X HEAD -D - https://server.foobar.net:443/owncloud/remote.php/carddav/addressbooks/foobar/kontakte/
HTTP/1.1 401 Unauthorized
Date: Wed, 09 Sep 2015 04:46:55 GMT
Server: Apache
Set-Cookie: oc6c79ce288a=hcv4snboaf31v9a4nnse5g8ts3; path=/owncloud; HttpOnly
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Frame-Options: Sameorigin
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; frame-src *; img-src *; font-src 'self' data:; media-src *; connect-src *
X-Robots-Tag: none
WWW-Authenticate: Basic realm="ownCloud"
Content-Type: application/xml; charset=utf-8

在服务器上我得到

$ sudo curl -X HEAD -D - https://server.foobar.net:443/owncloud/remote.php/carddav/addressbooks/foobar/kontakte/
curl: (35) error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol

请告诉我正确的方向。

如果客户端不支持TLS 1.2,可能会发生这种情况。您可以使用TLS 1.1和TLS 1.0作为备用选项。要检查SSL配置是否有效,请使用SSL实验室(https://www.ssllabs.com/ssltest/)。这可以帮助找到错误的配置。

您也可以尝试在curl-request中添加--no-check-certificate

在另一篇文章中,你可以读到:

一个简单的测试是使用wget(或浏览器)来请求http://example.com:443(注意是http://,而不是https://);如果成功了,443端口未启用SSL。要进一步调试,请使用opensslS_client带有-debug选项,在错误信息之前转储服务器响应的前几个字节,其中OpenSSL是无法解析。这可能有助于识别问题,特别是如果服务器不回应一个ServerHello消息。看看是什么正是OpenSSL所期望的,检查源代码:查找ssl/s23_clnt.c. SSL_R_UNKNOWN_PROTOCOL

无论如何,查看apache错误日志也可以提供一些见解。

我通过https://www.ssllabs.com/ssltest/检查了服务器,ist说证书是有效的,服务器支持TLS 1.2, 1.1和1.0。

你也可以尝试在curl-request中添加——no-check-certificate。

我还尝试了-k选项与curl(我认为——no-check-certificate不能与curl一起使用,但与wget一起使用),结果相同。在apache日志中,我什么也看不见;我想是因为连接试图通过SSL进入。

对于openssl s_client -debug server.foobar.net:443/owncloud/remote.php/carddav/addressbooks/foobar/kontakte/,我得到这个:

140093535233696:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:795:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 295 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
编辑:现在我明白了!在我的服务器的/etc/hosts中有一个错误的配置。