运行 rails 本地生产服务器(InvalidMessage 错误)

Running a rails server in production locally (InvalidMessage error)

我是 运行 Ruby 2.5.1 和 Rails 5.2.0。我 运行 rails s -e production,它给出了这个错误:

/home/roy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activesupport-5.2.0/lib/active_support/message_encryptor.rb:206:in `rescue in_decrypt': ActiveSupport::MessageEncryptor::InvalidMessage
(ActiveSupport::MessageEncryptor::InvalidMessage)

如何正确执行此操作?


编辑: 每当我尝试使用

编辑凭据文件时,都会出现相同的错误
EDITOR="nano --wait" bin/rails credentials:edit

我还意识到我还没有创建生产数据库,所以我尝试使用

RAILS_ENV=production bundle exec rails db:reset

(我知道 db:reset 有点多余,但它应该可以尝试创建、迁移和播种服务器)

遗憾的是我遇到了同样的错误(InvalidMessage 错误)

Unsupported rails environment for compass
rake aborted!
ActiveSupport::MessageEncryptor::InvalidMessage: ActiveSupport::MessageEncryptor::InvalidMessage
/home/roy/apps/myappname/config/environment.rb:5:in `<main>'
/home/roy/.rbenv/versions/2.5.1/bin/bundle:23:in `load'
/home/roy/.rbenv/versions/2.5.1/bin/bundle:23:in `<main>'

Caused by:
OpenSSL::Cipher::CipherError: 
/home/roy/apps/myappname/config/environment.rb:5:in `<main>'
/home/roy/.rbenv/versions/2.5.1/bin/bundle:23:in `load'
/home/roy/.rbenv/versions/2.5.1/bin/bundle:23:in `<main>'
Tasks: TOP => db:create => db:load_config => environment

好的,我终于成功了。

我只是删除了 master.keycredentials.yml.enc 文件,然后 运行

bin/rails credentials:edit

创建了新文件。之后一切正常。

虽然我不太明白它为什么有效。谁能对此给出一个很好的解释?

看来您删除 master.keycredentials.yml.enc 的解决方案表明您是 运行 Rails 5.2。此设置从 Rails 5.1.

中使用的类似加密 secrets.yml.enc 文件更改而来

目标是允许将密钥(AWS,Rails' secrect_key_base)提交到项目的代码存储库。这些通常使用 ENV 变量设置。现在协作者只需要共享生成的master.key即可解密修改或读取credentials.yml.enc.

的内容

当您同时删除 master.keycredentials.yml.enc 文件时,rails 生成了一对新文件,现在您可以解密 credentials.yml.enc 并且此文件已初始化需要一个新的 Rails secret_key_base 值来避免 ActiveSupport::MessageEncryptor::InvalidMessage。如果您追踪该消息的来源,它可能引用 Rails 凭据密钥库:Rails.application.credentials.secret_key_base.

这些是关于该主题的精彩文章:
https://medium.com/cedarcode/rails-5-2-credentials-9b3324851336 https://www.engineyard.com/blog/rails-encrypted-credentials-on-rails-5.2

我在生产中使用 Rails 5 应用程序时遇到了类似的问题, and

补充几点:

删除credentials.yml.encmaster.key文件后,

和运行下面的命令生成一个新的secret_key_basecredentials.yml.encmaster.key文件(我的编辑器是VS Code而不是Nano):

EDITOR="code --wait" bin/rails credentials:edit

确保取消注释 config/environments/production.rb 文件中的以下配置:

config.require_master_key = true

对于您的生产环境,由于包含用于解密credentials.yml.encmaster keymaster.key文件不建议提交到版本系统控制,保存master keyRAILS_MASTER_KEY 环境变量中使用 figaro gem.

就这些了。

希望对您有所帮助

您需要向您的项目负责人/团队负责人/同事索取万能钥匙。

使用像 63y4gh47373h3733jj474 这样的长密钥,将其复制并粘贴到 config 文件夹下的 master.key 文件中。

那就解决问题了。

对于 Rails6,我有一个多环境凭据设置。

一个用于开发、暂存和生产。

master.key 适用于主 credentials.yml 文件

其他环境有自己的密钥,所以为了暂存,我们使用 production.key 代替 heroku 上的 RAILS_MASTER_KEY 配置环境,并为我修复了它。