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

时间:2017-07-03 20:12:19

标签: ruby-on-rails ruby-on-rails-5.1

我有一个项目配置为使用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个月后再次将我钉死了。需要说明的是,如果您在调用Rails.application.secrets之前引用config.read_encrypted_secrets = true,则会缓存空的机密而无法访问secrets.yml.enc中的任何值!

在我的情况下,当application.rb设置config.read_encrypted_secrets = true时,我尝试在production.rb中配置Paperclip S3凭据。结果是devise.rb试图读取密钥库的秘密,所有这些都是因为application.rb我已经有效地缓存了无秘密。

1 个答案:

答案 0 :(得分:1)

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

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

一般情况下,即使您已正确设置所有内容,也需要检查订单您的应用程序如何加载机密信息。如果您的应用程序首先询问Rails.application.secrets然后设置正确的标记... Rails.application.secrets将缓存版本而不保密......并且来自secret.yml.enc的秘密将不会合并。