证书换成 ECDSA 之后,新设备握手正常,几台 iPhone 6 和旧版微信内置浏览器提示无法建立安全连接。日志里能对上时间点,这种反而好排。

ECDSA 证书只能用 ECDHE 类套件,客户端不支持对应曲线时,协商阶段就没有交集。RSA 证书在这类老设备上反而更稳。这一点先确认清楚,后面就不用反复试。

openssl x509 -in cert.pem -noout -text | grep 'Public Key Algorithm'
ssl_certificate     /etc/nginx/cert/ecdsa.pem;
ssl_certificate     /etc/nginx/cert/rsa.pem;

这次卡住的地方就在「ECC 证书兼容」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

处理上按这个顺序:先确认证书链是 ECDSA 还是 RSA,用 openssl 看公钥算法;需要兼容老设备时同时配 ECDSA 和 RSA 两张证书,让服务端按客户端能力选;只留 ECDSA 时把 ssl_ciphers 里对应的套件写全,别让默认列表把它漏掉。

结果对不对很好判断,旧设备能正常打开,两种证书下 s_client 都能完成握手。

作者 9823189