在JavaScript / HTML中,Chrome报错此服务器无法证实它就是xxxxx - 它的安全证书没有指定主题备用名称

服务器的的ip地址是192.168.3.71,并且服务器没有域名,客户端是用ip访问服务器。客户端的浏览器提示:此服务器无法证实它就是 192.168.3.71 - 它的安全证书没有指定主题备用名称。该如何解决。

当客户端通过IP地址(如 192.168.3.71)访问服务器时,浏览器提示 "安全证书没有指定主题备用名称(Subject Alternative Name, SAN)" ,这是因为现代浏览器(如Chrome)要求SSL证书必须明确包含IP地址或域名在SAN字段中,仅依赖传统的 Common Name (CN) 已不再被接受。

以下是具体解决方案:


1. 生成支持IP地址的SSL证书

方法1:使用OpenSSL手动生成(推荐)
  1. 创建证书配置文件 (如 ssl.conf):

    conf 复制代码
    [req]
    default_bits = 2048
    prompt = no
    default_md = sha256
    distinguished_name = dn
    x509_extensions = v3_req
    
    [dn]
    CN = 192.168.3.71  # 可填写IP或任意名称(不重要)
    
    [v3_req]
    keyUsage = keyEncipherment, dataEncipherment, digitalSignature
    extendedKeyUsage = serverAuth
    subjectAltName = @alt_names
    
    [alt_names]
    IP.1 = 192.168.3.71  # 必须包含实际访问的IP地址
  2. 生成证书和私钥

    bash 复制代码
    openssl req -x509 -newkey rsa:2048 -nodes -keyout server.key -out server.crt -days 3650 -config ssl.conf -extensions v3_req
    • server.key: 私钥文件
    • server.crt: 证书文件
方法2:快速命令行生成(无配置文件)
bash 复制代码
openssl req -x509 -newkey rsa:2048 -nodes -keyout server.key -out server.crt -days 3650 -subj "/CN=192.168.3.71" -addext "subjectAltName=IP:192.168.3.71"
  • -addext 参数直接指定SAN扩展字段。

2. 配置服务器使用新证书

将生成的 server.crtserver.key 配置到Web服务器中:

  • Nginx示例

    nginx 复制代码
    server {
        listen 443 ssl;
        ssl_certificate /path/to/server.crt;
        ssl_certificate_key /path/to/server.key;
        # 其他配置...
    }
  • Apache示例

    apache 复制代码
    <VirtualHost *:443>
        SSLEngine on
        SSLCertificateFile /path/to/server.crt
        SSLCertificateKeyFile /path/to/server.key
        # 其他配置...
    </VirtualHost>

3. 在客户端安装证书

  1. 导出证书文件server.crt)并发送到客户端。

  2. 将证书导入客户端受信任的根证书颁发机构

    • Windows

      1. 双击 server.crt → 选择"安装证书" → 存储位置为"本地计算机" → 选择"受信任的根证书颁发机构"。
    • macOS

      1. 双击 server.crt → 钥匙串访问中选择"系统"钥匙串 → 右键证书选择"始终信任"。
    • Linux

      bash 复制代码
      sudo cp server.crt /usr/local/share/ca-certificates/
      sudo update-ca-certificates

4. 清除浏览器缓存并验证

  1. 清除HSTS缓存
    • 访问 chrome://net-internals/#hsts → 在"Delete domain security policies"输入 192.168.3.71 并删除。
  2. 强制刷新页面
    • Ctrl + Shift + R(Windows)或 Cmd + Shift + R(macOS)。
  3. 检查证书详情
    • 在Chrome中点击地址栏的"🔒"图标 → 查看证书,确认SAN字段包含 IP Address: 192.168.3.71

5. 其他注意事项

  • 自签名证书的局限性 :自签名证书需手动信任,适合内部网络。若需公网使用,可申请支持IP地址的公共证书(如DigiCert)。
  • 通配IP限制 :公共CA通常不签发包含私有IP(如 192.168.x.x)的证书,自签名是唯一选择。
  • 备用方案:若无法修改证书,可在客户端浏览器临时忽略警告(不推荐)。

验证命令

检查生成的证书是否包含SAN字段:

bash 复制代码
openssl x509 -in server.crt -text -noout | grep -A1 "Subject Alternative Name"

输出应包含:

复制代码
X509v3 Subject Alternative Name:
    IP Address:192.168.3.71

完成上述步骤后,Chrome将信任该证书并显示安全连接(🔒)。

相关推荐
掘金安东尼9 分钟前
让 JavaScript 更容易「善后」的新能力
前端·javascript·面试
掘金安东尼10 分钟前
用 HTMX 为 React Data Grid 加速实时更新
前端·javascript·面试
灵感__idea2 小时前
Hello 算法:众里寻她千“百度”
前端·javascript·算法
袋鼠云数栈UED团队3 小时前
基于 Lexical 实现变量输入编辑器
前端·javascript·架构
亦妤4 小时前
JS执行机制、作用域及作用域链
javascript
SuperEugene5 小时前
表单最佳实践:从 v-model 到自定义表单组件(含校验)
前端·javascript·vue.js
不会敲代码15 小时前
React性能优化:深入理解useMemo和useCallback
前端·javascript·react.js
YukiMori237 小时前
一个有趣的原型继承实验:为什么“男人也会生孩子”?从对象赋值到构造函数继承的完整推演
前端·javascript
摸鱼的春哥8 小时前
惊!黑客靠AI把墨西哥政府打穿了,海量数据被黑
前端·javascript·后端
小兵张健8 小时前
Playwright MCP 截图标注方案调研(推荐方案1)
前端·javascript·github