我刚刚从 5.1 升级到 5.2,我对这种存储秘密的“更好”方法感到很困惑......
也许我不明白,但现在开发和生产似乎已经“合并”成一个单一SECRET_KEY_BASE
的以及master.key
......这是正确的吗?
如果没有,我如何使用单独的主密钥并SECRET_KEY_BASE
在开发中?
如果我有开发人员帮助我并且我不希望他们知道我在生产中使用的主密钥(或秘密)怎么办?
我刚刚从 5.1 升级到 5.2,我对这种存储秘密的“更好”方法感到很困惑......
也许我不明白,但现在开发和生产似乎已经“合并”成一个单一SECRET_KEY_BASE
的以及master.key
......这是正确的吗?
如果没有,我如何使用单独的主密钥并SECRET_KEY_BASE
在开发中?
如果我有开发人员帮助我并且我不希望他们知道我在生产中使用的主密钥(或秘密)怎么办?
Rails5.2
改变了这一点。对于开发和测试环境,secret_key_base 是自动生成的,因此您可以将其从secrets.yml
您设置的位置或任何位置删除。
至于生产,您可以通过运行生成和编辑凭据文件rails credentials:edit
。这还将创建config/master.key
仅用于加密和解密此文件的主密钥。将其添加到gitignore
它不会与其他任何人共享,这应该注意与其他开发人员共享它。
如果所有这些听起来有点乏味,你可以忽略它并在 ENV 中提供 secret_key_base。ENV["SECRET_KEY_BASE"]
Rails 会在它抱怨之前检查它是否存在。
访问secret_key_base有两种方式:
Rails 5 默认采用第一种方式。
你可以改变Rails.application.credentials.secret_key_base
。rails 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
可以为您生成一个随机密钥。
我更喜欢第二种方式(旧方式),因为简单。
当我不想与我的朋友开发人员共享生产 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 部分。)