在Rails 5.2中分离secret_key_base?

Tal*_*boy 13 ruby ruby-on-rails ruby-on-rails-5 ruby-on-rails-5.2

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

也许我不理解,但似乎现在的开发和生产已"合并"成一个单一的SECRET_KEY_BASE,以及master.key...这是正确的?

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

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

tom*_*a32 12

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

对于生产,有一个凭证文件,您可以通过运行生成和编辑它rails credentials:edit.这也将创建主密钥,config/master.key其中仅用于加密和解密此文件.添加它gitignore以便它不与其他任何人共享,它应该负责与其他开发者共享它.

如果所有这些听起来有点单调乏味,那么你可以忽略它并在ENV中提供secret_key_base.Rails会在ENV["SECRET_KEY_BASE"]投诉之前检查它是否存在.

  • 是的,我根本不喜欢这种变化.你仍然可以使用秘密,他们仍然像以前一样工作. (3认同)
  • FWIW,主要是为了将来我,secret_key_base可在对象Rails.application.secret_key_base上使用,它将从多个源中提取它,包括在开发和测试中自动生成的一个源。https://github.com/rails/rails/pull/30067/files#diff-580e183141be706162224ef696bdb6c7R413 (2认同)

Yi *_*Xie 8

有两种访问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"] %>
Run Code Online (Sandbox Code Playgroud)

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

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

由于简单,我更喜欢第二种方法(旧方法)。