Firebase应用程序错误:解析私钥失败:错误:无效的PEM格式消息。

3

当我将我的Node.js应用程序推送到Heroku时,出现了这个错误:firebaseapperror:失败解析私钥:错误:无效的PEM格式消息

我的环境变量都设置好了,如下所示:

# .env file
    
project_id=project_id
private_key='-----BEGIN PRIVATE KEY----- ... ------END PRIVATE KEY-----\n'
client_email=client_email

然后像下面这样访问它们:

export const sa = {
    privateKey: process.env.private_key,
    projectId: process.env.project_id,
    clientEmail: process.env.client_email
};

在我的本地一切都正常,但在生产环境(heroku)中,我遇到了上述错误。该私钥是一个多行环境变量,因此无法解析。

请问,我该如何修复这个问题?

5个回答

15

修复方法

我通过在网上看到的一篇文章来解决这个问题:如何在环境变量中存储一个长的、多行的私钥

按照步骤操作,您也应该可以解决这个问题。

这篇文章的简要概述是:

将长的、多行的密钥存储为类似于json字符串的形式:

# .env file

project_id=project_id
private_key='{"privateKey": "-----BEGIN PRIVATE KEY----- ... ------END PRIVATE KEY-----\n"}'
client_email=client_email

然后解析它并像这样解构键:

Then parse it and destructure the key like this:
const { privateKey } = JSON.parse(process.env.private_key);

export const sa = {
    privateKey,
    projectId: process.env.project_id,
    clientEmail: process.env.client_email
};

这在本地环境中可以正常工作,但是在生产环境(heroku)中由于所涉及的关键字之前和之后有单引号,会导致解析错误。因此,在您的生产环境变量删除关键字之前和之后的单引号。我还尝试了在本地不使用单引号,并且它也有效

额外的好处

使用这种方法的额外好处

从这里开始,您甚至可以将整个环境变量存储为一个对象,就像这样

# .env file

sa='{"privateKey": "-----BEGIN PRIVATE KEY----- ... ------END PRIVATE KEY-----\n", "clientEmail": "client_email", "projectId": "project_id"}'

那么可以像这样访问它:

export const sa = JSON.parse(process.env.sa);

就这样。

提醒:记住我说过的关于单引号的事情!



1

对我来说最稳定的结果是将JSON转换为base64字符串,然后使用JSON.parse(Buffer.from(process.env.CERT, 'base64').toString())


0

或者,我的情况是去掉private_key周围的单/双引号解决了问题。您可以在生产环境变量中设置私钥:

-----BEGIN PRIVATE KEY-----...-----END PRIVATE KEY-----

0
应该使用 \n 而不是 \n。
不要用这个。
6","private_key":"-----BEGIN PRIVATE KEY-----\\nMIIEv

应该是这样的
6","private_key":"-----BEGIN PRIVATE KEY-----\nMIIEv

在RSA密钥中会有许多\n,请查看更多信息。

0

在使用时,请不要使用单引号/双引号来存储私钥,然后在使用时转义 \n 字符。

.env 文件

project_id=project_id
private_key=-----BEGIN PRIVATE KEY----- ... ------END PRIVATE KEY-----\n
client_email=client_email

代码-
const CERT = process?.env?.private_key?.replace(
  /\\n/g,
 '\n',
);

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