必须使用Punycode编码后的域名(如xn--6qq79v.xn--fiqs8s)配置Nginx的server_name和SSL证书,因Nginx、OpenSSL及DNS仅识别ASCII域名;中文域名需先转换,证书已含Punycode字段,配置一致即可启用HTTPS。

直接用 Punycode 编码后的域名配置 SSL 证书,Nginx 才能正确识别和加载证书。浏览器显示中文域名是前端自动转码的结果,而 Nginx、OpenSSL 和 DNS 层面只认 ASCII 域名,所以必须把“我的网站.中国”这类域名先转成 xn--6qq79v.xn--fiqs8s 再配置。
必须用 Punycode 域名配置 server_name
Nginx 的 server_name 指令不支持原始中文字符。即使你写成 server_name 我的网站.中国;,Nginx 启动时不会报错,但实际无法匹配请求,导致 404 或 fallback 到默认 server。
- 所有含中文、日文、阿拉伯文等非 ASCII 字符的域名,都需先转为 Punycode 格式
- 推荐使用权威工具转换:Verisign IDN 转换工具、ICANN 官方转换页,或命令行工具
idn(Linux/macOS 自带) - 例如:
idn --quiet --unicode "我的网站.中国"输出我的网站.中国,而idn --quiet --ascii "我的网站.中国"输出xn--6qq79v.xn--fiqs8s
SSL 证书文件本身无需特殊处理
证书颁发机构(如 Let’s Encrypt、GlobalSign、DigiCert)签发证书时,已按 RFC 5280 要求将国际化域名(IDN)以 Punycode 形式写入证书的 subjectAltName 字段。你拿到的 .crt 文件里,域名字段已经是 xn--6qq79v.xn--fiqs8s,不是“我的网站.中国”。
- 验证方法:用
openssl x509 -in your.crt -text -noout | grep DNS查看证书中记录的域名 - 只要你在 Nginx 配置里写的
server_name和证书里记录的 Punycode 域名完全一致,就能通过 SNI 匹配并启用 HTTPS - 不需要额外生成“中文版”证书,也不需要修改证书内容
完整配置示例(含 HTTP 重定向)
以下是一个可直接使用的 Nginx 配置片段,适用于中文域名 我的网站.中国:
server {
listen 80;
server_name xn--6qq79v.xn--fiqs8s;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name xn--6qq79v.xn--fiqs8s;
ssl_certificate /etc/nginx/ssl/xn--6qq79v.xn--fiqs8s/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/xn--6qq79v.xn--fiqs8s/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:...;
ssl_prefer_server_ciphers off;
root /var/www/my-site;
index index.html;
}
- 注意:证书路径中的目录名也建议用 Punycode,避免文件系统编码问题
- 若使用 Let’s Encrypt + Certbot,直接对 Punycode 域名申请即可:
certbot certonly --nginx -d xn--6qq79v.xn--fiqs8s - 微信小程序、App WebView 等客户端访问时,仍可输入
https://我的网站.中国,DNS 和 TLS 握手会自动完成 Punycode 映射
常见错误排查要点
如果配置后 HTTPS 不生效,优先检查这三项:
-
域名解析是否指向正确 IP:DNS A/AAAA 记录必须设置在 Punycode 域名上(如
xn--6qq79v.xn--fiqs8s),而不是中文原域名 -
证书是否覆盖该 Punycode 域名:用
openssl s_client -connect xn--6qq79v.xn--fiqs8s:443 -servername xn--6qq79v.xn--fiqs8s查看返回的证书 subjectAltName -
Nginx 是否加载了该配置:执行
nginx -t测试语法,再nginx -s reload生效;确认没有其他server_name _;或泛域名配置抢占匹配


















