Credentials(Rails5.2新)
- 增加config/credentials.yml.enc
- 憎加config/master.key
- 移除了5.1使用的
config/secrets.yml
,config/secrets.yml.enc
andSECRET_BASE_KEY
用于储存production app secrets。
它为第三方服务可以存储任何验证的证书,用一个在config/master.key文件中的key或者使用环境变量RAILS_MASTER_KEY在repository中编码。
最终会取代Rails.application.secrets,这个编码密码在5.1中介绍过。
Rails5.2opens API underlying Credentials,优先使用Credentials API,所以你可以容易的处理其他的编码配置和keys和文件。
具体指导见:http://guides.rubyonrails.org/security.html#custom-credentials
10.1 Custom credentials
Rails 生成了config/credentials.yml.enc来储存第三方证书(你的private credentials)在repository中。
这个文件被encrypted,所以只有拥有master key的人才能decrypt破解,然后读取它的信息。
另一个文件config/master.key替代了过去5.1版的RAILS_MASTER_KEY。它用于decrypt 你的credentials.yml.enc。
因此不要把master.key放入源码版本控制工具中(git),这个文件需要保密。确保.gitignore有它的名字。
Editing Credentials
5.2提供了编辑credentials.yml.enc文件的方法:
EDITOR=vim rails credentials:edit #当然还可以使用其他编辑器,如图形编辑器atom,sublime等
EDITOR="atom --wait" rails credentials:edit #参数--wait,关闭窗口后自动保存文件。
它会打开vim编辑器,可看到被破解decrypted的文件版本。保存它,会通过master key再次封装它.
⭠ master± ⮀
rails credentials:edit
^CTraceback (most recent call last): 1 # aws:
2 # access_key_id: 123
3 # secret_access_key: 345
4
5 # Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
6 secret_key_base: 7f66e057c043776af52f734322f5c95173205fcab766b428d3ba5f851e018af0ab898294fcb4c252424e1da4517bc7ebdf736849f629cc31e93a9d1bf6cf83e3
~
当你运行credentials:edit命令,如果config/master.key和config/credentials.yml.enc不存在,Rails会创建它们。
默认,这个文件包含了secret_key_base。但是它也可以用于储存其他证书,如额外的APIs access keys.
进入控制台, rails console:
Rails.application.credentials.secret_key_base
=> "474cbd9eae46283de0dc93cf8b5c98072ef875ec14af17d487ecbf07f0d4630051e2a6d08fc5ed597be1edd06a2f47f10f538e4a318987d8b0324af21badde2d"
通过Rails.application.credentials来把证书增加到credenticals.yml.enc。如:
config/credentials.yml.enc:
secret_key_base:3b7cd727ee24e8444053437c36cc66c3
some_api_key: SOMEKEY
Rails.application.credentials.some_api_key在任意环境可以返回 SOMEKEY
如果希望当some key是blank时,升起一个例外exception。添加叹号❕:
Rails.application.credentials.some_api_key!
# =》raises KeyError: :some_api_key is blank
Credentials & Environments
The Rails team is proposing to remove the environment scopes inside config/credentials.yml.enc
.
意思是默认,不区分是development, test还是production环境。
但你可以自己为你的secrest在不同的环境,添加namespaces .如:
development:
aws:
access_key_id: 123
secret_access_key: 345
secret_key_base: 2fdea1259c6660852864f9726616df64c8cd
production:
aws:
access_key_id: 321
secret_access_key: 543
secret_key_base: hu23ih41iu23h4123u4h23iu4h2323j412i3
Deploy master key
当你把代码移动到server,确保credentials.yml.enc文件可以被破解decrypted。
所以你需要提供master key。
有2种方法:
- 方法1: 把master key放入server。 把这个文件的符号链接放入一个共享的文件夹shared folder.
- 方法2: 创建 a
RAILS_MASTER_KEY
ENV variable。Rails会侦测它并使用它作为master key:- in heroku:
heroku config:set RAILS_MASTER_KEY=<your-master-key-here>
. - 这是老方法,推荐用方法1.
- in heroku:
关于Upgrading from old Rails:
见文档或者这篇文章
本书的案例: Credentials
5.1介绍的密码原则,在5.2被遗弃了,转而介绍使用证书原则。
不过你仍不得不储存某个编码