本文概述
如果你正在Node.js中使用Web服务器, 则可能已经想创建一个安全连接, 以提供确实的安全连接, 或者允许仅在协议为HTTPS和以下情况时才可访问的浏览器中的API。不是HTTP, 例如getUserMedia或webkitSpeechRecognition等。
使用Node.js的http服务器模块或类似Express的框架(在这种情况下, 我们将使用的框架)创建具有安全协议的Web服务器的任务非常简单:
// server.js
var fs = require('fs');
var http = require('http');
var https = require('https');
var privateKey = fs.readFileSync('certificates/key.pem', 'utf8');
var certificate = fs.readFileSync('certificates/cert.pem', 'utf8');
var credentials = {key: privateKey, cert: certificate};
var express = require('express');
var app = express();
// your express configuration here
var httpServer = http.createServer(app);
var httpsServer = https.createServer(credentials, app);
// For http
httpServer.listen(8080);
// For https
httpsServer.listen(8443);
app.get('/', function (req, res) {
res.header('Content-type', 'text/html');
return res.end('<h1>Hello, Secure World!</h1>');
});
注意:尽管443是HTTPS的默认端口, 但是在开发过程中使用类似8443的名称, 因为大多数系统不允许在低编号的端口上运行非root侦听器。
如你所见, 我们只需要使用有效的pem证书为key和cert属性提供有效路径。但是, 我们大多数人都不知道这些文件是什么(至少, 我不知道…也许你知道…如果可以, 那么你在这里做什么?)。
PEM文件或”隐私增强型邮件”是Base64编码的证书。这种证书经常用于Web服务器, 因为可以使用任何文本编辑器将其轻松转换为可读数据。该文件包含非常不同的页眉和页脚。这是一种容器格式, 可以仅包含公共证书(例如, 与Apache安装一起使用, 以及CA证书文件/ etc / ssl / certs), 也可以包括完整的证书链, 其中包括公共密钥, 私钥和根证书。
在开发阶段, 你可能不想支付受信任的证书, 因此, 仅在本文中, 我们将创建用于开发和测试目的的自签名证书。
要求
你将需要openssl实用程序, 并且我们将通过终端和命令访问它, 在这种情况下, 我们使用SourceForge的GnuWin32, openssl的可执行文件将位于C:\ Program Files \ GnuWin32 \ bin \ openssl.exe中。 , 因此我们只需要在新的命令提示符下导航到bin文件夹, 就可以执行以下命令:
cd C:\Program Files\GnuWin32\bin
REM then after execute the previous command, you will use openssl here
REM For example: openssl req -newkey .....................
如果你使用其他平台, 请参考有关如何在Google的其他操作系统中使用openssl的更多信息。
要创建SSL证书, 你首先需要生成一个私钥(key.pem)和一个证书签名请求(cert.pem)或CSR(还包含你的公钥)。你可以通过不同的方式执行此操作, 但是如前所述, 我们将使用易于使用的OpenSSL。
实现
执行以下命令并更改keyout和out参数的路径(如果需要), 以更改应在其中创建密钥的路径:
openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout c:/key.pem -out c:/cert.pem
使用GnuWin32时, 如果执行上一条命令, 可能会发现以下错误:
无法从/usr/local/ssl/openssl.cnf加载配置信息
为了解决这个问题, 我们需要使用-config参数和openssl.cnf文件的路径来提供所提到文件的路径。该文件的路径可能会有所不同(默认安装应为C:\ Program Files \ GnuWin32 \ share \ openssl.cnf), 因此请在安装GnuWin32的文件夹中搜索该文件, 并在获得绝对路径后提供路径作为参数使用:
openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout c:/key.pem -out c:/cert.pem -config C:\Program Files\GnuWin32\share\openssl.cnf
如果你没有任何错误, 现在将启动交互式提示, 并要求你提供有关证书的基本信息。填写完所有信息后, 你应该获得2个文件key.pem和cert.pem, 在这种情况下, 我们的命令将位于c:\中。
复制这些文件的路径(或将文件复制到项目的已知目录中), 并按照本文开头的脚本(或你自己的脚本)中所示的方式提供它们。使用我们的脚本执行node server.js可以使你在浏览器中导航到https:// localhost:8443, 并且(如预期的那样, 因为我们的证书不被信任, 因为它是自签名的), 你应该看到以下警告(在这种情况下, 对于Chrome):
单击高级, 然后单击继续到本地主机(不安全), 然后就可以了!
你的带有Express(或http模块)的https服务器已正确实施。
创建受信任的证书(可选)
执行以下命令并更改keyout和out参数的路径(如果需要), 以更改应在其中创建密钥的路径:
openssl req -newkey rsa:2048 -new -nodes -keyout c:/key.pem -out c:/csr.pem
如果再次出现”无法加载错误..”, 请参考先前区域中的实现。如果你没有任何错误, 那么交互式提示应该会启动, 并会询问有关证书的基本信息。填写完所有信息后, 你将获得2个文件key.pem和csr.pem, 在这种情况下, 使用我们的命令将位于c:\。如果要购买SSL证书, 应将csr.pem文件提交给任何有效的证书颁发机构, 例如Comodo, Symantec, GoDaddy或其他颁发数字证书的实体。完成所有过程后, 你应该会收到有效的证书。将该证书与Node.js服务器一起使用。
编码愉快!
评论前必须登录!
注册