用户要在开发环境中使用自签名证书快速搭建HTTPS测试服务器。这里以Node.js为例,使用Express框架,并生成自签名SSL证书。
步骤:
生成自签名证书
创建Node.js Express应用
配置HTTPS服务器
信任自签名证书(可选,避免浏览器警告)
注意:自签名证书仅供测试使用,浏览器会提示不安全,需要手动信任。
一、生成自签名证书
使用OpenSSL生成自签名证书:
创建证书目录并生成证书:
bash
mkdir -p ssl
cd ssl
openssl req -nodes -new -x509 -keyout server.key -out server.crt -subj "/C=US/ST=State/L=City/O=Organization/OU=Unit/CN=localhost"
解释:
req:证书请求
-nodes:不加密私钥
-new:生成新的证书请求
-x509:生成自签名证书
-keyout:私钥输出文件
-out:证书输出文件
-subj:证书主题,这里CN设置为localhost,因为我们在本地测试
二、创建Node.js Express应用
初始化项目并安装express:
bash
npm init -y
npm install express
创建app.js文件,编写一个简单的Express应用,并同时创建HTTP和HTTPS服务器。
示例代码:
javascript
const express = require('express');
const https = require('https');
const http = require('http');
const fs = require('fs');
const path = require('path');
const app = express();
// 中间件
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
// 静态文件(可选)
app.use(express.static(path.join(__dirname, 'public')));
// 路由
app.get('/', (req, res) => {
res.send('Hello HTTPS!');
});
// 读取SSL证书
const sslOptions = {
key: fs.readFileSync(path.join(__dirname, 'ssl', 'server.key')),
cert: fs.readFileSync(path.join(__dirname, 'ssl', 'server.crt'))
};
// 创建HTTPS服务器
const httpsServer = https.createServer(sslOptions, app);
const HTTP_PORT = 8080;
const HTTPS_PORT = 8443;
httpsServer.listen(HTTPS_PORT, () => {
console.log(`HTTPS Server running on port ${HTTPS_PORT}`);
});
// 可选:同时创建HTTP服务器,重定向到HTTPS
const httpApp = express();
httpApp.get('*', (req, res) => {
res.redirect(`https://${req.headers.host}:${HTTPS_PORT}${req.url}`);
});
http.createServer(httpApp).listen(HTTP_PORT, () => {
console.log(`HTTP Server running on port ${HTTP_PORT}, redirecting to HTTPS`);
});
三、信任自签名证书(以Chrome浏览器为例)
由于自签名证书不被浏览器信任,我们需要手动信任它。
将生成的server.crt导入到操作系统的受信任根证书颁发机构。
打开证书管理器(运行certmgr.msc)
将server.crt导入“受信任的根证书颁发机构”
或者,在启动浏览器时忽略证书错误(不推荐,仅测试):
Chrome启动参数:--ignore-certificate-errors
四、测试
启动服务器:node app.js
访问:https://localhost:8443
注意:如果未信任证书,浏览器会显示警告,点击“高级”->“继续前往”即可。
五、使用mkcert工具(更简单的方式,推荐)
另外,我们可以使用mkcert工具来生成受信任的自签名证书。
安装mkcert(以Windows为例):
下载mkcert:https://github.com/FiloSottile/mkcert/releases
或者使用包管理器,如Chocolatey:choco install mkcert
安装本地CA:
bash
mkcert -install
为localhost生成证书:
bash
mkcert localhost 127.0.0.1 ::1
使用生成的SSL证书文件(localhost+2.pem和localhost+2-key.pem)替换上面代码中的证书路径。
这样生成的证书会被系统信任,浏览器不会显示警告。
六、使用OpenSSL生成带有Subject Alternative Name (SAN)的证书
现代浏览器要求证书包含SAN,我们可以使用以下命令生成包含SAN的自签名证书:
创建一个配置文件san.cnf:
text
[req]
default_bits = 2048
prompt = no
default_md = sha256
x509_extensions = v3_req
distinguished_name = dn
[dn]
C = US
ST = State
L = City
O = Organization
OU = Unit
CN = localhost
[v3_req]
subjectAltName = @alt_names
[alt_names]
DNS.1 = localhost
DNS.2 = *.localhost
IP.1 = 127.0.0.1
然后运行:
bash
openssl req -new -x509 -nodes -newkey rsa:2048 -keyout server.key -out server.crt -config san.cnf -days 365
这样生成的证书就包含了SAN,可以避免一些浏览器的兼容性问题。
根据需求选择合适的方法。在开发环境中,使用mkcert是最简单的,因为它会自动信任证书。而使用OpenSSL证书则更灵活,但需要手动信任。
上面就是在开发环境中快速搭建HTTPS测试的步骤。