内网服务器为IP地址配置HTTPS证书操作指南
1. 目标与背景
- 目标:使内网服务器
https://192.168.31.201能够被浏览器信任,不再报NET::ERR_CERT_COMMON_NAME_INVALID或ERR_SSL_KEY_USAGE_INCOMPATIBLE错误。 - 原因:公网SSL证书通常只绑定域名,当用户在内网直接通过IP地址访问时,浏览器会因证书中的名称(域名)与访问的地址(IP)不匹配而触发安全警告。
- 解决方案:为内网IP地址生成一张自签名SSL证书,并配置Nginx使其在用户通过IP访问时,返回这张正确的证书。
2. 生成自签名SSL证书(关键步骤)
此步骤生成一张浏览器可识别的、专用于IP地址的服务器证书。
创建证书配置文件
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
生成私钥和证书
# 生成私钥和证书签名请求 (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
将证书文件复制到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
配置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 等) }
重启Nginx生效:
sudo nginx -t # 测试配置语法 sudo nginx -s reload # 或 sudo systemctl reload nginx
4. 客户端浏览器导入证书
由于证书是自签名的,不受公共CA信任,需要在内网每台需要访问的电脑上手动信任该证书。
- 获取证书文件:将生成的
ip_server.crt文件分发到客户端电脑。 - Windows系统导入: 双击
ip_server.crt文件。 点击“安装证书” -> “当前用户”或“本地计算机”。 选择“将所有证书都放入下列存储” -> “浏览” -> 选择“受信任的根证书颁发机构” -> 完成。 - macOS系统导入: 双击
ip_server.crt文件,打开“钥匙串访问”。 将其拖入或导入到“系统”钥匙串。 双击导入的证书,展开“信任”选项,将“使用此证书时”设置为“始终信任”。 - Firefox浏览器导入: Firefox使用独立的证书存储。 进入 设置 -> 隐私与安全 -> 证书 -> 查看证书 -> 证书颁发机构 -> 导入,选择
ip_server.crt并勾选“信任此CA以标识网站”。
5. 最终验证与问题排查
- 验证访问:在客户端浏览器清除缓存后访问
https://192.168.31.201,地址栏应显示绿色锁标志,点击查看证书详情,确认颁发者和SAN包含你的IP地址。 - Nginx日志:若访问失败,查看错误日志
sudo tail -f /var/log/nginx/error.log。 - 端口监听:确认Nginx正在监听443端口
sudo netstat -tlnp | grep :443。
6. 附录:替代方案(临时/开发环境)
如果不想配置证书,仅用于临时测试,可以在浏览器警告页面执行:
- Chrome/Edge:直接在页面键盘输入
thisisunsafe(无输入框)。 - Firefox:点击“高级” -> “接受风险并继续”。
适用场景:内网开发、测试环境,或无法使用域名的内部服务。
注意事项:此自签名证书仅在内网有效,在外网不具备公信力。对于生产环境,强烈建议通过内网DNS解析域名来统一访问入口。
评论已关闭