给中文域名申请证书,CA 后台显示签发成功,浏览器访问却报证书名称与网站名称不匹配,看证书里是一串 xn-- 开头的字符。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

idn2 中文.example
openssl x509 -in cert.pem -noout -ext subjectAltName

国际化域名在证书里只能存 punycode 形式,申请时填了中文原文,签出来的 SAN 跟浏览器实际发送的编码对不上。两边编码必须统一。这一点先确认清楚,后面就不用反复试。

「IDN 证书不匹配」这类改动最怕改一半,回滚脚本先准备好,再动生产。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

具体做法是,先把中文域名转成 punycode,用转换工具或 idn2 命令,别手敲;申请时 SAN 填转换后的形式,需要覆盖带 www 的也一并加上;签完用 openssl 看 SAN 列表,确认跟访问地址一致。

改完照着核一遍,证书 SAN 里显示 xn-- 开头的域名,浏览器不再报名称不匹配。

作者 9823189