代码之家  ›  专栏  ›  技术社区  ›  ashic

从nodejs中的证书获取公钥

  •  3
  • ashic  · 技术社区  · 8 年前

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

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

    2 回复  |  直到 8 年前
        1
  •  4
  •   Time Killer    5 年前
    -----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

        2
  •  0
  •   Daniel Conde Marin    8 年前

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

    请注意,原始缓冲区是DER编码的 crypto.publicEncrypt 需要PEM编码的密钥。所以,您只需要进行转换。我用过 node-openssl-wrapper

    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, ...
        })
    });