OpenSSL 1.0.2u环境下curl与TLSv1.2 DHE-RSA服务器握手失败排查
问题描述
在Linux主机上使用基于OpenSSL 1.0.2u的curl访问某站点,通过nmap探测该站点443端口(Apache服务),发现仅支持以下TLSv1.2密码套件:
PORT STATE SERVICE VERSION 443/tcp open ssl/http Apache httpd | ssl-enum-ciphers: | TLSv1.2 | Ciphers (4) | TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 | TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 | TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 | TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 | Compressors (1) |_ uncompressed
我认为本地OpenSSL 1.0.2u对应的兼容密码套件为:
DHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH Au=RSA Enc=AESGCM(256) Mac=AEAD DHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=AESGCM(128) Mac=AEAD
但curl连接时出现握手错误,日志如下:
* TLSv1.2 (IN), TLS handshake, Hello request (0): * TLSv1.2 (OUT), TLS handshake, Client hello (1): * TLSv1.2 (IN), TLS handshake, Server hello (2): * TLSv1.2 (IN), TLS handshake, Certificate (11): * TLSv1.2 (IN), TLS handshake, Server key exchange (12): * TLSv1.2 (IN), TLS handshake, Request CERT (13): * TLSv1.2 (IN), TLS handshake, Server finished (14): * TLSv1.2 (OUT), TLS handshake, Certificate (11): * TLSv1.2 (OUT), TLS handshake, Client key exchange (16): * TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1): * TLSv1.2 (OUT), TLS handshake, Finished (20): * TLSv1.2 (IN), TLS alert, handshake failure (552): * OpenSSL SSL_read: error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure, errno 0 * Closing connection 0 curl: (56) OpenSSL SSL_read: error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure, errno 0
请问我遗漏了什么?
问题分析与解决
从握手日志里能看到关键细节:服务器发送了Request CERT(请求客户端证书)的消息,说明这台Apache服务器配置了双向TLS认证,要求客户端必须提供合法证书才能完成握手,但你的curl请求没有携带客户端证书,这才是握手失败的核心原因。
你之前关注的密码套件其实没有问题——OpenSSL 1.0.2u确实支持那两个GCM套件,而且服务器也兼容,所以密码套件不是问题所在。
解决思路:
- 如果你有该站点要求的客户端证书(一般是.pem或.p12格式),用curl的
--cert参数指定证书路径;若证书有密码保护,再加--pass参数;如果证书和私钥是分离的,还要用--key参数指定私钥文件。 - 可以先尝试执行
curl --insecure https://目标站点域名测试,但如果服务器强制要求客户端证书,这个方法无效,还是得提供对应证书。 - 若服务器本不该要求客户端证书,联系管理员调整Apache的SSL配置,关闭双向认证要求。
内容的提问来源于stack exchange,提问作者Jdamian
相关产品推荐
相关产品推荐

