如何为本地主机获取SSL HTTPS
本文将带你了解为本地服务器配置SSL证书的过程。为生产服务器构建Web应用需要在部署前进行本地测试。也可以在本地环境中运行Web应用,并让它通过互联网访问。
简介
同样重要的是,我们要获得一个SSL证书,以使用户信任该网站,并消除地址栏中的*"不安全 "*信息。
前提条件
要跟上这篇文章--具备以下条件将很有帮助。
- 安装了[Node.js]。
- 安装了[Postman]。
- 操作系统可以是安装了[Cygwin]的Windows,也可以是基于Linux的操作系统。
- 对[Linux bash]命令、[Node.js]和[Express]的工作知识。
- 安装有工作的[Firefox]网络浏览器。
- 一个文本编辑器 -[VS Code]。
遵循的步骤
- 创建一个证书。
- 为localhost签署一个SSL证书。
- 使用Node.js开发一个服务器,该服务器使用localhost的SSL证书进行服务。
- 配置Firefox网页浏览器和Postman API客户端,允许我们签署的CA的证书。
- 从浏览器或API客户端用HTTPS安全地访问localhost。
第1步:生成一个CA证书
SSL证书通常由第三方公司签署,称为证书颁发机构(CA)。他们是互联网上值得信赖的发行人,在颁发任何证书之前,他们会对网站是否做了它应该做的事情进行尽职调查。
然而,没有CA为localhost签发证书,只是因为没有人拥有localhost。在我们的案例中,我们将像CA那样签署证书。
第一步是使用下面的命令生成一个根CA证书。
$ mkdir cert
$ cd cert
$ mkdir CA
$ cd CA
$ openssl genrsa -out CA.key -des3 2048
上述命令将生成一个私钥,并要求为该密钥提供一个简单的口令。用户将输入口令并再次输入口令进行确认。
接下来,我们将使用生成的密钥生成一个根CA证书,在我们的案例中,该证书的有效期为10年。将要求输入钥匙的口令和证书信息。用户可以输入所需的证书信息或将其作为默认值。
运行下面的命令来实现我们上面讨论的内容。
$ openssl req -x509 -sha256 -new -nodes -days 3650 -key CA.key -out CA.pem
目前,在我们的cert/CA folder ,我们有两个文件,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 将显示在控制台。
第4步:在浏览器和API客户端进行测试
现在,我们的服务器正在提供我们的SSL,我们可以在Firefox浏览器中尝试我们的https://localhost:3000,如下图所示。
我们已经接近,但还没有完成。即使在用SSL服务于我们的localhost并检查了签署的证书后,Firefox也不会信任签署该证书的CA,这是正确的;我们不能作为一个CA被信任。
为了处理这个问题,我们首先用Postman测试我们的链接,如下图。
从上面可以看出,SSL证书不能被验证。
第5步:将CA证书导入到浏览器中
为了让浏览器信任我们创建的CA证书,需要导入该证书。在火狐浏览器中,打开选项,并导航到隐私和安全,点击查看证书,如下图所示。
然后点击导入,选择CA.pem ,勾选信任刚刚导入的CA,然后点击OK。
接下来,我们将在Firefox中进行测试,如下图所示。
浏览器现在是OK的,他们信任我们的CA和证书。
第6步:配置和测试API客户端
配置API客户端的过程与浏览器相同,不同的是必须禁用证书验证。在Postman设置中,确保SSL证书验证被关闭。
然后我们在Postman中重新发送请求,结果将是。
我们已经能够得到一个200 OK的消息,在这个阶段是不错的。然而,问题是我们仍然有红色的安全警告,因为我们的SSL证书是关闭的。
为了解决这个问题,我们可以将我们的CA添加到Postman中。在Postman设置中,确保CA证书是打开的,并选择CA.pem 文件。
然后重新运行请求,如下图所示;这一次,我们将得到一个安全的200 OK消息。

总结
在本指南中,我们已经看到可以用SSL来提供本地主机。通过本指南,我们已经能够设置CA并使用它来签署SSL证书。我们改变了浏览器的设置以及API客户端的设置,使它们接受了证书。
请注意,不经意地将证书添加到证书列表中是不可取的。各地的恶意用户会冒充CA,欺骗用户接受他们的网站是真实的,导致严重的安全漏洞。
这个过程可以帮助开发者将他们的网站托管在本地服务器或转发的端口上,向他们的访问者保证网站是安全的。