将 X.509 私钥存储在 Vercel 上的环境变量中并在 Nextjs 中使用它的正确方法是什么?

the*_*jay 3 next.js vercel

设置

我有一个 Nextjs 应用程序,它使用 Firebase Admin 并需要私钥来初始化自身。它是一个 X.509 私钥证书,为了安全起见,我尝试将其存储在 Vercel(我的托管选择)上的环境变量中。

我的文件中有环境变量.env.local,如 nextjs文档中所述。由于有几个 地方描述了 Vercel 未正确存储“原始”存储的私钥,但它们可以正确存储为 JSON 并稍后由应用程序解析,因此我已经这样做了。事实上,测试按原样存储私钥是行不通的,并且在此github 问题上描述的两种方法中的任何一种中存储/解析私钥都可以在本地与我的变量一起使用,.env.local如下所示:

EXAMPLE_KEY=example_value
FIREBASE_PRIVATE_KEY='"-----BEGIN PRIVATE KEY-----\WdEFiwPk...   ...htJthGef\n-----END PRIVATE KEY-----\n"'
Run Code Online (Sandbox Code Playgroud)

问题

尝试将这些更改部署到 Vercel 失败了,调查原因似乎指向 Vercel 上以奇怪方式存储的环境变量。

使用 Vercel cli 添加变量,然后提供文本将始终将提供的值用双引号引起来:

如果您vercel env add FIREBASE_PRIVATE_KEY输入true该值,然后运行vercel env pull <filename>,该文件将包含:

FIREBASE_PRIVATE_KEY="true"
Run Code Online (Sandbox Code Playgroud)

通常这可能不是问题,但由于私钥有双引号括起来,因此提交值“raw”然后将其拉回本地文件如下所示:

FIREBASE_PRIVATE_KEY=""-----BEGIN PRIVATE KEY-----\WdEFiwPk...   ...htJthGef\n-----END PRIVATE KEY-----\n""
Run Code Online (Sandbox Code Playgroud)

并尝试在 JSON 可解析的单引号字符串中提交它,返回:

FIREBASE_PRIVATE_KEY="'"-----BEGIN PRIVATE KEY-----\WdEFiwPk...   ...htJthGef\n-----END PRIVATE KEY-----\n"'"
Run Code Online (Sandbox Code Playgroud)

我认为这可能就是从 Vercel 提取数据时的格式化方式,但它与我从应用程序中看到的错误消息一致。

我已经尝试了几乎所有组合和配置来尝试获得JSON.parse可用的私钥,但似乎无法使其工作。我什至尝试删除包裹的双引号privateKey,看看是否会添加明显添加的双引号并在那里工作,但没有骰子。

ima*_*air 5

致谢:https://gist.github.com/tomi/0675e58919af4554b198cee3f84405e5

将私钥编码为 base64:

  • 将私钥复制到剪贴板
  • 运行命令pbpaste | base64 | pbcopy

私钥现在在剪贴板中以 base64 编码。将其粘贴到 env 变量,例如 heroku 或 .env 文件

在node.js中从base64解码私钥

const private_key = new Buffer(process.env.PRIVATE_KEY, 'base64').toString('ascii');