Let’s Encrypt

Let’s Encrypt 是一家免费颂发 SSL 证书的机构,我们在宁皓独立开发者训练营中开发的应用,最终需要部署到真正的服务器上,在配置 Web 服务使用 HTTPS 协议的时候,需要用到正规机构颂发的 SSL 证书。

流程

  1. 配置域名指向我们的云务器的 IP 地址。
  2. 在云服务器上安装 Nginx。
  3. 配置 Nginx,创建 Web 服务器。
  4. 重载 Nginx 服务,让新的配置生效。
  5. 在云服务器上,安装申请 Let’s Encrypt 证书时需要使用的 certbot 工具。
  6. 执行 certbot 命令申请 Let’s Encrypt 证书。
  7. 重载 Nginx 服务,让新的配置生效。

添加域名 DNS 记录

打开域名服务商提供的域名管理界面,我们需要配置域名的 DNS 记录,记录类型选择 A,这种记录对应的值应该是一个 IP 地址,也就应该就是我们的云服务器的 IP 地址,主机记录可以根据自己的需求设置。

为了演示,我在自己的 ninghao.net 这个域名里配置了一条记录:

  • 记录类型:A
  • 主机记录:nid-ssl-demo
  • 记录值:42.120.40.68

记录生效以后,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)

NGINX

在宁皓独立开发者训练营中,部署服务端应用、Web前端应用、配置 SSH 通道,这些都会用到使用 NGINX 创建的各种 Web 服务器。

安装与启动 NGINX

先要使用 SSH 登录到远程的云服务器,然后通过执行一些命令来安装与启动 NGINX 服务。

在 Ubuntu 系统里安装 NGINX

远程登录到服务器以后,使用 apt 直接安装一下 nginx

sudo apt install nginx -y

设置开机自启动 NGINX

让 NGINX 服务可以开机自启动,执行:

sudo systemctl enable nginx

启动 NGINX 服务

启动 NGINX 服务,执行:

sudo systemctl start nginx

启动以后,查看一下 nginx 这个服务的当前的状态,执行:

sudo systemctl status nginx

如果发现 Active: active (running) ,表示这个服务正在运行。

测试 Web 服务

Nginx 服务启动之后,它就可以提供 Web 服务了。打开在本地电脑上的浏览器,访问服务器的 IP 地址,或者指向这个 IP 地址的域名,你会看到一个 Nginx 的欢迎页面。注意在地址栏上输入域名或者 IP 地址的时候,要使用 http:// ,不要使用 https:// 。比如:http://nid-ssl-demo.ninghao.net

创建 NGINX 服务器

通过 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 服务器

通过 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 证书。

Certbot

申请 Let’s Encrypt 颁发的 SSL 证书,可以使用一个叫 Certbot 的命令行工具。Certbot 为不同的平台提供了各自的安装方法,下面我们会在 Ubuntu 系统里安装一下这个工具。

官方网站https://certbot.eff.org

在 Ubuntu 系统里安装 Certbot

登录到使用 Ubuntu 系统的云服务器。

安装 snapd

sudo apt install snapd

安装 certbot

sudo snap install --classic certbot

设置可在全局执行 certbot 命令

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

用 Certbot 申请 Let’s Encrypt 颂发的 SSL 证书

首先要确定已经配置好了域名的 DNS 记录,指向我们的云服务器,并在云服务器上安装配置好了 NGINX 服务器。

用 certbot ** 申请 SSL 证书

sudo certbot --nginx

上面这个命令会申请签发 SSL 证书,并且会自动下载安装好申请的 SSL 证书,也就是它会修改我们网站的 NGINX 配置文件,在里面添加使用 SSL 证书需要的配置。

选择要申请 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"
 - ...

观察网站的 NGINX 配置文件

观察一下申请了 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 协议访问主机名

在浏览器测试一下,使用 HTTPS 协议访问申请并配置了 SSL 证书的主机名。观察地址栏里的地址左侧,会出现一个小锁着图标,说明当前是通过 HTTPS 协议访问的服务。 点开小锁头图标,然后点击 证书有效,会显示 SSL 证书相关信息。

注意事项

用 Certbot 申请的 Let’s Encrypt 证书,有效期是 3 个月,也就是 3 个月以后你需要重新执行 certbot 命令为指定的域名申请新的 SSL 证书。

训练营路线
选择训练路线
这是您成为应用开发者唯一需要做的系统训练,参加宁皓网独立开发者训练营,给自己一次机会,未来价值百万甚至亿万的应用产品将会出自您手。
预热
理解应用开发,准备开发工具与环境,学习程序语言基础,测试自己是否适合成为开发者。
599
客户端
获得客户端应用开发能力,独立开发 Web 前端应用或 iOS 与安卓应用。
2,999
服务端
获得服务端应用开发能力,独立开发基于 Node.js 技术的服务端应用。
2,999
全栈
获得多平台应用开发能力,独立开发完整应用,包括前端、移动端与服务端。
3,699
3,999