clientHello之后的SSL handshake_failure

时间:2016-02-11 14:00:45

标签: ssl smtpclient tls1.2 handshake wolfssl

我正在尝试使用tls1.2与WolfSSL将嵌入式设备连接到smtp.gmail.com:465。该库创建并发送以下clientHello消息并接收握手失败。

16 03 03 00 4f 01 00 00  4b 03 03 2e 2a ec 85 7f
15 dd 09 5f 22 d1 53 82  60 d7 80 67 28 aa 67 48 
ce f0 71 ab 63 d0 b2 3e  55 3a 05 00 00 14 c0 27 
c0 23 c0 0a c0 09 c0 07  c0 08 c0 14 c0 13 c0 11 
c0 12 01 00 00 0e 00 0d  00 0a 00 08 04 03 02 03 
04 01 02 01

这是收到的消息;

15 03 03 00 02 02 28

wireshark screenshot可以看出,客户端支持以下密码套件;

TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (0xc027)
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 (0xc023)
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (0xc00a)
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (0xc009)
TLS_ECDHE_ECDSA_WITH_RC4_128_SHA (0xc007)
TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA (0xc008)
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (0xc014)
**TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (0xc013)**
**TLS_ECDHE_RSA_WITH_RC4_128_SHA (0xc011)**
TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA (0xc012)

...并且客户端支持以下签名算法(请参阅屏幕截图底部的十六进制部分,wireshark不解码签名算法)

04 03: SHA256 EDCSA
02 03: SHA1   EDCSA
04 01: SHA256 RSA
02 01: SHA1   RSA

另一方面,smtp.gmail.com支持以下密码套件; (这是通过在这里运行脚本获得的:“superuser.com/questions/109213/how-do-i-list-the-ssl-tls-cipher-suites-a-particular-website-offers”)

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
**TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA**
**TLS_ECDHE_RSA_WITH_RC4_128_SHA**
TLS_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_128_CBC_SHA
SSL_RSA_WITH_RC4_128_SHA
SSL_RSA_WITH_RC4_128_MD5
TLS_RSA_WITH_AES_256_GCM_SHA384
TLS_RSA_WITH_AES_256_CBC_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA
SSL_RSA_WITH_3DES_EDE_CBC_SHA

从上面可以看出,这两个套房相匹配。

  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  • TLS_ECDHE_RSA_WITH_RC4_128_SHA

而且,我已经在“www.digicert.com/help/”(使用“smtp.gmail.com:465”)检查了证书,并得到了这个:Digicert Screenshot

  • 签名算法= SHA256 + RSA(优秀)

这也匹配

根据“tools.ietf.org/html/rfc5246#section-7.2.2”

  Reception of a handshake_failure alert message indicates that the
  sender was unable to negotiate an acceptable set of security
  parameters given the options available.  This is a fatal error.

据我了解,握手套件和签名算法不匹配还存在其他原因,因为handshake_failure或者我遗漏的东西非常大。我正在寻找失败的原因,但我无法找到。我会感激任何帮助或任何想法。握手失败的原因是什么?

对于无法点击的链接,我感到非常抱歉。 stackoverflow不允许我添加2个以上的链接。当有10个声誉时,我会用常规链接替换它们:)

1 个答案:

答案 0 :(得分:1)

我刚刚遇到这个,我意识到这已经很久了。我很遗憾没有早点找到这个。

对于将来遇到这种情况的用户而言......

我知道连接到过去6-9个月内发生变化的Google服务器时的要求。如果客户端hello数据包不包含支持的曲线扩展名,Google服务器将完全忽略任何连接尝试。

您是否可以尝试在构建wolfSSL库时将这些定义添加到默认设置,以便连接到任何Google服务器:

#define HAVE_SUPPORTED_CURVES
#define HAVE_TLS_EXTENSIONS

(对应的配置选项是:" - enable-supportedcurves"它将定义上述两个预处理器宏)

并使用API​​在任何客户端应用程序中加载至少一条支持的曲线:

wolfSSL_UseSupportedCurve(ssl, <CURVE NAME>);

支持的曲线列表可以在(wolfssl-root)/wolfcrypt/src/ecc.c顶部的评论部分找到