HTTPS 自签名证书生成与安装完整指南

2025-09-25 奥古斯宏

背景

在开发环境或内网环境中,我们经常需要为服务器配置 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. 安装到受信任的根证书颁发机构

  1. server.crt 文件复制到 Windows 机器
  2. 右键点击证书文件 → "安装证书"
  3. 选择 "本地计算机" → "下一步"
  4. 选择 "将所有的证书都放入下列存储" → "浏览"
  5. 选择 "受信任的根证书颁发机构" → "确定"
  6. 完成安装

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

版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。

3. 证书不受信任

原因: 证书未安装到正确位置
解决: 确保安装到 "受信任的根证书颁发机构"

生产环境建议

  1. 使用 Let's Encrypt 获取免费的受信任证书
  2. 定期更新证书 避免过期
  3. 使用强加密算法 如 RSA 4096 或 ECC
  4. 配置 HSTS 强制 HTTPS 访问

总结

通过正确配置 SAN 扩展和证书属性,可以生成兼容现代浏览器的自签名证书。关键是理解浏览器的安全要求,并在生成证书时包含所有必要的扩展信息。


最近浏览
IP用户:34.174.*.*
4 小时前 Firefox GNU/Linux
IP用户:220.181.*.*
5 小时前 Baidu Spider
IP用户:119.28.*.*
6 小时前 Mobile Safari iOS 13.2
IP用户:66.249.*.*
6 小时前 Googlebot
IP用户:54.39.*.*
8 小时前 aHrefs Bot
IP用户:8.134.*.*
10 小时前 Chrome Windows XP
IP用户:183.144.*.*
10 小时前 Chrome Windows 10
IP用户:39.76.*.*
10 小时前 Firefox Windows 10
累计浏览次数:9
评论
点击登录
phpreturn,PHP武器库,专注PHP领域的项目和资讯,收录和介绍PHP相关项目。
最近浏览 点击登录
IP用户:8.160.*.*
3 分钟前 《PHP8.3发布》
IP用户:198.244.*.*
IP用户:198.244.*.*
IP用户:198.244.*.*
累计浏览次数:252235
一周浏览次数:1814
今日浏览次数:22

本站所有权利归 phpreturn.com 所有

举报/反馈/投稿邮箱:phpreturn@ulthon.com

鲁ICP备19027671号-2