使用 TLSv1.2 的 curl 适用于客户端,但不适用于服务器
curl with TLSv1.2 works on client but not on server
在我的 ubuntu 14.04 LTS 服务器上禁用了 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 Labs (https://www.ssllabs.com/ssltest/)。这可以帮助找到任何错误的配置。
您也可以尝试在您的 curl-request 中添加 --no-check-certificate
。
在另一个 post 上,您可以阅读:
A simple test is to use wget (or a browser) to request
http://example.com:443 (note the http://, not https://); if it works,
SSL is not enabled on port 443. To further debug this, use openssl
s_client with the -debug option, which right before the error message
dumps the first few bytes of the server response which OpenSSL was
unable to parse. This may help to identify the problem, especially if
the server does not answer with a ServerHello message. To see what
exactly OpenSSL is expecting, check the source: look for
SSL_R_UNKNOWN_PROTOCOL in ssl/s23_clnt.c.
无论如何,查看 apache 错误日志也可能提供一些见解。
希望这对您有所帮助。
我通过 https://www.ssllabs.com/ssltest/ 检查了服务器,ist 说证书有效并且服务器支持 TLS 1.2、1.1 和 1.0。
You could also try to add --no-check-certificate within your curl-request.
我还尝试了 curl 的 -k 选项(我认为 --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 中有一个错误的配置。
在我的 ubuntu 14.04 LTS 服务器上禁用了 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 Labs (https://www.ssllabs.com/ssltest/)。这可以帮助找到任何错误的配置。
您也可以尝试在您的 curl-request 中添加 --no-check-certificate
。
在另一个 post 上,您可以阅读:
A simple test is to use wget (or a browser) to request http://example.com:443 (note the http://, not https://); if it works, SSL is not enabled on port 443. To further debug this, use openssl s_client with the -debug option, which right before the error message dumps the first few bytes of the server response which OpenSSL was unable to parse. This may help to identify the problem, especially if the server does not answer with a ServerHello message. To see what exactly OpenSSL is expecting, check the source: look for SSL_R_UNKNOWN_PROTOCOL in ssl/s23_clnt.c.
无论如何,查看 apache 错误日志也可能提供一些见解。
希望这对您有所帮助。
我通过 https://www.ssllabs.com/ssltest/ 检查了服务器,ist 说证书有效并且服务器支持 TLS 1.2、1.1 和 1.0。
You could also try to add --no-check-certificate within your curl-request.
我还尝试了 curl 的 -k 选项(我认为 --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 中有一个错误的配置。