在 .env 文件中使用私钥
Using private key in a .env file
我在 gatsby .env
文件中有一个多行私钥:
GATSBY_GOOGLE_CLIENT_ID="12345"
GATSBY_GOOGLE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nflkdflkdf...\n-----END PRIVATE KEY-----"
在我的 gatsby-config 文件中我有:
module.exports = {
resolve: 'gatsby-source-google-sheets',
options: {
credentials: {
"type": "service_account",
"private_key": process.env.GATSBY_GOOGLE_PRIVATE_KEY,
"client_id": process.env.GATSBY_GOOGLE_CLIENT_ID
}
}
}
client_id
工作正常,因为它只是一行字符串,但 private_key
不起作用,大概是因为它是多行。
我有办法解决这个问题吗?
谢谢
您可以使用 string.replace 和正则表达式,如下所示再次转义 \n 字符:
"private_key": process.env.GATSBY_GOOGLE_PRIVATE_KEY.replace(/\n/g, '\n'),
放入 pem 文件,然后将其替换为您的 .env
echo "export test_key=\"`sed -E 's/$/\\n/g' ./gitbu.2018-03-23.private-key.pem`\"" >> .env
您必须将环境变量加载到 gatsby 中。最简单的方法是使用 dotenv
:
设置:
yarn add -D dotenv # or npm install -D dotenv
然后在你的 gatsby-config.js
:
require('dotenv').config();
module.exports = {
plugins: [ ... ]
}
如果您的文件名与.env
不同或者您将其存储在不同的位置,您可以传入一个路径选项:
require('dotenv').config({
path: 'path/to/env/file'
});
原来我的 .env 路径不正确。出于某种原因,其他密钥有效,但私钥无效。
正确的设置:
require("dotenv").config({
path: `./.env.${process.env.NODE_ENV}`,
});
const private_key = process.env.GATSBY_GOOGLE_PRIVATE_KEY.replace(/\n/g, '\n');
module.exports = {
resolve: 'gatsby-source-google-sheets',
options: {
credentials: {
"private_key": private_key,
}
}
}
我正在添加一种对我有用的手动方法。
第 1 步:
echo "PRIVATE_KEY=\"`sed -E 's/$/\\n/g' my_rsa_2048_priv.pem`\"" >> .env
.env 文件中的密钥将如下所示:
PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\n
dasdasdadasdasdasdasdasdasdasdadasdasdadasa\n
huehuauhhuauhahuauhauahuauhehuehuauheuhahue\n
-----END RSA PRIVATE KEY-----\n"
第 2 步。在您的代码中打印值 process.env.PRIVATE_KEY
只会显示第一行:-----BEGIN RSA PRIVATE KEY-----\n
。要解决此问题,请将 .env
中的变量编辑为一行。像这样:
PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\ndasdasdadasdasdasdasdasdasdasdadasdasdadasa\nhuehuauhhuauhahuauhauahuauhehuehuauheuhahue\n-----END RSA PRIVATE KEY-----\n"
现在process.env.PRIVATE_KEY
可以正确输出
我有类似的问题,我必须读取 .pem 文件内容。以下方法对我有用。
- 将.pem内容转换为base64格式
- 将转换后的 base64 内容(这将是单行字符串)放入 .env 文件
- 现在将环境变量解码为原始内容
对我有用的解决方案 -- 在 base 64 中编码私钥
第 1 步 - 将密钥转换为 Base 64
// Run this code in a JS file on your Dev Machine.
const privateKey= `-----BEGIN PRIVATE KEY-----\nMIIEvSomeMoreCharacterHererplw==\n-----END PRIVATE KEY-----\n`
const buff = Buffer.from(privateKey).toString('base64');
console.log(buff);
注意:您的项目中不需要commit/include上述代码。这只是为了生成密钥的base64字符串。
步骤 2 - 将控制台日志数据复制到 .env
文件
PRIVATE_KEY = 'akgjhakdgjhasgf'
第 3 步 - 使用代码中的密钥
const key = Buffer.from(process.env.PRIVATE_KEY , 'base64').toString('ascii');
// Use key anywhere in your code.
我在 gatsby .env
文件中有一个多行私钥:
GATSBY_GOOGLE_CLIENT_ID="12345"
GATSBY_GOOGLE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nflkdflkdf...\n-----END PRIVATE KEY-----"
在我的 gatsby-config 文件中我有:
module.exports = {
resolve: 'gatsby-source-google-sheets',
options: {
credentials: {
"type": "service_account",
"private_key": process.env.GATSBY_GOOGLE_PRIVATE_KEY,
"client_id": process.env.GATSBY_GOOGLE_CLIENT_ID
}
}
}
client_id
工作正常,因为它只是一行字符串,但 private_key
不起作用,大概是因为它是多行。
我有办法解决这个问题吗?
谢谢
您可以使用 string.replace 和正则表达式,如下所示再次转义 \n 字符:
"private_key": process.env.GATSBY_GOOGLE_PRIVATE_KEY.replace(/\n/g, '\n'),
放入 pem 文件,然后将其替换为您的 .env
echo "export test_key=\"`sed -E 's/$/\\n/g' ./gitbu.2018-03-23.private-key.pem`\"" >> .env
您必须将环境变量加载到 gatsby 中。最简单的方法是使用 dotenv
:
设置:
yarn add -D dotenv # or npm install -D dotenv
然后在你的 gatsby-config.js
:
require('dotenv').config();
module.exports = {
plugins: [ ... ]
}
如果您的文件名与.env
不同或者您将其存储在不同的位置,您可以传入一个路径选项:
require('dotenv').config({
path: 'path/to/env/file'
});
原来我的 .env 路径不正确。出于某种原因,其他密钥有效,但私钥无效。
正确的设置:
require("dotenv").config({
path: `./.env.${process.env.NODE_ENV}`,
});
const private_key = process.env.GATSBY_GOOGLE_PRIVATE_KEY.replace(/\n/g, '\n');
module.exports = {
resolve: 'gatsby-source-google-sheets',
options: {
credentials: {
"private_key": private_key,
}
}
}
我正在添加一种对我有用的手动方法。 第 1 步:
echo "PRIVATE_KEY=\"`sed -E 's/$/\\n/g' my_rsa_2048_priv.pem`\"" >> .env
.env 文件中的密钥将如下所示:
PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\n
dasdasdadasdasdasdasdasdasdasdadasdasdadasa\n
huehuauhhuauhahuauhauahuauhehuehuauheuhahue\n
-----END RSA PRIVATE KEY-----\n"
第 2 步。在您的代码中打印值 process.env.PRIVATE_KEY
只会显示第一行:-----BEGIN RSA PRIVATE KEY-----\n
。要解决此问题,请将 .env
中的变量编辑为一行。像这样:
PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\ndasdasdadasdasdasdasdasdasdasdadasdasdadasa\nhuehuauhhuauhahuauhauahuauhehuehuauheuhahue\n-----END RSA PRIVATE KEY-----\n"
现在process.env.PRIVATE_KEY
可以正确输出
我有类似的问题,我必须读取 .pem 文件内容。以下方法对我有用。
- 将.pem内容转换为base64格式
- 将转换后的 base64 内容(这将是单行字符串)放入 .env 文件
- 现在将环境变量解码为原始内容
对我有用的解决方案 -- 在 base 64 中编码私钥
第 1 步 - 将密钥转换为 Base 64
// Run this code in a JS file on your Dev Machine.
const privateKey= `-----BEGIN PRIVATE KEY-----\nMIIEvSomeMoreCharacterHererplw==\n-----END PRIVATE KEY-----\n`
const buff = Buffer.from(privateKey).toString('base64');
console.log(buff);
注意:您的项目中不需要commit/include上述代码。这只是为了生成密钥的base64字符串。
步骤 2 - 将控制台日志数据复制到 .env
文件
PRIVATE_KEY = 'akgjhakdgjhasgf'
第 3 步 - 使用代码中的密钥
const key = Buffer.from(process.env.PRIVATE_KEY , 'base64').toString('ascii');
// Use key anywhere in your code.