在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将信任该证书并显示安全连接(🔒)。

相关推荐
艾小码3 小时前
零基础学JavaScript:手把手带你搭建环境,写出第一个程序!
javascript
北海-cherish8 小时前
vue中的 watchEffect、watchAsyncEffect、watchPostEffect的区别
前端·javascript·vue.js
AALoveTouch9 小时前
网球馆自动预约系统的反调试
javascript·网络
新中地GIS开发老师11 小时前
Cesium 军事标绘入门:用 Cesium-Plot-JS 快速实现标绘功能
前端·javascript·arcgis·cesium·gis开发·地理信息科学
Superxpang11 小时前
前端性能优化
前端·javascript·vue.js·性能优化
左手吻左脸。11 小时前
解决el-select因为弹出层层级问题,不展示下拉选
javascript·vue.js·elementui
李白的故乡11 小时前
el-tree-select名字
javascript·vue.js·ecmascript
Rysxt_11 小时前
Element Plus 入门教程:从零开始构建 Vue 3 界面
前端·javascript·vue.js
隐含11 小时前
对于el-table中自定义表头中添加el-popover会弹出两个的解决方案,分别针对固定列和非固定列来隐藏最后一个浮框。
前端·javascript·vue.js