Rails 5 未在 production.rb 中加载加密的秘密

Rails 5 not loading encrypted secrets in production.rb

我有一个项目配置为使用 Rails 加密的秘密。一切正常,直到我尝试访问 production.rb 环境文件中的秘密。

我发现如果我尝试在配置块中访问类似 Rails.application.secrets.smtp_user_name 的东西,它会清除所有加密的秘密(我只剩下 secrets.yml 中的东西......我没有使用)。示例:

Loading production environment (Rails 5.1.2)
irb(main):001:0> Rails.application.secrets
=> {:secret_key_base=>nil, :secret_token=>nil}

如果我删除访问机密的尝试,它将正常工作:

irb(main):001:0> Rails.application.secrets
=> {:secret_key_base=>"...", :smtp_user_name=>"...", :smtp_password=>"...", :secret_token=>nil}

我目前正在通过在 production.rb 中使用两个配置块来解决它,如下所示:

# This is hacky, it needs to come before the second configure block where
# the encrypted secrets are used.
Rails.application.configure do
  config.read_encrypted_secrets = true
end

Rails.application.configure do
 ... stuff that uses Rails.application.secrets, like ActionMailer
end

还有其他人遇到过这个问题并且可能有更正确的解决方法吗?

为什么会发生这种情况是有道理的(Rails 不知道加载加密的秘密,因为我们没有告诉你),但我认为必须有更好的方法来处理一下。

更新

9 个月后,这再次让我着迷。需要明确的是,如果您在调用 config.read_encrypted_secrets = true 之前引用 Rails.application.secrets,您将缓存空秘密并且无法访问 secrets.yml.enc!

中的任何值

在我的例子中,我曾尝试在 application.rb 中配置 Paperclip S3 凭据,而我的 config.read_encrypted_secrets = true 是在 production.rb 中设置的。结果是 devise.rb 试图读取密钥库的秘密时失败,这都是因为在 application.rb 中我有效地缓存了 nil 秘密。

这是与您的问题相关的错误报告:

https://github.com/rails/rails/issues/30362#issuecomment-326821656

一般来说,即使您已正确设置所有内容,您还需要检查顺序您的应用程序如何加载机密。如果您的应用程序首先询问 Rails.application.secrets 然后设置适当的标志... Rails.application.secrets 将缓存没有秘密的版本...并且来自 secret.yml.enc 的秘密将不会被合并。