给网站添加免费的SSL证书
自己曾经做了一个网站部署在一台 ubuntu
服务器上,但是由于一开始不会配置 SSL,所以花钱买了付费的 SSL。最近发现了 Let's Encrypt,可以免费申请 SSL 证书,下面是详细的教程。
我的网站是一个 React 的项目,所以我的服务器上只是一个简单的 Node.js 环境 + Nginx
。我主要参考了这个帖子。如果你是用其他的环境比如LAMP
那一套的,请自行搜索其他的教程。
0. 安装 node.js
先看一下服务器上是否安装了 node.js
node --version
如果这行命令没有返回 node 版本号,那么就需要安装 node.js。这里不展示了。
1. 安装 certbot
敲这两个命令
sudo snap install core
sudo snap refresh core
如果你曾经安装过 certbot,这里建议你先卸载原先的版本然后重新安装,这样你就有最新的版本了。
卸载
sudo apt remove certbot
安装
sudo snap install --classic certbot
创建一个 symbolic link
因为 certbot 安装完毕之后是不能直接跑他的命令的,所以这里我们多一步,创建一个 symbolic link。
sudo ln -s /snap/bin/certbot /usr/bin/certbot
2. 检查一下 Nginx 的相关配置
如果你没有安装 Nginx,请参考这个帖子。
如果你安装了 Nginx,请打开以下这个文件。example.com
是你自己的域名。
sudo nano /etc/nginx/sites-available/example.com
确保你有带有server_name
的那一行,应该长这样。确保他没有被注释掉。
server_name example.com www.example.com;
保存配置,从编辑器中退出来,然后敲这个命令确保没有语法错误。
sudo nginx -t
用这个命令把 Nginx reload 一下使配置生效。
sudo systemctl reload nginx
3. 防火墙设置
ubuntu 服务器上一般都是用一个叫做ufw
的东西来做防火墙的。我们可以用这个命令看一下目前的状态。
sudo ufw status
一般返回的东西应该是这样的。
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 流量。
sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'
之后你的防火墙配置应该是这样的。
sudo ufw status
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 证书。记得改成自己的域名。
sudo certbot --nginx -d example.com -d www.example.com
如果一切正常,terminal 最后会显示 SSL 证书被存到什么路径了之类的信息,类似这样。
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 是否依然有效。
sudo systemctl status snap.certbot.renew.service
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 是如何更新的。
sudo certbot renew --dry-run