在 Heroku 配置变量中存储 .p12 文件时出错

Posted

技术标签:

【中文标题】在 Heroku 配置变量中存储 .p12 文件时出错【英文标题】:Error storing a .p12 file in a Heroku config variable 【发布时间】:2015-06-17 08:59:02 【问题描述】:

我可以存储 .pem 文件,但不能存储 .p12 文件。当我运行命令时

heroku config:set P12_CERTIFICATE="$(cat /Users/Brian/certs/pass.com.gym.p12)"

我收到一个错误

invalid byte sequence in UTF-8
/Users/Brian/.rvm/rubies/ruby-2.0.0-p353/lib/ruby/2.0.0/optparse.rb:1355:in `==='
/Users/Brian/.rvm/rubies/ruby-2.0.0-p353/lib/ruby/2.0.0/optparse.rb:1355:in `block in parse_in_order'
/Users/Brian/.rvm/rubies/ruby-2.0.0-p353/lib/ruby/2.0.0/optparse.rb:1351:in `catch'
/Users/Brian/.rvm/rubies/ruby-2.0.0-p353/lib/ruby/2.0.0/optparse.rb:1351:in `parse_in_order'
/Users/Brian/.rvm/rubies/ruby-2.0.0-p353/lib/ruby/2.0.0/optparse.rb:1345:in `order!'
/Users/Brian/.heroku/client/lib/heroku/command.rb:168:in `prepare_run'
/Users/Brian/.heroku/client/lib/heroku/command.rb:222:in `run'
/Users/Brian/.heroku/client/lib/heroku/cli.rb:45:in `start'
/usr/local/Cellar/heroku-toolbelt/3.0.1/libexec/bin/heroku:24:in `<main>'

根据几年前的accepted answer,这曾经可以用于 p12 文件。我真的需要能够将 p12 文件存储在配置变量中,以便动态签署通行证。任何帮助表示赞赏。

【问题讨论】:

【参考方案1】:

.p12 (PKCS#12) 使用二进制文件格式,因此您无法将其作为 Heroku 配置变量包含在内。

一种选择是将 p12 转换为单独的 PEM 文件,用于密钥和证书,详见 this answer

然后您可以将密钥文件和证书的内容添加为 heroku 配置变量。您可以使用它们来签署文档,甚至可以使用 OpenSSL 即时创建(我认为)一个 PKCS12 文件:

p12 = OpenSSL::PKCS12.create('pass', 'descriptor',
                      OpenSSL::PKey.read(ENV['PRIVATE_KEY']),
                      OpenSSL::X509::Certificate.new(ENV['CERT']))
p12_binary = p12.to_der

【讨论】:

【参考方案2】:

Lukas 回答的另一种方法是对您的 p12 文件进行 base64 编码,然后在您需要使用它时将其转换回来。例如,在 NodeJS 中,您会执行以下操作:

转换为 Base64 字符串

const p12Buffer = fs.readFileSync("/path/cert.p12");
const base64String = Buffer.from(p12Buffer).toString('base64');

然后您可以将 base64String 字符串的内容存储到您的 heroku 配置环境变量 P12_CERT

从 Base64 字符串转换(在代码中使用 p12 证书)

const p12Buffer = Buffer.from(process.env.P12_CERT, 'base64');

【讨论】:

以上是关于在 Heroku 配置变量中存储 .p12 文件时出错的主要内容,如果未能解决你的问题,请参考以下文章

从 Heroku Git 存储库中删除密钥

在 12 要素应用程序中管理配置

部署时heroku Push错误上的Discord bot

APN 节点:加载 PEM 文件时出错

配置不当的静态文件

设置包含特殊字符 $ 的 Heroku 配置变量