从nodejs中的证书获取公钥

时间:2018-02-19 19:23:40

标签: node.js ssl

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

G:\image.png

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

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

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

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

2 个答案:

答案 0 :(得分:2)

-----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

答案 1 :(得分:0)

  

我看到证书有一个“原始”缓冲区,但使用它作为   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, ...
    })
});