在.env文件中使用私钥

45

我在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
        }
    }
}
< p >由于它只是一行字符串,所以< code >client_id工作正常,但< code >private_key 不起作用,可能是因为它有多行。

有什么方法可以避免这种情况吗?

谢谢


看起来上面的代码有一个额外的{和一个缺少的,。我已经纠正了这些问题,但我不确定你的原始版本是否有同样的错误? - John Sibly
9个回答

60
你可以使用以下带有正则表达式的 string.replace 函数来再次转义 \n 字符:
你可以使用 string.replace 函数和下面的正则表达式来转义 \n 字符:
"private_key": process.env.GATSBY_GOOGLE_PRIVATE_KEY.replace(/\\n/g, '\n'),

我得到了以下错误信息: `无法读取未定义的属性'replace': const private_key = process.env.GATSBY_GOOGLE_PRIVATE_KEY.replace(/\n/g, '\n');module.exports = {...}`这可能与const在module.exports之外声明有关。 - mckeever02
听起来你添加这行代码时超出了范围 - 我已经更新以更贴近你的问题。 - John Sibly
很遗憾,出现了相同的错误。似乎无法在 process.env 上使用 .replace。 - mckeever02
奇怪 - 对我来说它有效。您能使用调试器检查 GATSBY_GOOGLE_PRIVATE_KEY 是否确实被分配了一个字符串吗? - John Sibly
我不知道为什么,但这个解决方案有效。如果有人能用通俗易懂的语言解释一下就好了 :) - Fahad Javed
replace函数正在搜索所有出现的字面字符串\n(为了避免被转义,它被定义为“\n”),并用换行符替换:\n,Unicode:U+000A,ASCII:10,十六进制:0x0a。为确保替换所有出现的内容,使用/......../g正则表达式。这个问题在https://dev59.com/Qpnga4cB1Zd3GeqPgPzp中给出了清晰的解释。 - John Sibly

39

对我有效的解决方案--以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);

注意:您不需要在项目中提交/包含上面的代码。这只是为了生成密钥的base64字符串。

步骤2-将控制台日志数据复制到.env文件中

PRIVATE_KEY = 'akgjhakdgjhasgf'

步骤3 - 在代码中使用密钥

const key = Buffer.from(process.env.PRIVATE_KEY , 'base64').toString('ascii');
// Use key anywhere in your code.

1
为什么解码时使用ASCII而不是UTF8? - Capaj
1
需要确保在键的结尾没有 \n(就像示例中一样)才能使其正常工作。 - Pomo-J
3
对于未来的读者,这个答案比被采纳的答案更好。 - Allen
1
是的,这确实是比折腾正则表达式更好的解决方案。 - undefined

17

我正在添加一个对我有效的手动方法。

步骤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将被正确输出。


我能够读取私钥并将其导出到环境文件中。但是我不理解步骤2是什么意思。你能解释一下吗? - yoges nsamy
1
@yogescicak 将值编辑为保持在一行。 - Marcelo Fonseca

8
  1. 将您的pem文件内容复制到浏览器控制台中(添加“`”):
`-----BEGIN RSA PRIVATE KEY-----
loremipsum...
-----END RSA PRIVATE KEY-----`
  1. 从浏览器中复制日志(注意添加了 \n
  2. 将其添加到您的环境文件中(注意使用了 ""):
PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\nloremipsum...\n-----END RSA PRIVATE KEY-----"

不用再找了,开发者!这就是正确的答案 :) - Fi Li Ppo

6

我遇到了类似的问题,需要读取.pem文件的内容。以下方法适用于我:

  • 将.pem内容转换为base64格式
  • 将转换后的base64内容(这将成为单行字符串)放入.env文件中
  • 现在将env变量解码为原始内容

4

原来我的 .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,
        }
    }
}


当您更改了路径后,私钥是否按照上面的格式工作? - JamWill

1

您需要将环境变量加载到 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'
});

1
谢谢!我已经加入了这个,但路径不对。我不确定为什么其他的可以工作而这个不行,但修正路径已经解决了问题。 - mckeever02

0
将其放入 pem 文件中,然后使用替换将其写入您的 .env 文件。
echo "export test_key=\"`sed -E 's/$/\\\n/g' ./gitbu.2018-03-23.private-key.pem`\"" >> .env

0
我刚刚从 .env 文件中的私钥末尾删除了 ";",这对我很有效...我知道这看起来有点傻,但许多人都会犯这个错误,因为他们太习惯 Javascript 和 Solidity 了...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接