在 Rails 5.2 中分隔 secret_key_base?

Separate secret_key_base in Rails 5.2?

我刚从 5.1 升级到 5.2,我对这种 'better' 存储秘密的方法感到很困惑...

也许我不明白,但现在似乎开发和生产已经 'merged' 变成了 SINGLE SECRET_KEY_BASE 以及 master.key... 这是正确的吗?

如果没有,我如何在开发中使用单独的主密钥和SECRET_KEY_BASE

如果我有开发人员帮助我并且我不想让他们知道我在生产中使用的主密钥(或秘密)怎么办?

Rails 5.2 改变了很多。对于开发和测试环境,secret_key_base 是自动生成的,因此您可以将其从 secrets.yml 或您设置的任何地方删除。

至于生产,您可以通过 运行 rails credentials:edit 生成和编辑凭证文件。这还将在 config/master.key 中创建仅用于加密和解密此文件的主密钥。将此添加到 gitignore,这样它就不会与其他任何人共享,这应该负责与其他开发人员共享它。

如果所有这些听起来有点乏味,你可以忽略它并在 ENV 中提供 secret_key_base。 Rails 会在抱怨之前检查它是否存在于 ENV["SECRET_KEY_BASE"] 中。

有两种访问方式secret_key_base:

  1. Rails.application.credentials.secret_key_base
  2. Rails.application.secrets.secret_key_base

Rails5默认走第一种方式

您可以将 Rails.application.credentials.secret_key_base 更改为 rails credentials:edit。对于所有其他环境,请记住将环境变量 RAILS_MASTER_KEY 设置为与 config/master.key 相同的内容。默认情况下 master.key 被 git 忽略。这种方式对所有环境使用相同的密钥。如果要使用不同的key,需要自己控制namespaces。

如果你更喜欢第二种方式Rails.application.secrets.secret_key_base。您需要创建 config/secrets.yml:

development:
  secret_key_base: ...
test:
  secret_key_base: ...
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

记得在生产环境中设置环境变量SECRET_KEY_BASE。 如果 config/secrets.yml 文件足够机密,将 <%= ENV["SECRET_KEY_BASE"] %> 更改为纯文本就可以了。

rake secret可以为您生成一个随机密钥。

我更喜欢第二种方式(旧方式),因为简单。

当我不想与我的朋友开发者分享作品时 gem 我使用了这个 gem 我认为这与 OP 的目的完全相同。

https://github.com/sinsoku/rails-env-credentials

您可以为每个环境拥有一个主密钥,如下所示,因此您可以自行决定要与哪个密钥共享 developers/deployers。

config/credentials-development.yml.enc
config/credentials-test.yml.enc
config/credentials.yml.enc
master-development.key
master-test.key
master.key

每个密钥都会在您第一次 运行 时生成,例如:

rails env_credentials:edit -e development

如果您从一种 master.key 设置切换到这种设置,您可能遇到的一个错误将与 config/database.yml 有关,其中 Rails 尝试评估所有环境信息,无论你在哪个环境。 (即使您将它们注释掉,Rails 仍会尝试评估 erb 部分。)