当你兴冲冲地在 VPS 上部署好一个服务,打开浏览器准备验收成果时,地址栏里那句冰冷的”不安全”提示瞬间浇了一盆冷水。更让人抓狂的是,明明按照教程一步步配置了 SSL,Chrome 依旧不买账——密码填充失灵、每次访问都要多点一下”高级→继续前往”,用户体验简直是一场灾难。这背后的原因,很可能不是你的操作出了问题,而是你缺少了对 SSL 证书完整生态的理解:从证书签发机构的选取、自动续期机制的配置,到内网环境下 OpenSSL 自签证书的 SAN(Subject Alternative Name)处理,再到最终通过 SSL Labs 评级验证,每一个环节都有它的讲究。
这篇文章将把这套知识体系完整地串联起来——无论你是为博客配置 Let’s Encrypt 的个人站长、管理多台 VPS 的运维人员,还是在内网 NAS 上折腾服务的技术爱好者,都能在这篇文章里找到适合你的方案和避坑指南。

一、主流 SSL 证书方案怎么选?
在动手操作之前,先花两分钟搞清楚自己需要哪种证书。选错了方案,后面再折腾也是白费功夫。目前针对站长这个群体,主流的 SSL 证书方案可以分成三大类,每一类的定位和适用场景都完全不同。
第一类:Let’s Encrypt — 绝大多数公网场景的首选。由 Linux 基金会旗下非营利机构运营,全球超过 3 亿个站点在使用。完全免费,支持通过 certbot 或 acme.sh 实现全自动申请和续期。证书有效期仅 90 天,但配合 cron 定时任务可以实现真正的”设置一次,永久无忧”。对于个人博客、企业官网、API 服务等绝大多数面向公网的场景来说,Let’s Encrypt 是最优解——不需要花一分钱,安全性也不比付费证书差。
第二类:付费 OV/EV 证书 — 当你需要向用户传递更强信任信号时选择。Sectigo、DigiCert、GlobalSign 等传统 CA 机构提供的付费证书会在证书详情中展示企业实名信息,EV 证书更是在地址栏直接显示公司名称和绿色标识。对电商平台、在线支付、金融机构来说,这张 EV 证书带来的转化率提升往往远超证书本身的成本(每年几十到几百美元不等)。不过对普通个人站长来说,必要性不大。
第三类:OpenSSL 自签证书 — 内网环境唯一的可行方案。你家里 NAS 上的 Bitwarden、公司内网的 GitLab、或是没有公网 IP 的开发服务器——这些场景 Let’s Encrypt 无法触及,付费证书又不划算,自签证书就成了唯一的选择。自签证书虽然不会被浏览器公开信任,但只要正确配置 SAN 并手动导入到系统信任列表,同样能实现完整的 HTTPS 加密,Chrome 地址栏也会显示绿色锁。
二、Let’s Encrypt 从申请到自动续期
Let’s Encrypt 的配置流程非常成熟,核心就是三个步骤:安装客户端、申请证书、配置自动续期。
2.1 安装 certbot
certbot 是 Let’s Encrypt 官方推荐的客户端,支持 Nginx 和 Apache 的自动配置。以 Debian/Ubuntu 为例:
apt update && apt install certbot python3-certbot-nginx -y
CentOS/RHEL 用户使用 yum install epel-release && yum install certbot python3-certbot-nginx。安装完成后,先确认 Nginx 的 server_name 已经正确指向你的域名,这是 certbot 自动验证域名所有权的前提。
2.2 申请并自动配置
执行以下命令,certbot 会自动完成域名验证、证书签发、Nginx 配置修改和服务重载:
certbot --nginx -d yourdomain.com -d www.yourdomain.com
certbot 的验证原理是通过 HTTP-01 挑战——它会在你的网站目录下放置一个临时文件,Let’s Encrypt 服务器通过访问这个文件来确认你对域名的控制权。验证通过后,证书文件会存放在 /etc/letsencrypt/live/yourdomain.com/ 目录下,包括 fullchain.pem(完整证书链)、privkey.pem(私钥)和 chain.pem(中间证书)。
2.3 配置自动续期
Let’s Encrypt 证书有效期仅 90 天,但续期机制非常优雅。只需在 crontab 中添加一行:
0 3 * * * /usr/bin/certbot renew --quiet && systemctl reload nginx
这条命令每天凌晨 3 点执行一次。certbot 的 renew 逻辑是:只有当证书剩余时间不足 30 天时,才会实际发起续期请求;其余时间直接静默退出,不产生任何网络开销。加上 --quiet 参数后,只有出错时才会产生日志输出。这意味着你完全不用操心续期的事——只要服务器还在运行,证书就会自动保持有效。
三、Nginx SSL 最佳配置(A+ 评级)
证书到位了只是第一步,Nginx 的 SSL 配置同样决定了你的网站是否真正”安全”。以下这份配置经过 SSL Labs 测试可以达到 A+ 评级,直接复制到你的 server block 中即可:
server {
listen 443 ssl http2;
server_name yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/yourdomain.com/chain.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
add_header Strict-Transport-Security "max-age=63072000" always;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
}
几个关键配置项的作用:ssl_protocols 限定了只使用 TLS 1.2 和 1.3,移除了存在已知漏洞的 TLS 1.0 和 1.1;ssl_ciphers 指定了经过筛选的强加密套件,禁用 RC4、3DES 等不安全算法;HSTS(Strict-Transport-Security)告诉浏览器在未来两年内只允许通过 HTTPS 访问你的网站,彻底杜绝降级攻击。
额外的两个安全建议:第一,禁止直接通过 IP 访问你的服务器——在默认 server block 中返回 444 即可,防止他人将恶意域名解析到你的 IP;第二,配置 HTTP 到 HTTPS 的 301 重定向,确保所有流量都走加密通道。

四、内网场景:OpenSSL 自签证书(含 SAN)
现在来说那个让无数内网服务折腾者头疼的问题:Bitwarden、Marzban 这类应用强制要求 HTTPS,但你的 NAS 或内网服务器没有公网域名,Let’s Encrypt 没法给你签发证书。虽然 VPS 可以用 ZeroSSL 申请免费 IP 证书,但内网 IP(192.168.x.x、10.x.x.x 等)同样无法通过验证。唯一的出路就是自签证书。
自签证书本身不复杂,但有一个关键细节容易被忽略:Subject Alternative Names(SAN)。如果你直接执行 openssl req -x509 ... 而不加 SAN 配置,Chrome 即使在你导入证书后仍然会显示”不安全”,且密码填充功能会失效——每次访问都要手动输入密码,体验非常糟糕。Firefox 对 SAN 的要求相对宽松,但 Chrome 严格要求证书必须包含与被访问地址匹配的 SAN 条目。
4.1 创建含 SAN 的配置文件
新建一个 OpenSSL 配置文件 openssl-san.cnf,把你要用的 IP 地址和域名都写进去:
[ req ]
default_bits = 2048
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[ req_distinguished_name ]
C = CN
ST = Beijing
L = Beijing
O = MyHome
OU = Dev
CN = 192.168.1.100
[ v3_req ]
subjectAltName = @alt_names
[ alt_names ]
IP.1 = 192.168.1.100
IP.2 = 10.0.0.5
DNS.1 = nas.local
DNS.2 = myhome.local
这个配置文件的核心在于 [alt_names] 部分——你需要把你内网中可能用到的所有访问方式都列出来。IP 地址用 IP.1、IP.2 这样的格式,域名用 DNS.1、DNS.2 的格式。这样生成的证书就能同时支持通过 IP 和域名访问,无论你从哪个地址进入都不会触发安全警告。
4.2 生成证书
用以下命令生成自签证书,有效期直接设为 100 年(36500 天),几乎不需要再操心证书过期:
openssl req -x509 -nodes -days 36500 -newkey rsa:2048 \
-keyout ip.key -out ip.crt \
-config openssl-san.cnf \
-extensions v3_req
执行后会生成两个文件:ip.key(私钥)和 ip.crt(证书文件)。私钥需要妥善保管,证书文件则可以分发到需要访问的各台设备上。
4.3 导入到 Chrome 信任列表
将 ip.crt 下载到你的本地电脑。在 Chrome 中依次进入:设置 → 隐私和安全 → 安全 → 管理设备证书 → 受信任的根证书颁发机构 → 导入。选择 ip.crt 文件,导入时务必勾选”信任用于标识网站”。完成后重启 Chrome,再次访问你的内网服务时,地址栏就会显示绿色锁标识,密码填充功能也会恢复正常。
五、常见问题解答(FAQ)
Q1:Let’s Encrypt 证书过期了但没有自动续期怎么办?
先手动执行 certbot renew 确认能否续期。如果提示证书未到期(还有 30 天以上),说明你的 cron 定时任务可能没有正确执行。检查 crontab 是否启用:systemctl status cron,查看 certbot 日志:journalctl -u certbot.timer。如果续期失败,最常见的原因是域名 DNS 解析异常,确保域名能正常解析到服务器 IP。
Q2:自签证书导入后 Chrome 仍然显示”不安全”怎么办?
99% 的情况是因为证书缺少 SAN 扩展。按照本文 4.1 节的配置重新生成证书,确保 [alt_names] 中包含了你要访问的 IP 或域名。另外检查是否将证书导入到了”受信任的根证书颁发机构”而不是”中间证书颁发机构”,导入位置不对也不会生效。
Q3:SSL Labs 评级是 B 或 C,怎么提升到 A+?
最常见的原因是启用了不安全的协议或加密套件。按照本文第三节的配置,只保留 TLS 1.2 和 1.3,禁用 TLS 1.0/1.1,同时确保服务器上的所有站点都启用了 TLS 1.3——SSL Labs 的 A+ 评级要求服务器上的每个站点都满足安全标准,有一个站点拖后腿就会拉低整台服务器的评分。
Q4:同一个 IP 上跑多个域名,证书怎么配置?
Let’s Encrypt 支持多域名证书(SAN证书),在申请时将多个域名一起传入:certbot --nginx -d domain1.com -d domain2.com。这样一张证书就能覆盖所有域名,Nginx 配置也更简洁。需要注意的是,一张 Let’s Encrypt 证书最多支持 100 个域名,对绝大多数场景来说完全够用。
Q5:如何检查当前证书的到期时间和详细信息?
使用 OpenSSL 命令行工具可以快速查看证书信息:openssl x509 -in /etc/letsencrypt/live/yourdomain.com/fullchain.pem -text -noout | grep -E "Subject:|Not Before|Not After"。这条命令会显示证书的主题、生效时间和到期时间。你也可以用 certbot certificates 列出服务器上所有 Let’s Encrypt 证书的状态。
Q6:使用 CDN(如 Cloudflare)时 SSL 配置有什么需要注意的?
使用 Cloudflare CDN 时存在两段 SSL:用户到 Cloudflare 边缘节点(第一段),以及 Cloudflare 到你的源站服务器(第二段)。推荐将 Cloudflare 的 SSL/TLS 加密模式设为”完全(严格)”,并在源站服务器上配置一个由 Cloudflare Origin CA 签发的源站证书。这样可以确保两端都是加密的,且源站证书不会被暴露给最终用户。
六、总结
SSL/TLS 证书的部署和管理,本质上就是三件事:选对方案、配对工具、做好监控。对于公网服务,Let’s Encrypt + certbot + cron 这条链路已经非常成熟可靠,设置好后几乎感觉不到它的存在——证书会在到期前自动续期、Nginx 会自动重载、浏览器始终显示绿色锁。对于内网服务,OpenSSL 自签证书 + SAN 配置 同样是一个几分钟就能搞定的标准化流程,核心就是不要忘记那个 subjectAltName 配置。
最后送你几条实用建议:每个月去 SSL Labs 跑一次评级,及时发现问题;将证书到期时间纳入你的监控系统(比如 Prometheus + Alertmanager),避免因意外导致证书过期;如果你的 VPS 上运行着面向用户的网站,从第一天就启用 HTTPS——这不是技术负担,而是一个负责任站长的基本素养。
原创文章,作者:kp51,如若转载,请注明出处:https://www.kepu51.com/instant-messaging/774.html
