比如客户端默认有 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 握手传输数据,但总觉得这是微信官方代码的锅。
1
rrfeng 2018-05-29 16:46:13 +08:00 via Android
现在为了安全一般都是 prefer server side cipher suite 并且直接禁用有危险的旧算法。
这个没毛病,除非 server 只支持有问题的旧算法。 |
2
3dwelcome OP @rrfeng 问题是密码套件列表里有一大堆并不算旧的算法,服务器从里面选一个自己支持的,也比直接返回握手失败来的好。
我现在是用 RSA(TLS_DHE_RSA_WITH_AES_128_GCM_SHA256)连接的,用着没啥问题。但是如果在 ClientHello 里,把 RSA 和 ECC 同时都塞进去,服务器就会直接返回握手失败,并主动断开连接,也是非常的郁闷。 你不支持 ECC,那就在备选库里,挑选一个支持的加密算法多好,反正最终都是服务器来决定的。但强行断开,也未免太霸道了点。 |
3
wr410 2018-05-29 16:56:11 +08:00
这种前端 SSL 接入基本上是硬件接入,也许人家的接入设备就不支持 ECC 算法 SSL 嘛。
|
4
est 2018-05-29 16:57:51 +08:00 1
我能说我就是用这个特性做反爬的么。。。一大堆换 ip 改 http 头的的爬虫都不知道自己怎么死的。23333
|