代码之家  ›  专栏  ›  技术社区  ›  Alfred Balle

NodeJS和TLS,获取客户端证书

  •  0
  • Alfred Balle  · 技术社区  · 5 年前

    我在测试 Node.JS TLS 并且正在创建一个简单的服务器和客户端。 这似乎很管用:

    server.js:

    const tls = require('tls');
    const fs = require('fs');
    
    const options = {
      key: fs.readFileSync('./server-certs/server.key'),
      cert: fs.readFileSync('./server-certs/server.crt'),
      rejectUnauthorized: false,
      requestCert: true
    };
    
    const server = tls.createServer(options, (socket) => {
      console.log('server connected',
                  socket.authorized ? 'authorized' : 'unauthorized');
    
      console.log(socket.getPeerCertificate(true).raw);
    
      socket.write('welcome!\n');
      socket.setEncoding('utf8');
      socket.pipe(socket);
    });
    server.listen(8000, () => {
      console.log('server bound');
    });
    

    const tls = require('tls');
    const fs = require('fs');
    
    const options = {
      key: fs.readFileSync('./client-certs/client.key'),
      cert: fs.readFileSync('./client-certs/client.crt')
    };
    
    const socket = tls.connect(8000, options, () => {
      console.log('client connected',
                  socket.authorized ? 'authorized' : 'unauthorized');
      process.stdin.pipe(socket);
      process.stdin.resume();
    });
    socket.setEncoding('utf8');
    socket.on('data', (data) => {
      console.log(data);
    });
    socket.on('end', () => {
      console.log('server ends connection');
    });
    

    server.js 我打印出客户证书:

    console.log(socket.getPeerCertificate(true).raw);
    

    但是做 cat client.crt

    -----BEGIN CERTIFICATE-----
    MIICsDCCAZgCCQC8miOEYnXCXDANBgkqhkiG9w0BAQsFADAaMQswCQYDVQQGEwJV
    ...
    MHBcIlA2R3ssgfhlcSJcaR59LKA=
    -----END CERTIFICATE-----
    

    有可能吗 server.js 要从客户端证书获取该字符串?

    1 回复  |  直到 5 年前
        1
  •  2
  •   Steffen Ullrich    5 年前
    console.log(socket.getPeerCertificate(true).raw);
    

    client.crt 是PEM格式的证书-基本上是二进制DER格式的base64,添加了一些页眉和页脚行。您可以使用以下命令将PEM转换为DER openssl x509 -in client.crt -outform der . 或者,您可以按照中的建议,在nodejs中将DER格式的证书转换为PEM NodeJS: Validate certificate in DER format .