2

我正在尝试使用带有 WolfSSL 的 tls1.2 将嵌入式设备连接到 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截图中可以看出,客户端支持以下密码套件;

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 个声誉时,我将用常规链接替换它们 :)

4

1 回答 1

1

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

但是,对于将来遇到这种情况的用户...

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

在构建 wolfSSL 库以连接到任何谷歌服务器时,您能否尝试将这些定义添加到您的默认设置中:

#define HAVE_SUPPORTED_CURVES
#define HAVE_TLS_EXTENSIONS

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

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

wolfSSL_UseSupportedCurve(ssl, <CURVE NAME>);

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

于 2017-01-19T23:49:17.657 回答