rails production secret_key的设置

问题: app error: Missing `secret_token` and `secret_key_base` for 'production' environment, set these values in `config/secrets.yml`

 

rails的安全机制需要一个秘钥。在rails 4.x版本的时候, 秘钥的设置在 RAILS_ROOT/config/secrets.yml, 这文件一般形如:

development:
  secret_key_base: xxxxxx

test:
  secret_key_base: xxxxxx

# Do not keep production secrets in the repository,
# instead read values from the environment.
production:

    secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

  在非生产环境下, 秘钥都是'明文', '硬编码', 写在secrets.yml 里面的。这种方式会由于源代码的泄露, 造成安全问题, 所以这种方式存在安全隐患。

  所以rails要求在生产环境下, 通过操作系统的环境变量来设置秘钥, 这样相对比较稳妥。

  这里可以采取2种方法:

  1. 自己动手, 利用linux系统的机制来设置环境变量 SECRET_KEY_BASE = XXX

  2. 使用GEM dotenv-deployment帮你设置, 具体机制和方法1本质没区别。

  ps: rails产生秘钥的指令: rake secret RAILS_ENV=production, 会产生一个秘钥(好尼玛长)          

  这里我选择方法2, 利用/etc/profile.d/ 下面添加脚本的方式来设置秘钥:

   rake secret RAILS_ENV=production 产生一个秘钥

      在目录 /etc/profile.d/xxx.sh, 下面新建一个 st_rails_secret_key_env.sh 脚本, 内容: export SECRET_KEY_BASE='你前面产生的那个秘钥'

  然后刷新你的shell, echo $SECRET_KEY_BASE, 输出成功

 

  extra:

  linux下面设置环境变量的方法:

  1. 两个文件都是设置环境变量文件的,/etc/profile是永久性的环境变量,是全局变量,/etc/profile.d/设置所有用户生效

  2. /etc/profile.d/比/etc/profile好维护,不想要什么变量直接删除/etc/profile.d/下对应的shell脚本即可,不用像/etc/profile需要改动此文件

  

  参考链接:  

  http://stackoverflow.com/questions/23726110/missing-production-secret-key-base-in-rails

      http://snakelab.cc/2014/11/08/ror-production.html

    

posted @ 2016-07-26 15:51  海狸先森  阅读(3174)  评论(0编辑  收藏  举报