给网站添加免费的SSL证书

自己曾经做了一个网站部署在一台 ubuntu 服务器上,但是由于一开始不会配置 SSL,所以花钱买了付费的 SSL。最近发现了 Let’s Encrypt,可以免费申请 SSL 证书,下面是详细的教程。

我的网站是一个 React 的项目,所以我的服务器上只是一个简单的 Node.js 环境 + Nginx。我主要参考了这个帖子。如果你是用其他的环境比如LAMP那一套的,请自行搜索其他的教程。

0. 安装 node.js

先看一下服务器上是否安装了 node.js

1
node --version

如果这行命令没有返回 node 版本号,那么就需要安装 node.js。这里不展示了。

1. 安装 certbot

敲这两个命令

1
2
sudo snap install core
sudo snap refresh core

如果你曾经安装过 certbot,这里建议你先卸载原先的版本然后重新安装,这样你就有最新的版本了。

卸载

1
sudo apt remove certbot

安装

1
sudo snap install --classic certbot

因为 certbot 安装完毕之后是不能直接跑他的命令的,所以这里我们多一步,创建一个 symbolic link。

1
sudo ln -s /snap/bin/certbot /usr/bin/certbot

2. 检查一下 Nginx 的相关配置

如果你没有安装 Nginx,请参考这个帖子

如果你安装了 Nginx,请打开以下这个文件。example.com是你自己的域名。

1
sudo nano /etc/nginx/sites-available/example.com

确保你有带有server_name的那一行,应该长这样。确保他没有被注释掉。

1
server_name example.com www.example.com;

保存配置,从编辑器中退出来,然后敲这个命令确保没有语法错误。

1
sudo nginx -t

用这个命令把 Nginx reload 一下使配置生效。

1
sudo systemctl reload nginx

3. 防火墙设置

ubuntu 服务器上一般都是用一个叫做ufw的东西来做防火墙的。我们可以用这个命令看一下目前的状态。

1
sudo ufw status

一般返回的东西应该是这样的。

1
2
3
4
5
6
7
8
9
Output
Status: active

To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)

敲如下命令使防火墙能允许 HTTPS 流量。

1
2
sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'

之后你的防火墙配置应该是这样的。

1
sudo ufw status
1
2
3
4
5
6
7
8
9
Output
Status: active

To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx Full (v6) ALLOW Anywhere (v6)

4. 获得 SSL 证书

敲如下命令来申请 SSL 证书。记得改成自己的域名。

1
sudo certbot --nginx -d example.com -d www.example.com

如果一切正常,terminal 最后会显示 SSL 证书被存到什么路径了之类的信息,类似这样。

1
2
3
4
5
6
7
8
9
10
11
12
13
Output
IMPORTANT NOTES:
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/your_domain/fullchain.pem
Key is saved at: /etc/letsencrypt/live/your_domain/privkey.pem
This certificate expires on 2022-06-01.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
* Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
* Donating to EFF: https://eff.org/donate-le

理论上此时你的 SSL 应该就立即生效了。你可以试着访问自己的网站,或者通过一些 SSL 检测工具来验证一下你的证书是否有效。

5. 自动更新 SSL 证书

虽然我们通过这个方式获得的 SSL 证书是免费的,但是它的有效期一般只有 90 天。所以这里我们可以配置他的自动更新。

如下这个命令可以让 certbot 一天运行两次以检查当前的 SSL 是否依然有效。

1
sudo systemctl status snap.certbot.renew.service
1
2
3
4
5
Output
○ snap.certbot.renew.service - Service for snap application certbot.renew
Loaded: loaded (/etc/systemd/system/snap.certbot.renew.service; static)
Active: inactive (dead)
TriggeredBy: ● snap.certbot.renew.timer

可以通过如下这个命令测试一下 SSL 是如何更新的。

1
sudo certbot renew --dry-run

❤️ 以上


给网站添加免费的SSL证书
https://shurui91.github.io/posts/345603125.html
Author
Aaron Liu
Posted on
November 2, 2024
Licensed under