1. 目标与背景

  • 目标:使内网服务器 https://192.168.31.201能够被浏览器信任,不再报 NET::ERR_CERT_COMMON_NAME_INVALIDERR_SSL_KEY_USAGE_INCOMPATIBLE错误。
  • 原因:公网SSL证书通常只绑定域名,当用户在内网直接通过IP地址访问时,浏览器会因证书中的名称(域名)与访问的地址(IP)不匹配而触发安全警告。
  • 解决方案:为内网IP地址生成一张自签名SSL证书,并配置Nginx使其在用户通过IP访问时,返回这张正确的证书。

2. 生成自签名SSL证书(关键步骤)

此步骤生成一张浏览器可识别的、专用于IP地址的服务器证书。

  1. 创建证书配置文件 ip_server.cnf

    cat > ip_server.cnf << 'EOF'
    [req]
    distinguished_name = req_distinguished_name
    x509_extensions = v3_req
    prompt = no
    default_bits = 2048
    default_md = sha256
    
    [req_distinguished_name]
    C = CN
    ST = State
    L = City
    O = MyCompany
    CN = 192.168.31.201
    
    [v3_req]
    basicConstraints = CA:FALSE
    keyUsage = digitalSignature, keyEncipherment, keyAgreement
    extendedKeyUsage = serverAuth
    subjectAltName = @alt_names
    
    [alt_names]
    IP.1 = 192.168.31.201
    EOF
  1. 生成私钥和证书

    # 生成私钥和证书签名请求 (CSR)
    openssl req -new -newkey rsa:2048 -nodes -keyout ip_server.key -out ip_server.csr -config ip_server.cnf
    
    # 生成自签名证书(有效期10年)
    openssl x509 -req -days 3650 -in ip_server.csr -signkey ip_server.key -out ip_server.crt -extensions v3_req -extfile ip_server.cnf

验证证书内容

openssl x509 -in ip_server.crt -text -noout | grep -A 2 "X509v3 Key Usage"
openssl x509 -in ip_server.crt -text -noout | grep -A 1 "X509v3 Extended Key Usage"
openssl x509 -in ip_server.crt -text -noout | grep -A 1 "Subject Alternative Name"

3. 部署证书到Nginx

  1. 将证书文件复制到Nginx目录

    sudo mkdir -p /etc/nginx/ssl sudo cp ip_server.crt ip_server.key /etc/nginx/ssl/ sudo chmod 644 /etc/nginx/ssl/ip_server.crt sudo chmod 600 /etc/nginx/ssl/ip_server.key
  1. 配置Nginx

    # 原有的域名配置块
    server {
        listen 443 ssl http2;
        server_name your-domain.com; # 你的域名
        ssl_certificate /path/to/your-domain.crt;
        ssl_certificate_key /path/to/your-domain.key;
        # ... 其他配置
    }
    
    # 新增的IP地址配置块
    server {
        listen 443 ssl http2 default_server; # 关键:添加 default_server 标识
        server_name 192.168.31.201;          # 指定内网IP
    
        ssl_certificate /etc/nginx/ssl/ip_server.crt;     # 指向IP专用证书
        ssl_certificate_key /etc/nginx/ssl/ip_server.key; # 指向IP专用私钥
    
        # 以下业务配置应与域名块保持一致,或通过 include 复用
        include /etc/nginx/default.d/common/*.conf;
        # ... 其他业务配置(如 root, index, proxy_pass 等)
    }
  1. 重启Nginx生效

    sudo nginx -t       # 测试配置语法 sudo nginx -s reload  # 或 sudo systemctl reload nginx

4. 客户端浏览器导入证书

由于证书是自签名的,不受公共CA信任,需要在内网每台需要访问的电脑上手动信任该证书。

  1. 获取证书文件:将生成的 ip_server.crt文件分发到客户端电脑。
  2. Windows系统导入: 双击 ip_server.crt文件。 点击“安装证书” -> “当前用户”或“本地计算机”。 选择“将所有证书都放入下列存储” -> “浏览” -> 选择“受信任的根证书颁发机构” -> 完成。
  3. macOS系统导入: 双击 ip_server.crt文件,打开“钥匙串访问”。 将其拖入或导入到“系统”钥匙串。 双击导入的证书,展开“信任”选项,将“使用此证书时”设置为“始终信任”。
  4. Firefox浏览器导入: Firefox使用独立的证书存储。 进入 设置 -> 隐私与安全 -> 证书 -> 查看证书 -> 证书颁发机构 -> 导入,选择 ip_server.crt并勾选“信任此CA以标识网站”。

5. 最终验证与问题排查

  1. 验证访问:在客户端浏览器清除缓存后访问 https://192.168.31.201,地址栏应显示绿色锁标志,点击查看证书详情,确认颁发者和SAN包含你的IP地址。
  2. Nginx日志:若访问失败,查看错误日志 sudo tail -f /var/log/nginx/error.log
  3. 端口监听:确认Nginx正在监听443端口 sudo netstat -tlnp | grep :443

6. 附录:替代方案(临时/开发环境)

如果不想配置证书,仅用于临时测试,可以在浏览器警告页面执行:

  • Chrome/Edge:直接在页面键盘输入 thisisunsafe(无输入框)。
  • Firefox:点击“高级” -> “接受风险并继续”。

适用场景:内网开发、测试环境,或无法使用域名的内部服务。

注意事项:此自签名证书仅在内网有效,在外网不具备公信力。对于生产环境,强烈建议通过内网DNS解析域名来统一访问入口。

标签: none

评论已关闭