自签名证书是你自己创建的——你充当自己的证书颁发机构。CA 签名证书由受信任的证书颁发机构(如 Let’s Encrypt 或 DigiCert)签发,浏览器已经预置了对它们的信任。
实际区别:自签名证书触发浏览器安全警告,CA 签名证书不会。
对比
| 自签名 | CA 签名 | |
|---|---|---|
| 创建者 | 你(openssl 命令) | 受信任的 CA |
| 浏览器信任 | ❌ 警告:“不受信任” | ✅ 锁头图标 |
| 加密强度 | 相同 | 相同 |
| 费用 | 免费 | 免费(Let’s Encrypt)或付费 |
| 验证 | 无——你为自己担保 | CA 验证域名/组织 |
| 使用场景 | 开发、内部、测试 | 生产网站 |
| 续签 | 手动(你自定有效期) | 90 天(LE)或 1 年(付费) |
| 中间人攻击防护 | ⚠️ 弱——用户被训练点击跳过警告 | ✅ 强——仅真正问题时显示警告 |
为什么自签名证书显示警告
浏览器基于签名者来信任证书。你的操作系统和浏览器自带约 100-150 个受信任的根 CA 列表。当服务器出示由这些 CA 之一签名的证书时,浏览器显示锁头图标。
自签名证书不是由任何受信任的 CA 签名的——它由自己的私钥签名。浏览器无法验证证书是否合法,因此显示警告。这是正确的行为——没有 CA 验证,任何人都可以创建声称是 google.com 的证书。
何时使用自签名证书
内部服务
不暴露于互联网的服务——内部仪表板、监控工具、数据库管理面板。你的团队可以将自签名 CA 添加到他们的信任存储中。
开发和测试
本地开发的快速 HTTPS,当你不想设置 mkcert 时。浏览器警告虽然烦人,但测试时功能上没问题。
物联网和嵌入式设备
与已知服务器通信并可以固定证书的设备——不涉及浏览器信任存储。
隔离网络
没有互联网访问的网络,Let’s Encrypt 的 ACME 协议无法触达。自签名是唯一选择。
何时不应使用自签名证书
任何面向公众的网站
用户看到吓人的警告然后离开。搜索引擎可能不会抓取使用不受信任证书的 HTTPS 页面。当 Let’s Encrypt 证书免费时,没有理由使用自签名。
任何处理用户数据的站点
自签名证书训练用户点击跳过安全警告——这与良好安全实践恰恰相反。当真正的攻击触发警告时,习惯点击”继续访问”的用户不会注意到。
如何创建自签名证书
# ECDSA (recommended)
openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:P-256 \
-keyout key.pem -out cert.pem -days 365 -nodes \
-subj "/CN=internal.example.com" \
-addext "subjectAltName=DNS:internal.example.com,IP:10.0.0.5"
# RSA
openssl req -x509 -newkey rsa:2048 \
-keyout key.pem -out cert.pem -days 365 -nodes \
-subj "/CN=internal.example.com"
在服务器配置中使用生成的 cert.pem 和 key.pem。注意:不需要 fullchain.pem 和 chain.pem——自签名证书没有证书链。
每种场景的更好替代方案
| 场景 | 替代自签名,使用 |
|---|---|
| 生产网站 | Let’s Encrypt 通过 GetHTTPS —— 免费、受信任、5 分钟 |
| 本地开发 | mkcert —— 本地受信任、无警告 |
| 内部服务 | Let’s Encrypt(如果可访问互联网)或私有 CA |
| 测试/预发布 | Let’s Encrypt 暂存环境 —— 无限测试证书 |
当 SSL 证书每年需要 $100 以上时,自签名证书是有意义的。现在 Let’s Encrypt 免费,除了真正隔离的环境外,几乎没有理由使用自签名。
常见问题
自签名证书比 CA 签名的安全性低吗?
加密完全相同——相同的算法、相同的密钥强度。区别在于信任:CA 签名证书通过受信任的第三方证明服务器身份。自签名证书什么都不证明——任何人都可以为任何域名创建一个。安全问题不在密码学,而在缺乏认证。
能让浏览器信任我的自签名证书吗?
可以,在你控制的机器上。将证书(或签署它的自签名 CA)导入操作系统/浏览器信任存储。这就是 mkcert 自动化的操作。但你不能让其他人的浏览器信任它——那需要真正的 CA。
我的主机商给了我自签名证书,这可以吗?
对于公开网站,不行。让你的主机商启用免费的 Let’s Encrypt(大多数主机都支持)。如果他们不支持,使用 GetHTTPS 自己获取受信任的证书。
为什么不直接创建自己的 CA?
可以,但浏览器不会信任它,除非你经历了漫长且昂贵的加入浏览器信任存储的过程。私有 CA 适用于内部基础设施(你的团队安装根证书),但不适用于公开网站。对于公开站点,使用受信任的 CA 如 Let’s Encrypt。