我需要从服务器的 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)
我看到证书有一个“原始”缓冲区,但使用它作为公钥失败。
内置模块
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-----
我看到证书有一个“原始”缓冲区,但将其用作 公钥失败。
请注意,原始缓冲区是 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, ...
})
});