摘要生成中...
AI 摘要
Hunyuan-lite
文章增补说明 260318

原题目:

  • 「Linux 服务器添加 SSL 证书」最初于 220421 发布。
  • 「Linux 服务器 HTTPS 的配置」于 231206 增补重发。增加 SSL 证书自动部署部分重新发布,原文章永久链接不变。

现文章:

  • 260318 增加腾讯云无感知续费证书的流程。删除一些不必要的章节段落。

现在的网络应用程序都需要部署 HTTPS 证书。如果你的博客网站没有开启 HTTPS,浏览器会加上「不安全」的提示:

安装证书后的效果:

image.png

本文的主要内容:

  • Linux 上使用 Certbot 自动部署证书
  • 将签发好的证书手动部署到服务器中
  • 腾讯云一条龙,无感知自动管理 SSL 证书

自动部署方式

本节于 231206 新增。

首先确保相关子域名的 DNS 已经成功解析到当前服务器。

安装 certbot:

1
2
3
4
5
6
7
# CentOS 安装 certbot:
yum install certbot -y
yum install python3-certbot-nginx -y

# Ubuntu 安装 certbot:
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

先在 Nginx 配置文件中做好基础的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server { 
listen 443; # 这个端口不要漏掉,要不然 Certbot 验证不通过
server_name mcp.uuanqin.top; # 你的域名,确保已解析到服务器 IP

# 反向代理核心配置(必须添加,解决 Header 丢失问题)
location / {
proxy_pass http://localhost:8991; # 转发到 Java 应用端口
proxy_set_header Host $host; # 传递真实 Host 给后端
proxy_set_header X-Real-IP $remote_addr; # 传递真实客户端 IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递多级代理 IP

proxy_connect_timeout 30s; # 连接后端超时时间
proxy_read_timeout 60s; # 读取后端响应超时时间
}

# 可选:添加访问日志,方便排查问题
access_log /var/log/nginx/mcp.uuanqin.top.access.log main;
error_log /var/log/nginx/mcp.uuanqin.top.error.log;
}

然后才使用 Certbot:

1
2
certbot --nginx
# 根据提示进行邮箱输入,以及需要加密的域名选择。首次注册的邮箱会收到认证邮件,记得查收。

可以发现 Nginx 的配置文件已经出现了变化。比如我要加密的是 mcp.uuanqin.top 的子域名。现在的配置为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
server {
server_name mcp.uuanqin.top; # 你的域名,确保已解析到服务器 IP
listen 443 ssl;

# 反向代理核心配置(必须添加,解决 Header 丢失问题)
location / {
proxy_pass http://localhost:8991; # 转发到 Java 应用端口
proxy_set_header Host $host; # 传递真实 Host 给后端
proxy_set_header X-Real-IP $remote_addr; # 传递真实客户端 IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递多级代理 IP

proxy_connect_timeout 30s; # 连接后端超时时间
proxy_read_timeout 60s; # 读取后端响应超时时间
}

# 可选:添加访问日志,方便排查问题
access_log /var/log/nginx/mcp.uuanqin.top.access.log main;
error_log /var/log/nginx/mcp.uuanqin.top.error.log;

ssl_certificate /etc/letsencrypt/live/mcp.uuanqin.top/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/mcp.uuanqin.top/privkey.pem; # managed by Certbot
}


server {
if ($host = mcp.uuanqin.top) {
return 301 https://$host$request_uri;
} # managed by Certbot

listen 80;
server_name mcp.uuanqin.top;
return 404; # managed by Certbot
}

修改后记得更新 Nginx 配置一下:

1
2
3
4
nginx -s reload

systemctl restart nginx
# 或 service nginx restart

迁移服务器提示:把 nginx 配置文件迁移到新的服务器上时。在新服务器第一次使用 certbot 前,把之前旧服务器 certbot 在配置文件中自动添加的内容删掉,不然出错。

其他参考(没试过):ZeroSSL: How to Secure Your Website with a Free SSL Certificate (linuxiac.com)

certbot 部署的证书有效期为 3 个月,在过期前 1 个月会收到提示。我们可以重新运行 certbot --nginx 对相应的证书进行更新。或者结合 cron 定时任务完成自动更新。cron 用法详见:站内文章Linux 使用 Cron 创建定时任务

手动部署方式

现在的免费证书都是 3 个月有效期了

阿里云免费证书有效期目前调整至 3 个月 [1]。一个月后,新产品 HTTPS加速网关 上市,每月 60 元。

腾讯云目前(2024 年 3 月 7 日)依然保持方法有效期 1 年的免费证书。一年可签发 50 张。但是 2024 年 4 月 25 日以后,免费 SSL 证书有效期将从 12 个月缩短至 3 个月 [2]

获取 SSL 免费证书

在云服务商上申请免费证书。阿里云免费证书有效期为 1 年(231114 以前)。现以阿里云免费证书 云盾证书服务 (aliyun.com) 购买为例:

在控制台下载证书:

选择 Apache 服务器类型的证书进行下载(图中以 Apache 为例):

得到一个压缩文件,文件包含以下内容:

  • 证书文件:以.crt 为后缀或文件类型。
  • 证书链文件:以.crt 为后缀或文件类型。
  • 密钥文件:以.key 为后缀或文件类型。

文档链接:在 Apache 服务器上安装 SSL 证书 (aliyun.com)

如果网站开启了 CDN,更新证书时,请确保加速域名配置的证书是新的证书。

安装证书到 Nginx

在 Nginx 或 Tengine 服务器安装 SSL 证书 (aliyun.com)

安装证书到 Apache

接下来请根据这篇指引进行配置安装:在 Apache 服务器上安装 SSL 证书 (aliyun.com)

在实际操作中,我和指引中不同的是,mod_ssl.so 不需要在 httpd.conf 里进行引用。阿里云文档里的 http-ssl.conf,实际上就是/etc/httpd/conf.d/ssl.conf(安装好 mod_ssl.so 模块后,ssl.conf 文件就会产生)。

通过 FTP 传输工具把证书上传到指定位置,在配置时就用这个位置(下图)。

httpd.conf:

ssl.conf:

弄好后记得重启 Apache 服务器:

1
apachectl restart

服务器的安全组记得开放 443 端口:

腾讯云无感知自动申领、续费和部署 SSL 证书

本章节于 260318 新增。

我在在腾讯云使用了 CDN 和 EO 产品,相关域名的证书也是通过腾讯云 SSL 颁发的。当免费证书过期时,可以手动申领并手动在相关产品处切换为新证书。

但是这样很麻烦:

  • 需要及时感知证书的到期时间并手动申领
  • 手动申领证书后还要对域名进行 DNS 认证
  • 新证书需要到相关产品处重新更换

为了避免这些步骤,腾讯云贴心提供了解决方案。SSL 证书开启自动续费 + 证书托管,即可实现自动化管理证书 [3]

image.png

但是腾讯云的证书自动续费指的是自动申请一张待验证的证书,证书的成功签发还需要 DNS 验证步骤,而这个步骤往往是需要人工介入的 [4]。但是,如果证书绑定的域名托管在腾讯云 DNSPod(记得开启解析),系统会自动添加 DNS 验证,所有你可以将相关域名(或子域名)交给 DNSPod 进行解析。

只将子域名交给 DNSPod 进行解析详看 站内文章更换域名解析商

image.png

后续参考

WordPress 博客网站使用 HTTPS:站内文章WordPress 使用 HTTPS

301 重定向以及 HSTS 等进阶配置:站内文章从 HTTP 重定向到 HTTPS、从 WWW 重定向到根

本文参考

我走过的弯路:How to install an SSL Certificate on Apache – HelpDesk SSLs.com


  1. 关于免费证书有效期策略调整通知_数字证书管理服务-阿里云帮助中心 (aliyun.com) ↩︎

  2. SSL 证书 关于免费 SSL 证书策略调整通知-产品公告-文档中心-腾讯云 (tencent.com) ↩︎

  3. SSL 证书 SSL 证书托管指引_腾讯云 ↩︎

  4. SSL 证书 SSL 证书自动续费指引_腾讯云 ↩︎