【问题标题】:Get public key from certificate in nodejs从nodejs中的证书获取公钥
【发布时间】:2018-02-19 19:23:39
【问题描述】:

我需要从其 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)

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

【问题讨论】:

    标签: node.js ssl


    【解决方案1】:
    -----BEGIN CERTIFICATE-----
    MIID3DCCAsSgAwIBAgIUOaZ5jqRgBz4HjwilIbDz5+Polh0wDQYJKoZIhvcNAQEL
    BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
    .....
    C1c3RqArBaz/c4SqHhyKaHRFinDs5kjnAz+H4+QvQAH0UXgHG050YEZjeZPXMRJB
    4I0fzGC++82WXhcwSPaX+BJZuv2bEIfxbyxdVanGmIJdYsGFwSc9sIf2j1cK22A5
    vdboEXXkQnqF552iNy9HGRubNQ1VkqITELToRcqcvAo=
    -----END CERTIFICATE-----
    

    如果证书的格式如上,可以用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-----
    

    see more on the document

    【讨论】:

    • 这是一个比公认的更好的答案(可能是因为现代 Node.JS 对此的支持,而不是原来接受的缺陷)。
    • 赞成,因为这个答案比接受的答案更好
    【解决方案2】:

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

    请注意,原始缓冲区是 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, ...
        })
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-14
      • 2012-12-22
      相关资源
      最近更新 更多