api.weixin.qq.com 有个比较严重的问题,客户端指定了若干可选密码套件,最终由服务器来决定用什么加密算法。可是微信 SSL 大概率是自己实现的,主动选择了一个并不支持的算法,然后直接返回握手失败!

2018-05-29 16:38:32 +08:00
 3dwelcome

比如客户端默认有 ECC 椭圆加密算法,ECDHE-ECDSA-AES256-SHA 或者 ECDHE-ECDSA-AES128-GCM-SHA256,和别的算法放在一起,组成一个可选加密套件列表,加到 ClientHello 里,发到微信服务器。

照常理,微信服务器并不应该自己选择一个不支持的算法,应该退一步,选择一个已经支持的算法,然后就可以握手成功。然而,他把不支持的 ECC 作为首选,结果自然是握手失败。

复现方法,以证明微信 API 服务器并不支持椭圆算法:

openssl s_client -connect api.weixin.qq.com:443 -cipher ECDHE-ECDSA-AES256-SHA


openssl s_client -connect api.weixin.qq.com:443 -cipher ECDHE-ECDSA-AES128-GCM-SHA256


实际场景中,很多算法比如 RSA,微信都是支持的,可是人家服务器很骄傲,偏偏就不愿意选老算法,非要选最新算法,于是握手 100 次,失败 100 次,进入死循环节奏。

最终是在客户端把 ECC 套件去掉了,顺利用 RSA 握手传输数据,但总觉得这是微信官方代码的锅。

3268 次点击
所在节点    全球工单系统
6 条回复
rrfeng
2018-05-29 16:46:13 +08:00
现在为了安全一般都是 prefer server side cipher suite 并且直接禁用有危险的旧算法。

这个没毛病,除非 server 只支持有问题的旧算法。
3dwelcome
2018-05-29 16:55:32 +08:00
@rrfeng 问题是密码套件列表里有一大堆并不算旧的算法,服务器从里面选一个自己支持的,也比直接返回握手失败来的好。

我现在是用 RSA(TLS_DHE_RSA_WITH_AES_128_GCM_SHA256)连接的,用着没啥问题。但是如果在 ClientHello 里,把 RSA 和 ECC 同时都塞进去,服务器就会直接返回握手失败,并主动断开连接,也是非常的郁闷。

你不支持 ECC,那就在备选库里,挑选一个支持的加密算法多好,反正最终都是服务器来决定的。但强行断开,也未免太霸道了点。
wr410
2018-05-29 16:56:11 +08:00
这种前端 SSL 接入基本上是硬件接入,也许人家的接入设备就不支持 ECC 算法 SSL 嘛。
est
2018-05-29 16:57:51 +08:00
我能说我就是用这个特性做反爬的么。。。一大堆换 ip 改 http 头的的爬虫都不知道自己怎么死的。23333
rrfeng
2018-05-29 16:59:03 +08:00
@est
机智...
3dwelcome
2018-05-29 16:59:14 +08:00
@est 高手啊,还有这操作,学到了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/458701

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX