Nodejs 双向认证 客户端证书获取

Nodejs 双向认证 客户端证书获取

nodejs https 双向认证的时候,怎么获取客户端证书?

3 回复

Node.js 双向认证 客户端证书获取

双向认证(也称为双向TLS或mTLS)是一种安全协议,其中客户端和服务器都必须通过验证对方的身份来建立连接。在Node.js中实现双向认证时,通常需要从客户端获取证书,并对其进行验证。

示例代码

以下是一个简单的示例,展示如何在Node.js服务器上配置双向认证并获取客户端证书:

const fs = require('fs');
const https = require('https');

// 加载服务器证书、密钥以及客户端CA证书
const serverOptions = {
  key: fs.readFileSync('./server-key.pem'),
  cert: fs.readFileSync('./server-cert.pem'),
  ca: [fs.readFileSync('./client-ca.pem')]
};

const server = https.createServer(serverOptions, (req, res) => {
  // 获取客户端证书
  const clientCert = req.socket.getPeerCertificate();

  if (!clientCert) {
    res.writeHead(401, { 'Content-Type': 'text/plain' });
    res.end('Client certificate is required.');
    return;
  }

  // 输出客户端证书信息
  console.log('Client Certificate:', clientCert);

  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end(`Hello, your client certificate is verified.`);
});

server.listen(8443, () => {
  console.log('Server listening on port 8443');
});

解释

  1. 加载证书和密钥

    • keycert 是服务器的私钥和证书。
    • ca 是客户端证书的CA(证书颁发机构)文件,用于验证客户端证书的有效性。
  2. 创建服务器

    • 使用 https.createServer 创建一个HTTPS服务器,并传入服务器选项。
  3. 处理请求

    • 在请求处理函数中,可以通过 req.socket.getPeerCertificate() 方法获取客户端证书。
    • 如果客户端没有提供有效的证书,服务器返回401状态码并结束响应。
    • 如果客户端提供了证书,服务器可以进一步验证证书的有效性,并进行相应的业务逻辑处理。
  4. 监听端口

    • 最后,服务器监听指定端口(例如8443)。

通过上述步骤,您可以实现Node.js服务器上的双向认证,并成功获取和验证客户端证书。


无人问津…,对着all.html 找了好久才发现有request.connection.getcer…

在 Node.js 中实现 HTTPS 双向认证时,可以通过设置服务器选项来获取客户端证书。双向认证(也称为客户端认证)需要客户端和服务器互相验证对方的身份。下面是一个简单的示例,展示如何在 Node.js 服务器中获取客户端证书。

示例代码

首先,确保你有一个服务器证书(server.crt)、一个私钥(server.key),以及客户端证书(client.crt)和私钥(client.key)。你可以使用 OpenSSL 工具生成这些文件。

1. 创建服务器代码

const https = require('https');
const fs = require('fs');

const options = {
  key: fs.readFileSync('path/to/server.key'),
  cert: fs.readFileSync('path/to/server.crt'),
  ca: [fs.readFileSync('path/to/client.crt')], // 可以是单个或多个客户端证书
  requestCert: true, // 启用客户端证书请求
  rejectUnauthorized: false // 这里可以配置是否拒绝未授权的客户端
};

const server = https.createServer(options, (req, res) => {
  if (req.client.authorized) { // 检查客户端是否被授权
    res.writeHead(200);
    res.end(`Client certificate: ${JSON.stringify(req.client.getPeerCertificate())}`);
  } else {
    res.writeHead(401, { 'Content-Type': 'text/plain' });
    res.end('Unauthorized');
  }
});

server.listen(8000, () => {
  console.log('Server is running on port 8000');
});

2. 创建客户端代码

客户端也需要提供证书和私钥,并发起请求到服务器:

const https = require('https');

const clientOptions = {
  hostname: 'localhost',
  port: 8000,
  path: '/',
  method: 'GET',
  key: fs.readFileSync('path/to/client.key'),
  cert: fs.readFileSync('path/to/client.crt')
};

const req = https.request(clientOptions, (res) => {
  let data = '';

  res.on('data', (chunk) => {
    data += chunk;
  });

  res.on('end', () => {
    console.log(data); // 输出客户端证书信息
  });
});

req.on('error', (e) => {
  console.error(`Problem with request: ${e.message}`);
});

req.end();

解释

  • requestCert 设置为 true 表示服务器将请求客户端证书。
  • rejectUnauthorized 设置为 false 表示即使客户端证书未通过验证,也会继续处理请求。实际部署时应谨慎使用此选项。
  • req.client.getPeerCertificate() 方法返回客户端证书信息。
  • 客户端也需要提供自己的证书和私钥才能成功连接到服务器。

通过上述代码,你可以看到如何在 Node.js 中启用并处理 HTTPS 双向认证。

回到顶部