Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 从nodejs中的证书获取公钥_Node.js_Ssl - Fatal编程技术网

Node.js 从nodejs中的证书获取公钥

Node.js 从nodejs中的证书获取公钥,node.js,ssl,Node.js,Ssl,我需要从服务器的SSL证书获取服务器的公钥。我获取的证书如下: https.request(options, res => { const cert = res.connection.getPeerCertificate(); const publicKey = cert.????() } 但是,我找不到从证书中获取公钥的方法。有没有可以这样做的图书馆 我希望使用公钥加密一些数据: const encryptedBuffer = crypto.publicEncrypt({

我需要从服务器的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)
我看到证书有一个“原始”缓冲区,但将其用作公钥失败

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

请注意,原始缓冲区是DER编码的,from需要PEM编码的密钥。所以,您只需要进行转换。我在下面的示例中使用过,但是还有其他库也将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, ...
    })
});
如果证书的格式如上所述,则可以使用
crypto
模块完成。不依赖于其他包

crypto.createPublicKey(cert).export({type:'spki',format:'pem})
输出格式:
-----开始公钥-----
..........................
-----结束公钥-----

crypto.createPublicKey(cert).export({类型:'pkcs1',格式:'pem'))
输出格式:
-----开始RSA公钥-----
..............................
-----结束RSA公钥-----

这是一个比公认的答案更好的答案(可能是因为modern Node.JS对此的支持,而不是最初公认的版本中的缺陷)。
-----BEGIN CERTIFICATE-----
MIID3DCCAsSgAwIBAgIUOaZ5jqRgBz4HjwilIbDz5+Polh0wDQYJKoZIhvcNAQEL
BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
.....
C1c3RqArBaz/c4SqHhyKaHRFinDs5kjnAz+H4+QvQAH0UXgHG050YEZjeZPXMRJB
4I0fzGC++82WXhcwSPaX+BJZuv2bEIfxbyxdVanGmIJdYsGFwSc9sIf2j1cK22A5
vdboEXXkQnqF552iNy9HGRubNQ1VkqITELToRcqcvAo=
-----END CERTIFICATE-----