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
的秘密将不会被合并。
我有一个项目配置为使用 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
的秘密将不会被合并。