核心文件:master.key(主密钥)
- Web应用中的
对称加密
:
JWT 加密解密需要一个 key1
SessionID 加密解密需要一个 key2
(上述就是keys)
- 那么 Key 们存在哪里:Rails 帮我们想好了
- 先汇总:将各个
key
和master.key
进行加密生成encrypted信息
;使用的时候再通过encrypted信息
进行解密
得到所有的key
master.key + keys => encrypted
encrypted + master.key => keys
- 运行rails命令生成一个
yml临时文件
,这个文件定义一系列key
,关闭该文件rails就会删除该临时文件
,然后会生成两个文件:credentials.yml.enc(加密后的encrypted,可传到git)
和master.key(不能传到git)
EDITOR="code --wait" bin/rails credentials:edit(在vscode中打开)
or
bin/rails credentials:edit(在vim中打开)
- 还有问题, key 们被删了,那怎么读写 key 们呢,用控制台:
- 打开控制台:
bin/rails console
or
bin/rails c
- 输入代码:
Rails.application.credentials.xxx
Rails.application.credentials.config(得到所有)
- 还有问题,还是需要把 master.key 复制给生产环境和实习生,不安全。因此Rails支持多环境秘钥,即使泄露了开发环境的,生产环境也不会受影响。运行如下命令生成生产环境的对应的文件:
production.key(和之前的master,key类似)
和production.yml.enc
EDITOR="code --wait" bin/rails credentials:edit --environment production
- 读生产环境的key:
RAILS_ENV=production bin/rails c
- 把
production.key
复制到生产环境
,不要给实习生 - 最后可以删掉
production.key
(但要备份) - 最终结果:
- 开发环境:
使用master.key和credentials.yml.enc
master.key 被 git ignore
如果 .enc 不被ignore,那么多人就共用 master.key
如果 .enc 被ignore,那么每个人就创建自己 maskter.key (注:每个人的key例如jwt的key不一定要一样,只要符合对应的生产规则即可,因此每个人可以生产不一样的master.key)
- 生产环境:
使用 production.key 和 production.yml.enc
.key 被 ignore,内容写到环境变量
.enc 不被 ignore
读取key 们的方式和开发环境一样
- 把开发环境的key_base复制给生产环境,然后开发环境的删掉,重新生成一套,不然生产的就相当于暴露了
- setup_host时候把 .key 作为环境变量传过去,不然服务器解析不了
- 服务器运行:
DB_HOST=db-for-mangosteen DB_PASSWORD=123456 RAILS_MASTER_KEY=6de8a9b8bace9454c87e34d79e6ac4f9 mangosteen_deploy/setup_host.sh
docker exec -it mangosteen-prod-1 bin/rails db:create db:migrate
(注:改端口的话,在puma.rb
的port ENV.fetch("PORT") { 3030 }
地方改)
网友评论