在生产中运行我的应用程序时缺少秘密令牌,密钥库

时间:2015-09-07 15:42:02

标签: ruby-on-rails key token production

我使用Rails 4和Ruby 2.1并抱歉,但我正在使用Windows

我已经阅读了很多关于这个主题的信息"缺少秘密令牌,秘密密钥库"但实际上我并没有做任何事情。

我不使用Heroku,Git,Puma,Passenger或其他我读过的内容。我只是认为我可以像往常一样运行rails s运行rails s -e production,看看我的网络应用程序的生产版本是什么。

但我有错误"缺少secret_token和secret_key_base用于生产环境,请在config / secrets.yml中设置这些值"

我使用openSSL阅读了解决方案,export SECRET_KEY_BASE=<the long string>但我确实理解了这些解决方案。

我认为这是一个与密码连接系统相关的问题,我感谢Micheal Hartl的Rails教程。所以禁用了SSL连接。但没有任何改变。

这是我的config/secrets.yml

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

有人可以解释如何具体解决这个问题吗?

3 个答案:

答案 0 :(得分:7)

GDMN对不起,大家都给了你这么糟糕的解释和指示。好吧,那么,我们......

首先,每个人都是对的,你不再需要“secret_token”,但你需要“secret_key_base”。它的作用是保护您的访问者连接并使您的系统和应用程序更安全。这是一个简单的解释,但你需要在初学者层面担心。

其次,ENV代表“环境变量”,它们在所有操作系统中使用,它们指的是操作系统级别上的变量,这些变量包含您试图访问您的站点时无法访问的信息。例如,在Ruby On Rails中,如果你硬编码secrety_token_base字符串/哈希,那么黑客可以通过使用你的security_token来获取访问权限。我已经看到这种情况发生了并且它并不漂亮,如果个人足够熟练,那么他们甚至可以访问您的root / admin帐户。

现在开始全力以赴。我只知道linux方式,我知道你正在寻找windows方法,但这至少应该让你了解如何找到与你的操作系统相关的信息。

您需要做的第一件事是运行

生成您的secret_token_base
bundle exec rake secret

据我所知,这是您在所有操作系统中执行此操作的方式。运行上面的命令后,控制台将返回一个字符串,您需要复制它。复制后,您将运行以下命令:

export SECRET_KEY_BASE=WhatYouJustCopied

然后我们会检查以确保通过运行来设置环境变量SECRET_KEY_BASE:

env | grep -E "SECRET_TOKEN|SECRET_KEY_BASE"

如果您没有设置SECRET_TOKEN,则只能获得KEY_BASE。

如果您想要了解更多深度信息,请访问此link它可能有点过时但大部分内容仍然相关且在概念上它是相同的。 祝你在新发现的ROR冒险中好运!一旦掌握了它,它就很有趣!

答案 1 :(得分:0)

从命令提示符处运行:     捆绑执行耙秘密

它会生成一长串字符。复制此字符串并将其粘贴到config / secrets.yml中,如下所示:

production:
  secret_key_base: <paste the string here>

注意:只有在不使用公共存储库时才执行此操作。其他任何人都无法访问此密钥。另一种更安全的方法是使用环境变量。请参阅:http://daniel.fone.net.nz/blog/2013/05/20/a-better-way-to-manage-the-rails-secret-token/

答案 2 :(得分:0)

因此,如果查看secrets.yml文件,您将看到为每个环境设置secret_key_base的位置。当您查看生产设置时,它需要一个env变量来初始化您的secret_key_base。通常,在生产中,您希望您的应用服务器从一般位置获取值,以防您需要旋转多个服务器,您不必在任何地方对您的secret_key_base进行硬编码,因为这不是一种安全的方式设置该变量。

基本上,您必须在将在生产中运行rails应用程序的计算机上设置该env变量。有很多不同的方法可以设置它。

我为生产初始化我的ENV变量而设置的是一个单独的yml文件,其构造方式如下

# config/env_provider.yml
production:
  SECRET_KEY_BASE: "KEY GOES HERE"
  other_production_variables: #...etc

然后,在初始化变量之前,我的单独服务器将被告知在哪里找到此文件(这不会被检入版本控制)。在文件到位后,它将知道在应用初始化之前从environment.rb中的以下代码初始化变量

#config/environment.rb
YAML.load_file("#{::Rails.root}/config/env_provider.yml")[::Rails.env].each {|k,v| ENV[k] = v }
# This is before Rails.application.initialize!

这个设置的目的是确保每个人都无法访问此文件,只允许应用程序服务器使用它。无论如何,这就是我如何处理ENV变量并将它们部署到生产中。我希望这会对你有所帮助。