从 .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',
});
如果之后有任何问题,请在评论中告诉我。
我将 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',
});
如果之后有任何问题,请在评论中告诉我。