比如客户端默认有 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 握手传输数据,但总觉得这是微信官方代码的锅。