15

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

也许我不明白,但现在开发和生产似乎已经“合并”成一个单一SECRET_KEY_BASE的以及master.key......这是正确的吗?

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

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

4

3 回答 3

14

Rails5.2改变了这一点。对于开发和测试环境,secret_key_base 是自动生成的,因此您可以将其从secrets.yml您设置的位置或任何位置删除。

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

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

于 2018-04-13T01:15:49.730 回答
10

访问secret_key_base有两种方式:

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

Rails 5 默认采用第一种方式。

你可以改变Rails.application.credentials.secret_key_baserails credentials:edit对于所有其他环境,请记住将环境变量设置RAILS_MASTER_KEY为与config/master.key. 这master.key是 git 默认忽略的。这种方式对所有环境使用相同的密钥。如果你想使用不同的键,你需要自己控制命名空间。

如果你更喜欢第二种方式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可以为您生成一个随机密钥。

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

于 2018-07-09T18:07:25.440 回答
1

当我不想与我的朋友开发人员共享生产 master.key 时,我使用了这个 gem,我认为这与 OP 的目的完全相同。

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

您可以为每个环境拥有一个主密钥,如下所示,因此您可以自行决定要与哪些开发人员/部署人员共享哪个密钥。

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 部分。)

于 2018-12-17T01:27:09.330 回答