从 .env 文件访问 .pem public 密钥

Access a .pem public key from .env file

我将 public 键作为字符串存储在环境变量中。此 public 密钥来自 .pem 文件。当我尝试在我的代码中使用它时,出现以下错误

error:0909006C:PEM routines:get_name:no start line

我尝试了其他用户的建议,将其转换为 base64,然后使用密钥,但我仍然遇到同样的错误。

public 键的环境变量

PUB_KEY='-----BEGIN PUBLIC KEY-----randomgibberish-----END PUBLIC KEY-----'

将其转换为 base64 的代码

const pubKey = process.env.PUB_KEY
const buff = Buffer.from(pubKey).toString('base64');
console.log(buff)

这里在createPublicKey方法中使用

crypto.createPublicKey({
                key: buff,
                format: 'pem',
            });

知道可能出了什么问题吗? TIA

您的密钥似乎是 X.509/SPKI 格式的 PEM 编码 public 密钥。但是,缺少换行符。这些将被设置,以便页眉和页脚都在 单行 行上。正文中每 64 个字符后有一个换行符。

createPublicKey() 可以直接 处理格式正确的 PEM 密钥。即使正文中的换行符丢失也会接受密钥,但页眉和页脚 必须 在不同的行中,否则将显示发布的错误消息:错误:0909006C:PEM routines:get_name:no 起始行.

示例:

var crypto = require('crypto')

var x509 = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAunF5aDa6HCfLMMI/MZLT
5hDk304CU+ypFMFiBjowQdUMQKYHZ+fklB7GpLxCatxYJ/hZ7rjfHH3Klq20/Y1E
bYDRopyTSfkrTzPzwsX4Ur/l25CtdQldhHCTMgwf/Ev/buBNobfzdZE+Dhdv5lQw
KtjI43lDKvAi5kEet2TFwfJcJrBiRJeEcLfVgWTXGRQn7gngWKykUu5rS83eAU1x
H9FLojQfyia89/EykiOO7/3UWwd+MATZ9HLjSx2/Lf3g2jr81eifEmYDlri/OZp4
OhZu+0Bo1LXloCTe+vmIQ2YCX7EatUOuyQMt2Vwx4uV+d/A3DP6PtMGBKpF8St4i
GwIDAQAB
-----END PUBLIC KEY-----`;

// Import
var importedPubKey = crypto.createPublicKey({
    key: x509,
    format: 'pem' // default, can also be omitted
});

// Export
console.log(importedPubKey.export({type: 'spki', format: 'pem'}))

密钥也可以写成one-liner,换行符作为转义序列(\n),例如对于单行的页眉和页脚:

var x509 = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAunF5aDa6HCfLMMI/MZLT5hDk304CU+ypFMFiBjowQdUMQKYHZ+fklB7GpLxCatxYJ/hZ7rjfHH3Klq20/Y1EbYDRopyTSfkrTzPzwsX4Ur/l25CtdQldhHCTMgwf/Ev/buBNobfzdZE+Dhdv5lQwKtjI43lDKvAi5kEet2TFwfJcJrBiRJeEcLfVgWTXGRQn7gngWKykUu5rS83eAU1xH9FLojQfyia89/EykiOO7/3UWwd+MATZ9HLjSx2/Lf3g2jr81eifEmYDlri/OZp4OhZu+0Bo1LXloCTe+vmIQ2YCX7EatUOuyQMt2Vwx4uV+d/A3DP6PtMGBKpF8St4iGwIDAQAB\n-----END PUBLIC KEY-----"

如果密钥存储在环境变量中(例如 X509ENV)并检索(通过 process.env.X509ENV),只要正确考虑换行符,所有这一切也有效。

您的代码因 public 键中的换行而中断。

不需要使用base64,我建议你在env文件中使用换行符(\n)来存储密钥,就像这样:

如果假设您的密钥是这样的:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlkH/R64I0H1awndlU1w6BseS9
5ygy2v6rwV7BA/xlNGCtWfsQ8UlbJl7fawZ1hgL7H8FcUkGk/RsWB7xRpUeHypnE
8UU2bbhaS+X8Bze2kdoayerb5+YK6kZlyPvmI+WVxksKUEChcKE+t83mqVpnQnO9
TkTXhzvual4cG+WatwIDAQAB
-----END PUBLIC KEY-----

然后保存是不是这样(\n放在行尾,整成一个字符串,你看我是怎么保存的)

export publicKey = '-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlkH/R64I0H1awndlU1w6BseS9\n5ygy2v6rwV7BA/xlNGCtWfsQ8UlbJl7fawZ1hgL7H8FcUkGk/RsWB7xRpUeHypnE\n8UU2bbhaS+X8Bze2kdoayerb5+YK6kZlyPvmI+WVxksKUEChcKE+t83mqVpnQnO9\nTkTXhzvual4cG+WatwIDAQAB\n-----END PUBLIC KEY-----'

并且在代码中使用:

const { publicKey } = process.env
const originalPublicKey = publicKey.replace(/\n/g, '\n')

这将完成工作,它将生成您的原始密钥。

const publicKey = '-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlkH/R64I0H1awndlU1w6BseS9\n5ygy2v6rwV7BA/xlNGCtWfsQ8UlbJl7fawZ1hgL7H8FcUkGk/RsWB7xRpUeHypnE\n8UU2bbhaS+X8Bze2kdoayerb5+YK6kZlyPvmI+WVxksKUEChcKE+t83mqVpnQnO9\nTkTXhzvual4cG+WatwIDAQAB\n-----END PUBLIC KEY-----'

const originalPublicKey = publicKey.replace(/\n/g, '\n')

console.log(originalPublicKey)

那么您可以在代码中简单地使用它。

crypto.createPublicKey({
                key: originalPublicKey,
                format: 'pem',
            });

如果之后有任何问题,请在评论中告诉我。