Ubuntu中Nginx使用方法以及获取或自签并配置SSL证书

Nginx作为一款高性能的开源web服务器反向代理软件,不仅具备强大的性能和灵活性,更是许多网站首选的搭建工具。在这篇博客中,将简单介绍Nginx的基本使用方法。此外,由于受信任的证书颁发机构 (CA) 签发的SSL证书通常需要支付一些费用,这里会介绍两种免费获取SSL证书的途径:通过openssl生成自签证书和利用Certbot工具配置Let’s Encrypt证书。

Nginx使用方法

  1. 安装Nginx
1
sudo apt install nginx
  1. 为你的域名新增一个的配置
1
sudo vi /etc/nginx/sites-available/your_domain.com

以下两个是可能的配置文件示例,http:80端口,https:443端口

1
2
3
4
5
6
7
8
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
server_name example.com www.example.com;

# 其它配置
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 443 ssl;
server_name your_domain.com;

ssl_certificate /path/to/your/ssl_certificate.crt;
ssl_certificate_key /path/to/your/ssl_certificate.key;

location / {
proxy_pass http://0.0.0.0:9003;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}

# 其它配置
}
  1. 链接配置文件到sites-enabled中,nginx服务只会加载sites-enabled中的配置文件
1
sudo ln -s /etc/nginx/sites-available/your_domain.com /etc/nginx/sites-enabled/
  1. 测试配置文件,检查是否有问题
1
sudo nginx -t
  1. 使nginx服务重新加载配置文件
1
sudo systemctl reload nginx

如果你的网站是公共可访问的,并且你希望避免访问者看到不安全警告,考虑获取由受信任的证书颁发机构 (CA) 签发的证书。另外还有两种方式:

  1. openssl生成自签的证书:浏览器访问时会出现警告,私人网络或测试环境中使用
  2. Let’s Encrypt:免费 SSL 证书的证书颁发机构
    下面是这两种证书的使用方法。

openssl生成自签的证书并且使用nginx配置https证书

OpenSSL自签名证书是由OpenSSL库提供的用于加密与认证的数字证书。自签名证书不受公共信任机构的信任,而是由证书持有人本身签名。因此,自签名证书在私人网络或测试环境中非常有用。

  1. 安装nginx、openssl
1
sudo apt install nginx openssl
  1. 创建服务器证书密钥文件 server.key
1
openssl genrsa -des3 -out server.key 2048
  1. 创建服务器证书的申请文件 server.csr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
openssl req -new -key server.key -out server.csr
输出内容为:
Enter pass phrase for root.key: ← 输入前面创建的密码
Country Name (2 letter code) [AU]:CN ← 国家代号,中国输入CN
State or Province Name (full name) [Some-State]:BeiJing ← 省的全名,拼音
Locality Name (eg, city) []:BeiJing ← 市的全名,拼音
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyCompany Corp. ← 公司英文名
Organizational Unit Name (eg, section) []: ← 可以不输入
Common Name (eg, YOUR name) []: ← 输入域名,如:iot.conet.com
Email Address []:admin@mycompany.com ← 电子邮箱,可随意填
Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []: ← 可以不输入
An optional company name []: ← 可以不输入
  1. 备份一份服务器密钥文件,去除文件口令
1
2
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
  1. 生成证书文件server.crt
1
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
  1. 将证书配置到nginx中

使用 Certbot 工具配置 Let’s Encrypt 证书

Let’s Encrypt 是一个提供免费 SSL/TLS 证书的证书颁发机构。你可以使用 Let’s Encrypt 来获取一个免费的有效证书。有许多工具可以帮助你自动化这个过程,例如 Certbot,它是一个用于自动化证书获取和安装的工具。以下是在 Ubuntu 上使用 Certbot 和 Let’s Encrypt 获取证书的基本步骤:

1. 使用以下命令在 Ubuntu 上安装 Certbot

1
2
sudo apt update
sudo apt install certbot python3-certbot-nginx

2. 配置好 Nginx

如上面所说配置好nginx,例如现在只是监听http的80端口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name your_domain.com;
root /var/www/html;;

location ~ \.php$ {
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location / {
try_files $uri $uri/ /yourls-loader.php$is_args$args;
index index.php index.html index.htm;
}
}

3. 获取证书

运行 Certbot 命令时,使用 -d 选项指定要为其获取证书的域名。例如,如果你的域名是 your_domain.com,可以运行以下命令:

1
sudo certbot --nginx -d your_domain.com

根据 certbot 的提示配置 HTTPS 设置:

  • 输入邮箱
  • 输入(A)gree同意注册
  • 输入y/n是否与电子前沿基金会(Let’s Encrypt)共享你的电子邮件地址,并接受电子邮件
  • 接下来等待为指定的域名获取证书,并更新nginx配置
  • 输入2配置http到https重定向,输入1不重定向
  • 完成

这是配置完成后,自动更新后的nginx配置文件

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
34
35
server {
server_name your_domain.com;
root /var/www/html; # 将root指令移到server块级别

location ~ \.php$ {
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location / {
try_files $uri $uri/ /yourls-loader.php$is_args$args;
index index.php index.html index.htm;
}

listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

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


listen 80 default_server;
listen [::]:80 default_server;
server_name your_domain.com;
return 404; # managed by Certbot


}

4. 配置自动更新

Let’s Encrypt 证书有一个有效期,通常为90天。为了确保证书始终有效,你应该设置自动更新。

  1. 执行证书自动更新测试

在设置自动更新之前,首先测试 Certbot 是否能够正确续订证书。运行以下命令:

1
sudo certbot renew --dry-run

这会模拟证书的续订过程,确保所有设置都正确。如果一切正常,你应该看到一条消息表明续订测试成功。

  1. 配置自动更新

Certbot 默认会在 /etc/cron.d/certbot 中创建一个 cron 任务,用于自动定期检查证书是否需要更新。你可以编辑此文件,检查自动更新的配置。

1
sudo vi /etc/cron.d/certbot
  1. 确保 cron 任务中有类似下面的内容:
1
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew

上述 cron 任务表示 Certbot 将每12小时检查一次证书是否需要更新。如果需要更新,Certbot 将在静默模式下进行更新。

  1. 自定义定时任务(可选)

如果你想更改自动更新的频率,你可以根据需要编辑 cron 任务。修改 cron 表达式中的时间间隔,以满足你的要求。

Nginx+内网穿透隧道工作机制

flow