使用Let's Encrypt保护Nginx

使用Let’s Encrypt 官方工具 Certbot 配置SSL安全证书

介绍

http vs. https

http是一个传输网页内容的协议, https是”http over SSL/TLS”.

SSL/TLS

SSL是Secure Sockets Layer的缩写,是安全套接层
TLS是 Transport Layer Security 是传输层安全协议
SSL和TLS是同一个东西的不同阶段,理解为同一个东西也行,都是安全协议就对了.

怎么部署https

部署https需要被信任的CA(Certificate Authority)也就是证书授权中心颁发的SSL安全证书,并且将它部署到你的网站服务器上.

怎么获得SSL安全证书

我们自己可以签发SSL安全证书,但是我们自己签发的安全证书不会被主流的浏览器信任,所以我们需要被信任的证书授权中心(CA)签发的安全证书.而一般的SSL安全证书签发服务都比较贵,为了加快退关https的普及,公益组织ISRG(Internet Security Research Group)推出Let’s Encrypt免费证书.

官方客户端Certbot

Nginx

Nginx,发音为”engine-x”,是一种功能丰富的轻量级网络服务器,以其速度、效率和可扩展性而闻名,由于它能以最少的资源消耗管理大流量负载,开发人员更愿意将其作为托管网站和服务在线应用程序的首选.

Let’s Encrypt 是一个证书颁发机构(CA), 它提供了一种获取和安装免费TLS/SSL证书的可访问方式,从而在Web服务器上启动加密的HTTPS.此外,Let’s Encrypt还提供Certbot工具来完成自动化证书的颁发和更新,该工具可以解析Web服务器配置文件(例如 nginx)并自动设置他们。

让我们进入正题吧。

  • 安装Certbot
  • 安装Nginx(可选)
  • 确认Nginx的配置
  • 获取SSL证书
  • 使用SSLLabs验证SSL
  • 设置Cron作业来更新证书

1. 安装Certbot

Certbot建议使用snap包进行安装

1
$ sudo snap install core; sudo snap refresh core

卸载旧版本cerbot

1
$ sudo apt remove certbot

安装cerbot

1
$ sudo snap install --classic certbot

最后建立软连接certbot

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

2. 安装Nginx

如果您的主机上没有安装Nginx, 您可以使用单个命令来完成此操作:

1
$ sudo apt-get install nginx

3. 确认Nginx配置

使用Nginx Web服务器时,服务器块(类似于Apache中的虚拟主机)可用于封装配置详细信息并从一台服务器托管多个域。

Ubuntu 22.04上的Nginx默认启动一个服务器块,该服务器块配置为从位于目录中提供地址/var/www/html.虽然这对于单个站点来说效果很好,但如果你托管多个站点。这种配置就不太合适,所以下面我们创建一个术语your_domain域名的目录

1
$ sudo mkdir -p /var/www/your_domain/html

接下来,使用环境变量分配目录的所有权 $USER:

1
$ sudo chown -R $USER:$USER /var/www/your_domain/html

为了确保你的权限正确并允许所有者读取、写入和执行文件,同时只授予组和其他人读取和执行权限,你可以输入以下命令:

1
$ sudo chmod -R 755 /var/www/your_domain

接下来,使用你最喜欢的编辑器创建一个示例index.html页面: vim

1
$ vim /var/www/your_domain/html/index.html

在里面添加以下示例HTML:

1
2
3
4
5
6
7
8
<html>
<head>
<title>Welcome to your_domain!</title>
</head>
<body>
<h1>Success! The your_domain server block is working!</h1>
</body>
</html>

为了让Nginx提供此内容,必须使用正确的指令创建一个服务器块,我们不直接修改默认配置文件, 而是在以下位置创建一个新配置文件: /etc/nginx/sites-available/your_domain

1
$ sudo vim /etc/nginx/sites-available/your_domain

粘贴以下配置块,该配置块于默认配置块类似,但针对我们的新目录和域名进行更新:

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen 80;
listen [::]:80;

root /var/www/your_domain/html;
index index.html index.htm index.nginx-debian.html;

server_name your_domain www.your_domain;

location / {
try_files $uri $uri/ =404;
}
}

请注意,我们已将root配置更新为新目录和server_name域名

接下来,我们创建上面文件的链接文件到sites-enabled目录,Nginx在启动期间会读取该目录

1
$ sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled

服务器配置

  • /etc/nginx: Nginx配置目录,所有Nginx配置文件都位于此处
  • /etc/nginx/nginx.conf: 主要的Nginx配置文件,可以修改它更改Nginx全局配置
  • /etc/nginx/sites-available/: 可以存储每个站点服务器块的目录,Nginx将不会使用在此目录中找到的配置文件,除非它们链接到该sites-enabled目录。通常,所有服务器块配置都在此目录中完成,然后通过链接到其他目录来启动.
  • /etc/nginx/sites-enabled: 存储已启动的每站点服务器块的目录,通常,这些是通过链接到sites-available目录中找到的配置文件来创建的
  • /etc/nginx/snippets: 此目录包含可以在Nginx配置中重复使用的配置片段

服务器日志:

  • /var/log/nginx/access.log: 除非Nginx配置为其他方式,否则对Web服务器的每个请求都会记录在此日志文件中
  • /var/log/nginx/error.log: 任何Nginx错误都会记录在此日志中.

注意: Nginx使用一种符号连接的方式跟踪启动了哪些服务块。创建符号链接就像在磁盘上创建快捷方式一样,以便你后续可以从sites-enabled目录中删除快捷方式,同时保留服务器块(sites-available)。

为了避免因添加其他服务器名称而可能出现的哈希桶内存问题,有必要调整文件中的单个值/etc/nginx/nginx.conf.打开文件:

1
$ sudo vim /etc/nginx/nginx.conf

找到该server_name_hash_bucket_size指令并删除#符号以取消注释该行。

1
2
3
4
5
6
7
...
http {
...
server_names_hash_bucket_size 64;
...
}
...

接下来,测试Nginx文件中是否有语法错误:

1
2
3
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

如果没有任何问题,请重新启动Nginx以便更改生效

1
$ sudo systemctl restart nginx

4. 获取SSL证书

Certbot提供多种通过插件获取SSL证书的方式。Nginx插件将负责重新配置Nginx并在必要时重新加载配置

1
$ sudo certbot --nginx -d your_domain -d www.your_domain

certbot--nginx插件一起运行,用于-d指定我们希望证书有效的域名.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
➜ sudo certbot --nginx -d your_domain
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Certificate not yet due for renewal

You have an existing certificate that has exactly the same domains or certificate name you requested and isn't close to expiry.
(ref: /etc/letsencrypt/renewal/dsm.chyidl.com.conf)

What would you like to do?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Attempt to reinstall this existing certificate
2: Renew & replace the certificate (may be subject to CA rate limits)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1
Deploying certificate
Successfully deployed certificate for your_domain to /etc/nginx/sites-enabled/your_domain
Congratulations! You have successfully enabled HTTPS on https://your_domain

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

您的证书已下载、安装和加载,你的Nginx配置现在将自动将所有Web请求重定向到https://.尝试重新加载您的网站并注意浏览器的安全指示器。

5. 使用SSLLabs 验证SSL

完成上面步骤后,您可以使用SSL Labs Server Test验证证书。只需要输入你的域名等待结果

blog.chyidl.com

6. 验证Certbot自动续订

Let’s ENcrypt的证书有效期只有90天,我们安装的软件包certbot通过添加一个systemd计时器来为我们处理这个问题,该计时器每天运行两次,并自动续订过期30天内的任何证书.

你可以使用以下命令查看计时器的状态systemctl

1
$ sudo systemctl status snap.certbot.renew.service

参考


使用Let's Encrypt保护Nginx
https://blog.chyidl.com/2024/01/09/Nginx-SSL-Ubuntu/
作者
Yaqing Chyi
发布于
2024年1月9日
许可协议