curl with TLSv1.2适用于客户端,但不适用于服务器

时间:2015-09-09 05:36:19

标签: php curl openssl libcurl php-openssl

在我的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

请指出正确的方向。

2 个答案:

答案 0 :(得分:0)

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

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

在另一个post上,您可以阅读:

  

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

在任何情况下,查看apache错误日志也可能提供一些见解。

希望这有帮助。

答案 1 :(得分:0)

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

  

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

我还尝试了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中,配置错误。