【问题标题】:Unable to set RSA private key as config var无法将 RSA 私钥设置为配置变量
【发布时间】:2017-11-05 17:54:07
【问题描述】:

我正在尝试将 Express 应用程序部署到 Heroku。我遇到的麻烦是 Heroku 或其他东西正在搞砸 RSA 私钥字符串的格式。我的.env 中有以下内容,它在本地工作并且不受 git 影响:

TYPE=
PROJECT_ID=
PRIVATE_KEY_ID=
PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n"
CLIENT_EMAIL=
CLIENT_ID=
AUTH_URI=
TOKEN_URI=
AUTH_CERT_URL=
CLIENT_CERT_URL=

我最初使用https://github.com/xavdid/heroku-config 设置上述变量,而不是通过 Heroku 上的仪表板手动设置,但该私钥失败。

然后我尝试通过 Heroku 仪表板复制/粘贴(不带双引号)手动设置该值,但仍然失败。

最后我通过heroku config:set设置了值,但应用启动时仍然无法解析。

我什至尝试将 \n 替换为 '\n',就像有人使用 here 并在 heroku config:set PRIVATE_KEY="" 中使用引号一样,但仍然不起作用。

所以我的问题是,Heroku 是否对长字符串值做了一些时髦的事情?或者我错过了什么。上述值的调用/使用如下所示:

const { credential } = require('firebase-admin')

exports.serviceAccount = {
  type: process.env.TYPE,
  project_id: process.env.PROJECT_ID,
  private_key_id: process.env.PRIVATE_KEY_ID,
  private_key: process.env.PRIVATE_KEY,
  client_email: process.env.CLIENT_EMAIL,
  client_id: process.env.CLIENT_ID,
  auth_uri: process.env.AUTH_URI,
  token_uri: process.env.TOKEN_URI,
  auth_provider_x509_cert_url: process.env.AUTH_CERT_URL,
  client_x509_cert_url: process.env.CLIENT_CERT_URL
}

exports.credential = credential.cert(exports.serviceAccount)

exports.databaseURL = process.env.DATABASE_URL

exports.adminConfig = {
  credential: exports.credential,
  databaseURL: exports.databaseURL
}

以及来自 Heroku 的日志:

2017-06-05T01:50:13.761150+00:00 app[web.1]: > NODE_ENV=production node ./server/server.prod.js
2017-06-05T01:50:14.231853+00:00 app[web.1]: /app/node_modules/firebase-admin/lib/auth/credential.js:129
2017-06-05T01:50:14.231876+00:00 app[web.1]:             throw new error_1.FirebaseAppError(error_1.AppErrorCodes.INVALID_CREDENTIAL, 'Failed to parse private key: ' + error);
2017-06-05T01:50:14.231877+00:00 app[web.1]:             ^
2017-06-05T01:50:14.231878+00:00 app[web.1]:
2017-06-05T01:50:14.231878+00:00 app[web.1]: Error: Failed to parse private key: Error: Invalid PEM formatted message.
2017-06-05T01:50:14.231883+00:00 app[web.1]:     at FirebaseAppError.FirebaseError [as constructor] (/app/node_modules/firebase-admin/lib/utils/error.js:39:28)
2017-06-05T01:50:14.231884+00:00 app[web.1]:     at new FirebaseAppError (/app/node_modules/firebase-admin/lib/utils/error.js:84:23)
2017-06-05T01:50:14.231885+00:00 app[web.1]:     at new Certificate (/app/node_modules/firebase-admin/lib/auth/credential.js:129:19)
2017-06-05T01:50:14.231886+00:00 app[web.1]:     at new CertCredential (/app/node_modules/firebase-admin/lib/auth/credential.js:195:33)
2017-06-05T01:50:14.231887+00:00 app[web.1]:     at Object.cert (/app/node_modules/firebase-admin/lib/firebase-namespace.js:189:58)
2017-06-05T01:50:14.231887+00:00 app[web.1]:     at Object.<anonymous> (/app/server/firebase/index.js:16:33)
2017-06-05T01:50:14.231888+00:00 app[web.1]:     at Module._compile (module.js:569:30)
2017-06-05T01:50:14.231888+00:00 app[web.1]:     at Object.Module._extensions..js (module.js:580:10)
2017-06-05T01:50:14.231889+00:00 app[web.1]:     at Module.load (module.js:503:32)
2017-06-05T01:50:14.231889+00:00 app[web.1]:     at tryModuleLoad (module.js:466:12)

【问题讨论】:

    标签: heroku


    【解决方案1】:

    我能够使用我找到的评论建议来解决我的问题 here

    所以在应用程序的 Heroku 仪表板上,我将 PRIVATE_KEY 值设置为双引号:

    然后我改变了

    private_key: process.env.PRIVATE_KEY

    private_key: JSON.parse(process.env.PRIVATE_KEY)

    最后通过git push heroku master重新部署,应用启动正常。


    2018-10-27: 上面链接中的 cmets 现已消失。但实际上评论者提到该字符串实际上是一个 JSON 字符串,需要将其解析回 String

    2019-08-01:最初链接的域不再有效。所以我用来自 Wayback Machine 的链接替换了原来的链接。

    【讨论】:

    • 我在 OpenShift 中也遇到了同样的问题,您的解决方案奏效了!非常感谢!
    • 呃,非常感谢,我在使用 NextJS 和 Vercel 时遇到了同样的问题 ?。
    【解决方案2】:

    .env 中的密钥必须像这样同时包含在一个单引号和双引号中
    '"[PRIVATE_KEY]"' 这确实与您在调用此命令时从 heroku 获得的格式相同
    @ 987654324@
    还有一件事要添加到JSON.parse,以防它仍然给您带来错误,您可以在这里找到:
    Node.js -Firebase Service Account Private Key won't parse

    因此,当您从该页面返回后,最终代码行将如下所示: JSON.parse(process.env.PRIVATE_KEY).replace(/\\n/g, '\n')

    【讨论】:

      猜你喜欢
      • 2017-08-22
      • 2015-07-07
      • 2013-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多