SSL 证书申请、下载、部署完整流程

预计阅读时间:11 分钟

这是「把自己部署到互联网上」系列的第 27 篇。

上一篇讲了为什么个人网站需要 HTTPS

它不仅仅只是地址栏里的小锁,还关系到访问安全、浏览器提示、后台登录、现代 Web 能力、搜索和分享体验。

对一个准备长期运行的博客来说,网站不能只做到“能访问”,还要能通过可信连接访问。

这一篇进入实际操作:SSL 证书怎么申请、下载,并部署到 Nginx

完整链路

我这里会以阿里云为例(域名在阿里买的),在哪个平台购买不重要,不同平台页面布局多少会有一些差异。

更重要的是理解流程:申请证书,完成域名验证,下载证书,放到服务器,配置 Nginx,检查配置,重载服务,最后验证 HTTPS 是否正常

HTTPS证书部署流程图

部署证书表面上是“下载两个文件”,实际上是让浏览器访问域名时,可以和服务器建立可信的 HTTPS 连接。

这里至少要满足几件事:

  • 证书包含当前域名
  • 证书由浏览器信任的 CA 签发
  • 证书未过期
  • Nginx 能读取证书和私钥
  • 443 端口可访问
  • HTTP 能跳转到 HTTPS

证书只是链路中的一环

证书申请成功,但 Nginx 路径写错,HTTPS 仍然打不开;Nginx 配置正确,但安全组没放行 443,外部也访问不到;443 能访问,但证书域名不匹配,浏览器还是会警告。

实际操作(阿里云为例)

购买证书

阿里云搜索服务 数字证书管理服务

20260615223149658

证书分为两类:

  • 正式证书:适合生产环境、公司网站使用,安全性强、兼容性高,提供稳定性保障SLA。支持单域名、通配符、多域名,提供DV、OV、EV多种选择
  • 个人测试证书:适合测试环境、个人开发者使用,价格实惠,仅支持单域名,无稳定性保障,每人每年20个免费证书额度

生产业务建议选择正式的,个人练手、测试,可以选择个人测试证书

我这里选择的是个人测试证书(毕竟免费么):

20260615223508341

申请证书

第一次建议先选一个明确域名,把流程跑通,知道流程是什么样子的;

通配符证书和自动续期后面再处理。

购买了之后,选择证书管理,查看已经购买的证书

20260615224545494 一进来是证书 待申请的状态,输入基本信息,验证邮箱、手机号,即可完成申请

20260615224441193

常见方式有云厂商证书服务、证书服务商控制台、Let’s Encrypt,以及 acme.shCertbot 这类 ACME 工具。

第一次操作时,使用云厂商控制台申请免费证书更直观

无论平台怎么变,核心都是验证一件事:你控制着这个域名

域名验证

常见验证方式有 DNS 验证和文件验证。

DNS 验证通常要求添加一条 TXT 或 CNAME 记录;

文件验证则要求把指定文件放到网站指定路径。

对还没正式部署网站的阶段来说,DNS 验证更方便,只要能控制域名解析即可。

按平台要求添加到 DNS 解析里,然后等待生效。

20260615224441193

添加完之后可以用命令检查:

nslookup -type=TXT _acme-challenge.blog.aicultiv.com
dig TXT _acme-challenge.blog.aicultiv.com

如果能看到平台要求的记录值,再回到证书平台继续验证。

验证失败时,不要急着重申证书,先检查 主机记录、记录类型、记录值、解析平台是否正确,以及 DNS 是否已经生效。

验证成功后,等待证书颁发机构(CA) ,完成 DNS 信息验证后签发证书。

下载证书

证书签发后,平台一般会提供 Nginx、Apache、IIS、Tomcat 等类型的证书包。

20260615224623163 服务类型神什么,就选择对应的证书格式,例如,入口是 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 是否指向正确服务器

常见问题

常见问题主要有五类

  1. 证书域名不匹配,访问 www.example.com 不能使用只覆盖 blog.example.com 的证书
  2. 容器内外路径混淆,Nginx 配置必须写容器内路径
  3. 只配置 443,忘了 80 跳转
  4. 证书快过期才想起来续期
  5. 私钥泄露

从我的工作经历来看,最容易出问题的概率:

第二个 > 第三个 > 第四个

第一个和第五个出现的概率较小

手动申请和部署证书有助于理解流程,但长期维护会稍微麻烦一点。

后面如果有多个子域名,或者不想每次到期前手动处理,就需要通配符证书和自动续期。

下一篇继续写:通配符证书和 acme.sh,我如何解决多域名证书管理。

那一步会把 HTTPS 从“配置一次”,推进到“适合长期自动维护”。


本文由 楸木 原创,转载请注明出处。

相关推荐

发现更多