比如客户端默认有 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 握手传输数据,但总觉得这是微信官方代码的锅。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.