本文将介绍为本地服务器提供 SSL 证书的过程。在部署生产服务器的 Web 应用程序之前需要进行本地测试。也可以在本地环境中运行 Web 应用程序,并通过互联网访问它。
介绍
同样重要的是,为此获得 SSL 证书,以使用户信任该站点,并消除地址栏上的“不安全”消息。
先决条件
为了跟随本文操作,最好具备以下条件:
已安装 Node.js。
已安装 Postman。
操作系统可以是安装有 Cygwin 的 Windows 或基于 Linux 的操作系统。
熟悉 Linux Bash 命令、Node.js 和 Express。
已安装 Chrome 网络浏览器。
文字编辑器 - VS Code。
操作步骤
- 创建证书。
- 为本地主机签署 SSL 证书。
- 使用 Node.js 开发服务器,该服务器使用本地主机 SSL 证书进行服务。
- 配置 Chrome 网络浏览器和 Postman API 客户端,以允许我们签署的证书作为 CA。
- 从浏览器或 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
至此已经完成整个 https 证书安装过程,service worker 也已经可以用,注意是 localhost 下能用。