在本地生产环境中运行Rails服务器(无效消息错误)

24

我正在使用 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 error)

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

你使用加密的秘密文件吗? - AntonTkachov
不是,但我尝试过使用那个。每当我运行 EDITOR="nano --wait" bin/rails credentials:edit 来编辑加密凭据时,它会给我相同的错误,就像我在帖子中看到的那样。 - royketelaar
你有你的应用程序的 master.key 吗? - AntonTkachov
@AntonTkachov 是的,我有一个。 - royketelaar
5个回答

56

好的,最终我搞定了。

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

bin/rails credentials:edit

接着创建了新文件,之后一切都正常了。

但我并不真正理解为什么会有效。有人能给出一个好的解释吗?


4
谢谢,但仅仅删除文件并不是一个好的解决方案。如果你不能丢失已保存的加密凭据呢? :) - Lucas Caton
感谢您保存Rails愚蠢的设置。那些愚蠢的设置会损坏Rails。 - newBike
1
你救了我的一天 :) 我只删除了 credentials.yml.enc,但它对我没有起作用,直到我读到你也删除了 master.key,所以对于任何阅读此内容的人,请不要忘记同时删除 master.keycredentials.yml.enc - medBouzid
我相信凭证是使用ActiveSupport::MessageEncryptor进行加密的。一些Rails升级更改了该类使用的默认密码。因此,当您尝试使用旧密码时,它无法解密这些机密信息。 我直接使用ActiveSupport::MessageEncryptor,并通过使用选项来轮换密码来修复了这个问题(https://api.rubyonrails.org/v5.2.3/classes/ActiveSupport/MessageEncryptor.html)。我不确定为什么这不是credentials.yml.enc的选项。 我猜测这个解决方案之所以有效,是因为它再次使用新密码对机密信息进行了加密。 - jfweitz

9
看起来您的解决方案是删除master.keycredentials.yml.enc,这表明您正在运行Rails 5.2。此设置与Rails 5.1中使用的类似加密的secrets.yml.enc文件有所不同。
目标是允许提交秘密密钥(AWS、Rails的secret_key_base)到项目的代码存储库中。通常可以使用环境变量设置这些内容。现在,协作者只需要共享生成的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

2

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

分别为开发、暂存和生产。

master.key 可用于主要的 credentials.yml 文件

其他环境有它们自己的密钥,因此对于暂存环境,我们在heroku上使用 production.key 替代了 RAILS_MASTER_KEY 配置环境变量,并解决了问题。


0

你需要向项目负责人/团队负责人/同事索取主密钥。

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

这样就解决了问题。


0

我在生产环境中使用Rails 5应用程序时遇到了类似的问题,royketelaar的回答gib的回答

只是要补充一些东西:

删除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文件不建议提交到版本系统控制中,因此请使用figaro gem将master key保存在RAILS_MASTER_KEY环境变量中。

就这些。

希望这可以帮助到您。


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