Node.js 搭建 HTTPS 服务器完整流程

作者:终端旅客

时间:2026-10-26

浏览:117

本文详细演示了在 Node.js 环境下搭建 HTTPS 服务器的完整步骤。内容涵盖使用 OpenSSL 生成 CA 机构、服务器及客户端证书,解决常见配置报错,并提供服务端监听与客户端请求的完整 JavaScript 代码示例,最后通过浏览器验证连接。

文章目录

本文主要介绍如何在 Node.js 环境中构建 HTTPS 服务器,涉及的具体技术细节和基础概念建议读者另行查阅相关资料。

项目目录结构与文件准备

首先,建立相应的文件目录结构。在 index.html 文件中引入外部的 script.js 脚本,而 server.js 则作为服务器端的核心运行文件。

项目目录结构与文件准备

创建 CA 机构与生成证书

接下来,需要创建本地的 CA(证书颁发机构)以确保证书的合法性。

在项目的根目录下打开命令行终端,按顺序执行以下命令来生成 CA 相关的密钥和证书文件。

//为CA生成私钥
 openssl genrsa -out ca-key.pem -des 1024
//通过CA私钥生成CSR
 openssl req -new -key ca-key.pem -out ca-csr.pem
//通过CSR文件和私钥生成CA证书
 openssl x509 -req -in ca-csr.pem -signkey ca-key.pem -out ca-cert.pem

执行过程中会提示输入密码(enter pass phrase for ca-key.pem),请务必设置并牢记该密码,因为在后续生成服务器和客户端证书时需要多次验证。例如,此处设置的密码为 sun13083691283。

项目目录结构与文件准备

其余配置项若无需修改,可直接按 Enter 键跳过,使用默认值即可。

 项目目录结构与文件准备

随后进入服务器端证书的创建阶段。

//(1)为服务器生成私钥
 openssl genrsa -out server-key.pem 1024
//(2)利用服务器私钥文件服务器生成CSR
 openssl req -new -key server-key.pem -config openssl.cnf -out server-csr.pem

此步骤可能会遇到报错,提示无法从 /user/local/ssl/openssl.cnf 加载配置信息,或出现类似的 openssl.cnf 相关错误。

为解决该问题,需在根目录下新建一个名为 openssl.cnf 的配置文件,并将指定的配置代码复制粘贴至该文件中。

[req]  
    distinguished_name = req_distinguished_name  
    req_extensions = v3_req  
    [req_distinguished_name]  
    countryName = Country Name (2 letter code)  
    countryName_default = CN  
    stateOrProvinceName = State or Province Name (full name)  
    stateOrProvinceName_default = BeiJing  
    localityName = Locality Name (eg, city)  
    localityName_default = YaYunCun  
    organizationalUnitName  = Organizational Unit Name (eg, section)  
    organizationalUnitName_default  = Domain Control Validated  
    commonName = Internet Widgits Ltd  
    commonName_max  = 64  
    [ v3_req ]  
    # Extensions to add to a certificate request  
    basicConstraints = CA:FALSE  
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment  
    subjectAltName = @alt_names  
    [alt_names]  
	#注意这个IP.1的设置,IP地址需要和你的服务器的监听地址一样
    IP.1 = 127.0.0.1
//(3)通过服务器私钥文件和CSR文件生成服务器证书
 openssl x509 -req -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -in server-csr.pem -out server-cert.pem -extensions v3_req -extfile openssl.cnf

完成上述配置后,继续执行命令以生成客户端所需的证书文件。

//(1)生成客户端私钥
 openssl genrsa -out client-key.pem
//(2)利用私钥生成CSR
 openssl req -new -key client-key.pem -out client-csr.pem
//(3)生成客户端证书
 openssl x509 -req -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -in client-csr.pem -out client-cert.pem

此步骤旨在生成客户端私钥、CSR 请求文件以及最终的客户端证书,确保客户端能向服务器发起安全连接。

//(1)打包服务器端证书
 openssl pkcs12 -export -in server-cert.pem -inkey server-key.pem -certfile ca-cert.pem -out server.pfx
//(2)打包客户端证书
 openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -certfile ca-cert.pem -out client.pfx

证书生成完毕后,在文件夹中可以看到生成的各类证书文件,将它们统一移动或复制到 keys 目录中进行管理。

项目目录结构与文件准备

Node.js 服务端与客户端代码实现

接下来编写 Node.js 服务端代码,实现 HTTPS 服务的监听与响应。

在代码配置选项中,passphrase 字段必须填写之前生成 CA 证书时设置的密码,即 sun13083691283,否则服务器无法正确加载私钥。

var https = require('https');
var fs = require('fs');
var options = {
	pfx:fs.readFileSync('./keys/server.pfx','utf-8'),
	passphrase:'your password'
};
https.createServer(options,function(req,res){
	res.writeHead(200);
	res.end('hello world\n');
}).listen(3000,'127.0.0.1');

随后编写客户端测试代码,用于向搭建好的 HTTPS 服务器发送请求。

同样地,客户端代码中的 options 对象里,passphrase 也必须与之前设置的密码保持一致,即 sun13083691283,以确保证书解密成功。

var https = require('https');
var fs = require('fs');
var options = {
	hostname:'127.0.0.1',
	port:3000,
	path:'/',
	method:'GET',
	pfx:fs.readFileSync('./keys/server.pfx','utf-8'),
	passphrase:'your password',
	agent:false
};
options.agent = new https.Agent(options);
var req = https.request(options,function(res){
console.log("statusCode: ", res.statusCode);
  console.log("headers: ", res.headers);
	res.setEncoding('utf-8');
	res.on('data',function(d){
		console.log(d);
	})
});
req.end();
req.on('error',function(e){
	console.log(e);
})

浏览器验证与注意事项

完成代码编写后,启动服务器,并在浏览器中访问对应地址以验证 HTTPS 连接是否成功建立。

项目目录结构与文件准备

参考资源:https://cnodejs.org/topic/54745ac22804a0997d38b32d

补充说明:在测试过程中,由于 Node.js 相关模块版本差异,调用 fs.readFileSync 函数时可能需要显式指定编码类型。若不指定,该函数可能返回 Buffer 对象,导致后续运行时报错。此类问题在各类网络教程中较为常见,需注意处理。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章