背景
在开发环境或内网环境中,我们经常需要为服务器配置 HTTPS 证书。本文记录了如何生成支持多IP地址的自签名证书,并解决浏览器兼容性问题的完整过程。
问题分析
现代浏览器对 HTTPS 证书的要求越来越严格:
1. 必须包含 SAN (Subject Alternative Name) - 仅有 CN 不够
2. 不能标记为 CA 证书 - 必须是终端实体证书
3. 需要正确的密钥用途扩展
证书生成
1. 生成支持多IP的自签名证书
# 生成支持多个IP地址的证书,有效期10年
openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt -days 3650 -nodes \
-subj "/C=CN/S=Province/L=City/O=Organization/OU=Department/CN=10.0.0.100" \
-addext "subjectAltName=IP:10.0.0.100,IP:192.168.1.100,IP:172.16.0.100" \
-addext "basicConstraints=CA:FALSE" \
-addext "keyUsage=digitalSignature,keyEncipherment" \
-addext "extendedKeyUsage=serverAuth"
2. 验证证书信息
# 检查 SAN 扩展
openssl x509 -in server.crt -text -noout | grep -A 5 "Subject Alternative Name"
# 验证为非CA证书
openssl x509 -in server.crt -text -noout | grep -A 3 "Basic Constraints"
# 查看证书有效期
openssl x509 -in server.crt -noout -dates
3. 参数说明
-
-days 3650
: 10年有效期 -
-nodes
: 私钥不加密 -
basicConstraints=CA:FALSE
: 标记为终端实体证书 -
keyUsage
: 设置密钥用途 -
extendedKeyUsage=serverAuth
: 服务器认证用途 -
subjectAltName
: 支持的IP地址列表
Nginx 配置
# File: /etc/nginx/sites-available/your-site
server {
listen 8084 ssl;
server_name 10.0.0.100 192.168.1.100 172.16.0.100;
ssl_certificate /path/to/server.crt;
ssl_certificate_key /path/to/server.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
# 你的应用配置
}
}
# 重启 Nginx
sudo systemctl restart nginx
Windows 证书安装
1. 安装到受信任的根证书颁发机构
- 将
server.crt
文件复制到 Windows 机器 - 右键点击证书文件 → "安装证书"
- 选择 "本地计算机" → "下一步"
- 选择 "将所有的证书都放入下列存储" → "浏览"
- 选择 "受信任的根证书颁发机构" → "确定"
- 完成安装
2. 验证安装
# 打开证书管理器
certmgr.msc
在 "受信任的根证书颁发机构" → "证书" 中确认证书已安装。
浏览器测试
支持的访问地址
https://10.0.0.100:8084
https://192.168.1.100:8084
https://172.16.0.100:8084
清除浏览器缓存
Chrome/Edge:
- 设置 → 隐私和安全 → 清除浏览数据 → 选择"所有时间"
Firefox:
- 设置 → 隐私与安全 → 清除数据
常见错误及解决方案
1. SSL_ERROR_BAD_CERT_DOMAIN
原因: 缺少 SAN 扩展或域名不匹配
解决: 确保证书包含正确的 subjectAltName
2. MOZILLA_PKIX_ERROR_CA_CERT_USED_AS_END_ENTITY
原因: 证书被错误标记为 CA 证书
解决: 添加 basicConstraints=CA:FALSE
3. 证书不受信任
原因: 证书未安装到正确位置
解决: 确保安装到 "受信任的根证书颁发机构"
生产环境建议
- 使用 Let's Encrypt 获取免费的受信任证书
- 定期更新证书 避免过期
- 使用强加密算法 如 RSA 4096 或 ECC
- 配置 HSTS 强制 HTTPS 访问
总结
通过正确配置 SAN 扩展和证书属性,可以生成兼容现代浏览器的自签名证书。关键是理解浏览器的安全要求,并在生成证书时包含所有必要的扩展信息。
原文标题: HTTPS 自签名证书生成与安装完整指南
原文地址: https://phpreturn.com/index/a68d5008cbf42a.html
原文平台: PHP武器库
版权声明: 本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。