这是「把自己部署到互联网上」系列的第 27 篇。
上一篇讲了为什么个人网站需要 HTTPS。
它不仅仅只是地址栏里的小锁,还关系到访问安全、浏览器提示、后台登录、现代 Web 能力、搜索和分享体验。
对一个准备长期运行的博客来说,网站不能只做到“能访问”,还要能通过可信连接访问。
这一篇进入实际操作:SSL 证书怎么申请、下载,并部署到 Nginx。
完整链路
我这里会以阿里云为例(域名在阿里买的),在哪个平台购买不重要,不同平台页面布局多少会有一些差异。
更重要的是理解流程:申请证书,完成域名验证,下载证书,放到服务器,配置 Nginx,检查配置,重载服务,最后验证 HTTPS 是否正常。

部署证书表面上是“下载两个文件”,实际上是让浏览器访问域名时,可以和服务器建立可信的 HTTPS 连接。
这里至少要满足几件事:
- 证书包含当前域名
- 证书由浏览器信任的 CA 签发
- 证书未过期
Nginx能读取证书和私钥- 443 端口可访问
- HTTP 能跳转到 HTTPS
证书只是链路中的一环
证书申请成功,但 Nginx 路径写错,HTTPS 仍然打不开;Nginx 配置正确,但安全组没放行 443,外部也访问不到;443 能访问,但证书域名不匹配,浏览器还是会警告。
实际操作(阿里云为例)
购买证书
阿里云搜索服务 数字证书管理服务

证书分为两类:
- 正式证书:适合生产环境、公司网站使用,安全性强、兼容性高,提供稳定性保障SLA。支持单域名、通配符、多域名,提供DV、OV、EV多种选择
- 个人测试证书:适合测试环境、个人开发者使用,价格实惠,仅支持单域名,无稳定性保障,每人每年20个免费证书额度
生产业务建议选择正式的,个人练手、测试,可以选择个人测试证书
我这里选择的是个人测试证书(毕竟免费么):

申请证书
第一次建议先选一个明确域名,把流程跑通,知道流程是什么样子的;
通配符证书和自动续期后面再处理。
购买了之后,选择证书管理,查看已经购买的证书
一进来是证书 待申请的状态,输入基本信息,验证邮箱、手机号,即可完成申请

常见方式有云厂商证书服务、证书服务商控制台、Let’s Encrypt,以及 acme.sh、Certbot 这类 ACME 工具。
第一次操作时,使用云厂商控制台申请免费证书更直观
无论平台怎么变,核心都是验证一件事:你控制着这个域名
域名验证
常见验证方式有 DNS 验证和文件验证。
DNS 验证通常要求添加一条 TXT 或 CNAME 记录;
文件验证则要求把指定文件放到网站指定路径。
对还没正式部署网站的阶段来说,DNS 验证更方便,只要能控制域名解析即可。
按平台要求添加到 DNS 解析里,然后等待生效。

添加完之后可以用命令检查:
nslookup -type=TXT _acme-challenge.blog.aicultiv.com
dig TXT _acme-challenge.blog.aicultiv.com
如果能看到平台要求的记录值,再回到证书平台继续验证。
验证失败时,不要急着重申证书,先检查 主机记录、记录类型、记录值、解析平台是否正确,以及 DNS 是否已经生效。
验证成功后,等待证书颁发机构(CA) ,完成 DNS 信息验证后签发证书。
下载证书
证书签发后,平台一般会提供 Nginx、Apache、IIS、Tomcat 等类型的证书包。
服务类型神什么,就选择对应的证书格式,例如,入口是 Nginx,就下载 Nginx 类型。
文件名可能不同,但核心通常是两类:证书文件和私钥文件。
Nginx 通常应使用包含完整证书链的文件,例如 fullchain.pem 或平台提供的等价文件。
重点提示
私钥必须保护好。
不要提交到公开仓库,不要发到文章截图里,不要放进示例代码包。
如果怀疑私钥泄露,重新签发证书并替换旧证书。
安全为重
部署证书
把证书放到服务器目录。前面全局 Nginx 容器的目录是:
/opt/coduty/nginx/
conf.d/
certs/
logs/
可以按域名分组:
/opt/coduty/nginx/certs/blog.example.com/
fullchain.pem
privkey.pem
创建目录:
mkdir -p /opt/coduty/nginx/certs/blog.example.com
如果 Compose 已经挂载:
volumes:
- ./certs:/etc/nginx/certs:ro
那么 Nginx 配置里要写容器内路径:
/etc/nginx/certs/blog.example.com/fullchain.pem
/etc/nginx/certs/blog.example.com/privkey.pem
记得区分好 宿主机 和 容器 的挂载路径
不要把宿主机路径写进容器内
Nginx配置,这是容器化Nginx的经常出现的错误。
Nginx 配置文件
配置 Nginx,配置文件是:
/opt/coduty/nginx/conf.d/blog.aicultiv.com.conf
可以先写基础版本:
server {
listen 80;
server_name blog.aicultiv.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name blog.aicultiv.com;
ssl_certificate /etc/nginx/certs/blog.example.com/fullchain.pem;
ssl_certificate_key /etc/nginx/certs/blog.example.com/privkey.pem;
location / {
proxy_pass http://blog-app:8000; # 这里要注意是 容器名称
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
blog-app:8000 只是示例,
真实项目要替换成自己的服务名和端口,并确保 Nginx 容器能通过 Docker 网络访问它。
如果暂时没有后端服务,也可以返回一句话, return 200 "https is running\n";
用来验证证书和 443 是否正常。
检查重载
对上面修改后的配置文件,检查并重载 Nginx。
不要直接 reload,先执行测试:
docker exec global-nginx nginx -t
如果提示证书文件不存在,检查容器内路径、挂载目录和文件权限。
进入容器确认文件目录:
docker exec -it global-nginx sh
ls -lh /etc/nginx/certs/blog.example.com
检查通过后再进行重载:
docker exec global-nginx nginx -s reload
建议:无论几个应用站点,建议养成“先
nginx -t,再reload”的习惯
测试
证书配置完了,也部署了,进行测试,确认 443 端口可访问。
首先云平台安全组要放行 TCP 443,系统防火墙也要放行。
使用 ufw:
sudo ufw allow 443/tcp
sudo ufw status verbose
再确认宿主机监听:
sudo ss -lntp | grep ':443'
最后验证访问:
curl -I https://blog.aicultiv.com
curl -I http://blog.aicultiv.com
HTTPS 应返回 200 或应用自己的响应;
HTTP 应返回 301 或 308,并跳转到 HTTPS。
也可以打开浏览器访问,浏览器如果提示证书错误,重点检查证书是否过期、域名是否匹配、是否使用完整证书链、DNS 是否指向正确服务器。
常见问题
常见问题主要有五类
- 证书域名不匹配,访问
www.example.com不能使用只覆盖blog.example.com的证书 - 容器内外路径混淆,
Nginx配置必须写容器内路径 - 只配置 443,忘了 80 跳转
- 证书快过期才想起来续期
- 私钥泄露
从我的工作经历来看,最容易出问题的概率:
第二个 > 第三个 > 第四个
第一个和第五个出现的概率较小
手动申请和部署证书有助于理解流程,但长期维护会稍微麻烦一点。
后面如果有多个子域名,或者不想每次到期前手动处理,就需要通配符证书和自动续期。
下一篇继续写:通配符证书和 acme.sh,我如何解决多域名证书管理。
那一步会把 HTTPS 从“配置一次”,推进到“适合长期自动维护”。
本文由 楸木 原创,转载请注明出处。