menu_book
description
Let’s Encrypt 是一家免费颂发 SSL 证书的机构,我们在宁皓独立开发者训练营中开发的应用,最终需要部署到真正的服务器上,在配置 Web 服务使用 HTTPS 协议的时候,需要用到正规机构颂发的 SSL 证书。
打开域名服务商提供的域名管理界面,我们需要配置域名的 DNS 记录,记录类型选择 A,这种记录对应的值应该是一个 IP 地址,也就应该就是我们的云服务器的 IP 地址,主机记录可以根据自己的需求设置。
为了演示,我在自己的 ninghao.net 这个域名里配置了一条记录:
记录生效以后,nid-ssl-demo.ninghao.net 就会指向我的一台云服务器,地址是 42.120.40.68。
要确定配置的 DNS 记录已经生效了,可以在终端,使用 ping 这个命令:
ping nid-ssl-demo.ninghao.net
注意观察返回的结果,在域名的后面会出现一个 IP 地址,这个 IP 地址如果是我们之前配置的 DNS 记录里的那个记录值,就说明 DNS 记录已经生效了。
示例
PING nid-ssl-demo.ninghao.net (42.120.40.68)
在宁皓独立开发者训练营中,部署服务端应用、Web前端应用、配置 SSH 通道,这些都会用到使用 NGINX 创建的各种 Web 服务器。
先要使用 SSH 登录到远程的云服务器,然后通过执行一些命令来安装与启动 NGINX 服务。
远程登录到服务器以后,使用 apt 直接安装一下 nginx:
sudo apt install nginx -y
让 NGINX 服务可以开机自启动,执行:
sudo systemctl enable nginx
启动 NGINX 服务,执行:
sudo systemctl start nginx
启动以后,查看一下 nginx 这个服务的当前的状态,执行:
sudo systemctl status nginx
如果发现 Active: active (running) ,表示这个服务正在运行。
Nginx 服务启动之后,它就可以提供 Web 服务了。打开在本地电脑上的浏览器,访问服务器的 IP 地址,或者指向这个 IP 地址的域名,你会看到一个 Nginx 的欢迎页面。注意在地址栏上输入域名或者 IP 地址的时候,要使用 http:// ,不要使用 https:// 。比如:http://nid-ssl-demo.ninghao.net 。
通过 NGINX 的配置文件,可以在一台云服务器上同时创建多个 NGINX 服务器,每个服务器都有自己的一套配置,比如设置服务器监听的端口号,绑定自己的域名,配置服务器的 SSL 证书等等。我们先看一下如何创建一个 NGINX 的 Web 服务器,访问某个域名时,可以得到云服务器某个目录里的资源(各种文件)。
先在云服务器的某个目录里面新建一个目录,这个目录一会儿会作为 NGINX 的 Web 服务器的主目录。
mkdir -p /mnt/nid-ssl-demo
在 /mnt 的下面,新建一个 nid-ssl-demo 目录,一会以儿配置好 NGINX 服务器以后,就可以通过指定的网址访问到这个目录里的资源了。
在 Web 服务的资源目录要里,新建一个 HTML 文档。
vi /mnt/nid-ssl-demo/index.html
文件内容如下:
/mnt/nid-ssl-demo/index.html
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<h1 style="font-weight:200">
宁皓独立开发者训练营 🏕
</h1>
</body>
</html>
通过 NGINX 的配置文件,可以创建需要的各种服务器,比如 Web 服务器,反向代理服务器等等。在 NGINX 的配置文件里,用一个 server 区块就可以定义一个服务器,在这个 server 配置区块里,可以设置服务器监听的端口号,绑定的域名,使用的 SSL 证书等等。
创建配置文件
vi /etc/nginx/conf.d/nid-ssl-demo.ninghao.net.conf
文件内容如下:
/etc/nginx/conf.d/nid-ssl-demo.ninghao.net.conf
server {
listen 80;
server_name nid-ssl-demo.ninghao.net;
location / {
root /mnt/nid-ssl-demo;
index index.html;
}
}
上面这段 NGINX 配置,用 server 区块定义了一个 Web 服务器,监听的端口号是 80,这是 HTTP 协议默认使用的端口号。server_name 指令设置的是绑定在这台服务器上的域名。然后用了一个 location 区块,在里面用 root 指令定义了根目录(资源目录),index 指令设置的是可以默认打开的一些东西,比如 index.html。
重载 NGINX
添加了新的配置以后需要重载 NGINX 才能生效,执行:
sudo systemctl reload nginx
测试
访问 nid-ssl-demo.ninghao.net 的时候,默认就会获取到云服务器 /mnt/nid-ssl-demo 目录下的 index.html 这个文件。 注意在地址栏里的地址的左边,会显示 不安全 ,这是因为当前使用的是 HTTP 协议访问的服务器,如果让这台 Web 服务器支持使用 HTTPS 协议访问,需要先从证书机构那里申请 SSL 证书,然后再配置 NGINX 服务器使用这个 SSL 证书。
申请 Let’s Encrypt 颁发的 SSL 证书,可以使用一个叫 Certbot 的命令行工具。Certbot 为不同的平台提供了各自的安装方法,下面我们会在 Ubuntu 系统里安装一下这个工具。
登录到使用 Ubuntu 系统的云服务器。
安装 snapd
sudo apt install snapd
安装 certbot
sudo snap install --classic certbot
设置可在全局执行 certbot 命令
sudo ln -s /snap/bing/certbot /usr/bin/certbot
首先要确定已经配置好了域名的 DNS 记录,指向我们的云服务器,并在云服务器上安装配置好了 NGINX 服务器。
sudo certbot --nginx
上面这个命令会申请签发 SSL 证书,并且会自动下载安装好申请的 SSL 证书,也就是它会修改我们网站的 NGINX 配置文件,在里面添加使用 SSL 证书需要的配置。
使用 Certbot 命令申请 SSL 证书时,会根据 NGINX 的服务器来判断可以申请 SSL 证书的域名。
执行 certbot 命令时会提示我们选择要申请 SSL 证书的域名,输入列出的指定的序号,然后按回车确认。
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org
Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: nid-ssl-demo.ninghao.net
...
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel):
选择域名序号并按下回车以后,会提示是否需要将 HTTP 的访问重定向到 HTTPS。1 表示不重定向,2 表示重定向,如果选择要重定向 HTTP 的访问,certbot 会修改服务器对应的 NGINX 配置,将服务器的 HTTP 访问重定向到 HTTPS。
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access...
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
证书颂发成功就提示 Congratulations,申请的证书文件默认会放在 /etc/letsencrypt/live 目录对应的域名目录下面,比如 nid-ssl-demo.ninghao.net,在这个目录里会有两个文件:fullchain.pem 与 privkey.pem。
Congratulations! You have successfully enabled https://nid-ssl-demo.ninghao.net
...
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/nid-ssl-demo.ninghao.net/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/nid-ssl-demo.ninghao.net/privkey.pem
Your cert will expire on 2022-08-13. To obtain a new or tweaked
version of this certificate in the future, simply run certbot again
with the "certonly" option. To non-interactively renew *all* of
your certificates, run "certbot renew"
- ...
观察一下申请了 SSL 证书的域名相关的 NGINX 配置文件,你会发现一些结尾有 # managed by Certbot 注释的配置,这些东西是 certbot 工具加上去的。
/etc/nginx/conf.d/nid-ssl-demo.ninghao.net.conf
server {
listen 443 ssl; # managed by Certbot
server_name nid-ssl-demo.ninghao.net;
ssl_certificate /etc/letsencrypt/live/nid-ssl-demo.ninghao.net/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/nid-ssl-demo.ninghao.net/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
location / {
root /mnt/nid-ssl-demo;
index index.html;
}
}
server {
listen 80;
server_name nid-ssl-demo.ninghao.net;
if ($host = nid-ssl-demo.ninghao.net) {
return 301 https://$host$request_uri;
} # managed by Certbot
return 404; # managed by Certbot
}
你会发现在这个 NGINX 的配置文件里有两个 server 区块,一个监听的端口是 443,一个监听的是 80 端口,这个监听 80 端口的服务器里面做了重定向的配置,服务器接收到的访问会被重定向到 https://$host$request_uri 。
在监听 443 端口的服务器里面,会多了一些配置信息,这些配置信息是由 certbot 加上去的,主要就是指定 SSL 证书文件的位置,还有一些相关的配置。
在浏览器测试一下,使用 HTTPS 协议访问申请并配置了 SSL 证书的主机名。观察地址栏里的地址左侧,会出现一个小锁着图标,说明当前是通过 HTTPS 协议访问的服务。 点开小锁头图标,然后点击 证书有效,会显示 SSL 证书相关信息。
用 Certbot 申请的 Let’s Encrypt 证书,有效期是 3 个月,也就是 3 个月以后你需要重新执行 certbot 命令为指定的域名申请新的 SSL 证书。