.NET 8 Kestrel本地IP自签SSL证书报ERR_CERT_COMMON_NAME_INVALID错误
解决自签SSL证书访问IP地址时的NET::ERR_CERT_COMMON_NAME_INVALID错误
问题场景
我尝试通过以下配置生成自签SSL证书:
证书配置文件(san.cnf)
[req] default_bits = 2048 distinguished_name = req_distinguished_name req_extensions = req_ext x509_extensions = v3_req prompt = no [req_distinguished_name] countryName = BR stateOrProvinceName = SC localityName = PB organizationName = MyCompany CN = 20.14.3.12 // 本地IPv4 [req_ext] subjectAltName = @alt_names [v3_req] subjectAltName = @alt_names [alt_names] IP.1 = 20.14.3.12 // 本地IPv4
生成证书的OpenSSL命令
openssl req -x509 -days 36500 -newkey rsa:2048 -keyout key.key -out cert.crt -config san.cnf
后续配置
- 将
cert.crt导入Microsoft Management Console的Root Certification Authorities目录 - .NET 8项目的
appsettings.json中配置Kestrel:
"Kestrel": { "Endpoints": { "HttpsInlineCertAndKeyFile": { "Url": "https://20.14.3.12:7142", "Certificate": { "Path": "./Utils/Certificates/cert.crt", // 路径正确 "KeyPath": "./Utils/Certificates/key.key", "Password": "mypassword" } } } }
应用正常监听https://20.14.3.12:7142,但访问Swagger时出现错误:
NET::ERR_CERT_COMMON_NAME_INVALID
备注:使用localhost替代IP时一切正常,只需将配置文件中的IP.1改为DNS.1即可。
原因分析
现在主流浏览器不认证书CN字段里的IP地址,必须在**Subject Alternative Name(SAN)**扩展里明确指定IP才行。虽然你的配置文件里已经加了SAN的IP条目,但可能是下面这些原因导致报错:
- 生成证书时没正确加载扩展配置
- 浏览器缓存了旧的无效证书
- 证书没导入到正确的根证书目录
解决步骤
重新生成证书并检查SAN扩展
生成证书后,用下面的命令确认证书里有没有正确的SAN扩展:openssl x509 -in cert.crt -text -noout看输出里有没有
X509v3 Subject Alternative Name字段,里面必须包含IP Address:20.14.3.12。清理浏览器缓存
- Chrome按
Ctrl+Shift+Del,选择“缓存的图片和文件”清理,然后重启浏览器 - Edge/Firefox操作类似,清完缓存再访问试试
- Chrome按
确认证书导入位置正确
- 按Win+R输入
mmc打开控制台,添加“证书”管理单元,选择“本地计算机”或“当前用户” - 确保
cert.crt在受信任的根证书颁发机构 -> 证书目录下,且证书的“使用者备用名称”里包含目标IP
- 按Win+R输入
检查Kestrel配置
确认证书路径和密码都正确,应用启动时没有报错。可以查看启动日志,确认没有证书加载失败的提示。
内容的提问来源于stack exchange,提问作者Guilherme Santana
相关产品推荐
相关产品推荐

