用户要在开发环境中使用自签名证书快速搭建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测试的步骤。