文章增补说明

原题目:Linux 服务器添加 SSL 证书,最初于 2022 年 4 月 21 日发布。
现增加 SSL 证书自动部署部分重新发布,原文章永久链接不变。

让网站加上一个小锁。先展示未安装证书之前:

现描述配置步骤如下。

自动部署方式

本节于 2023 年 12 月 6 日新增。

首先确保相关子域名的 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

使用:

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

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

image.png

修改后记得重启 nginx 一下:

1
2
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 个月:关于免费证书有效期策略调整通知_数字证书管理服务-阿里云帮助中心 (aliyun.com)。一个月后,新产品 HTTPS加速网关 上市,每月 60 元。

腾讯云目前(2024 年 3 月 7 日)依然保持方法有效期 1 年的免费证书。一年可签发 50 张。但是 2024 年 4 月 25 日以后,免费 SSL 证书有效期将从 12 个月缩短至 3 个月:SSL 证书 关于免费 SSL 证书策略调整通知-产品公告-文档中心-腾讯云 (tencent.com)

获取 SSL 免费证书

在云服务商上申请免费证书。阿里云免费证书有效期为 1 年(2023 年 11 月 14 日以前)。现以阿里云免费证书 云盾证书服务 (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 端口:

CDN 中的 HTTPS 设置

我一开始遇到的问题是这个:Apache 安装好证书后还是无法生效。Chrome 浏览器提醒的是证书不匹配,一看详情,他竟然在匹配腾讯云的 cdn 的证书…所以我认为 CDN 环节中还需要相应设置。(和我遇到同样的问题:https://cloud.tencent.com/developer/ask/21141

解决方法如下所述。

如果你的网站开启了 CDN,比如我使用的是腾讯云的 CDN,那么需要在腾讯云控制台中进行设置:

按照指引上传证书进行托管:

上传成功后部署即可。

参考文档:SSL 证书 安装部署 SSL 证书到内容分发网络(CDN)指引 - 证书安装 - 文档中心 - 腾讯云 (tencent.com)

【可选】强制跳转 HTTPS

在腾讯云域名控制台开启这个:

后续

WordPress 博客网站使用 HTTPS:WordPress 使用 HTTPS

301 重定向以及 HSTS 等进阶配置:Nginx 与 CDN 完成重定向:从 HTTP 重定向到 HTTPS、从 WWW 重定向到根

本文参考

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