本地调试 Service Worker 之生成 HTTPS 证书

664 阅读3分钟

本文将介绍为本地服务器提供 SSL 证书的过程。在部署生产服务器的 Web 应用程序之前需要进行本地测试。也可以在本地环境中运行 Web 应用程序,并通过互联网访问它。

介绍

同样重要的是,为此获得 SSL 证书,以使用户信任该站点,并消除地址栏上的“不安全”消息。

先决条件

为了跟随本文操作,最好具备以下条件:

已安装 Node.js。
已安装 Postman。
操作系统可以是安装有 Cygwin 的 Windows 或基于 Linux 的操作系统。
熟悉 Linux Bash 命令、Node.js 和 Express。
已安装 Chrome 网络浏览器。
文字编辑器 - VS Code。

操作步骤

  1. 创建证书。
  2. 为本地主机签署 SSL 证书。
  3. 使用 Node.js 开发服务器,该服务器使用本地主机 SSL 证书进行服务。
  4. 配置 Chrome 网络浏览器和 Postman API 客户端,以允许我们签署的证书作为 CA。
  5. 从浏览器或 API 客户端安全地访问本地主机。

步骤 1:生成 CA 证书

SSL 证书通常由第三方公司签署,称为证书颁发机构(CA)。它们是互联网的可信发行者,在发出任何证书之前会对站点进行尽职调查,以确保站点符合要求。

但是,没有任何 CA 为本地主机签发证书,因为没有人拥有本地主机。在我们的情况下,我们将像 CA 一样签署证书。

第一步将是使用以下命令生成根 CA 证书:

$ mkdir cert  
$ cd cert  
$ mkdir CA  
$ cd CA  
$ openssl genrsa -out CA.key -des3 2048  

上述命令将生成一个私钥,并要求输入密钥的简单密码。用户将输入密码,并再次确认。

接下来,我们将使用生成的密钥生成根 CA 证书,在我们的情况下有效期为十年。将要求密钥和证书信息的密码。用户可以输入所需的证书信息或将其保留为默认值。

运行以下命令以实现我们上面讨论的内容:

$ openssl req -x509 -sha256 -new -nodes -days 3650 -key CA.key -out CA.pem  

现在,在 cert/CA 文件夹中,我们有两个文件,CA.key 和 CA.pem。

步骤 2:生成证书

现在已经创建了 CA 密钥和 CA 证书。我们可以使用已经创建的 CA 签署 SSL 证书。

接下来,在 cert/CA 目录中创建一个新目录 localhost。在 localhost 中创建一个新文件 localhost.ext。

$ mkdir localhost  
$ cd localhost  
$ touch localhost.ext  

需要写入签名 SSL 证书的信息将包含在此 localhost.ext 文件中。

该文件将显示如下:

authorityKeyIdentifier = keyid,issuer  
basicConstraints = CA:FALSE  
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment  
subjectAltName = @alt_names

[alt_names]  
DNS.1 = localhost  
IP.1 = 127.0.0.1  

请注意,该证书将适用于 localhost 和 127.0.0.1。您可以决定将更多域名或 IP 地址添加到文件中,但请确保编辑 /etc/hosts 文件,使这些域名指向本地计算机(127.0.0.1)。

接下来,将生成一个密钥,并使用该密钥生成 CSR(证书签名请求)。

$ openssl genrsa -out localhost.key -des3 2048  

该命令将生成 localhost 私钥,并要求密钥的密码,并要求用户再次确认。

接下来,将使用该密钥生成 CSR,并要求上面创建的任何其他详细信息,可以将其保留为默认值或适当输入。

请注意请求的挑战密码;您可以输入任何内容。

使用以下命令生成 CSR:

$ openssl req -new -key localhost.key -out localhost.csr  

现在,有了这个 CSR,我们可以请求 CA 签署证书,如下所示。请注意,CA.key 和 CA.pem 文件的路径取决于用户从何处运行命令。在这种情况下,下面的命令在 /cert/CA/localhost 中运行。

$ openssl x509 -req -in localhost.csr -CA ../CA.pem -CAkey ../CA.key -CAcreateserial -days 3650 -sha256 -extfile localhost.ext -out localhost.crt  

该命令获取 CSR(localhost.csr)、CA 证书(CA.pem 和 CA.key)和证书扩展文件(localhost.ext)。这些输入将生成一个有效期为十年的 localhost.crt 证书文件。

服务器将需要 localhost.crt 证书文件和解密的密钥,因为我们的 localhost.key 是以加密形式存在的。

我们需要解密 localhost.key 并将该文件存储如下:

$ openssl rsa -in localhost.key -out localhost.decrypted.key  

步骤 3:创建 Node.js Express 服务器

为了测试上面的代码片段是否按预期工作,我们必须创建一个 Node.js Express 服务器,输出成功消息。

回到我们的 cert 目录,我们将使用以下命令初始化一个 Node.js 项目,并添加 express 和 HTTPS 包:

$ npm init -y  
$ npm i express https  
$ touch index.js  

然后将 index.js 文件编辑如下:

const fs = require('fs');  
const key = fs.readFileSync('./CA/localhost/localhost.decrypted.key');  
const cert = fs.readFileSync('./CA/localhost/localhost.crt');

const express = require('express');  
const app = express();

app.get('/', (req, res, next) => {  
res.status(200).send('Hello world!');  
});

const https = require('https');  
const server = https.createServer({ key, cert }, app);

const port = 3000;  
server.listen(port, () => {  
console.log(`Server is listening on https://localhost:${port}`);  
});  

使用以下命令运行服务器:

$ node index.js  

控制台上将显示一个成功消息:“Server is Listening on https://localhost:3000”。

Importing CA Certificate to the browser

image.png

image.png

image.png

image.png

image.png

至此已经完成整个 https 证书安装过程,service worker 也已经可以用,注意是 localhost 下能用。