从nodejs中的证书获取公钥

问题描述 投票:0回答:2

我需要从服务器的 SSL 证书获取服务器的公钥。我获得的证书如下:

https.request(options, res => {
  const cert = res.connection.getPeerCertificate();
  const publicKey = cert.????()
}

但我找不到从证书中获取公钥的方法。有没有库可以做到这一点?

我希望使用公钥来加密一些数据:

const encryptedBuffer =  crypto.publicEncrypt({
  key: publicKey,
  padding: crypto.constants.RSA_PKCS1_PADDING
}, utf8Payload)

我看到证书有一个“原始”缓冲区,但使用它作为公钥失败。

node.js ssl
2个回答
10
投票

内置模块

crypto

crypto.createPublicKey(cert).export({type:'spki', format:'pem'})

output format:
-----BEGIN PUBLIC KEY-----
..........................
-----END PUBLIC KEY-----

crypto.createPublicKey(cert).export({type:'pkcs1', format:'pem'})

output format:
-----BEGIN RSA PUBLIC KEY-----
..............................
-----END RSA PUBLIC KEY-----

查看更多文档


0
投票

我看到证书有一个“原始”缓冲区,但将其用作 公钥失败。

请注意,原始缓冲区是 DER 编码的,并且来自 crypto.publicEncrypt 需要 PEM 编码密钥。因此,您只需要进行转换即可。我在下面的示例中使用了 node-openssl-wrapper,但是还有其他库也可以将 DER 转换为 PEM,

const ossl = require('openssl-wrapper')
const https = require("https");

https.request(options, res => {
    const certificate = res.connection.getPeerCertificate();
    const rawDer = certificate.raw;

    ossl.exec('x509', rawDer, { inform: 'der', outform: 'pem' }, (err, buffer) => {
        const publicKey = buffer.toString('utf8'); // PEM encoded public key safe to use now
        // crypto.publicEncrypt({ key: publicKey, ...
    })
});
© www.soinside.com 2019 - 2024. All rights reserved.