2015-09-07 83 views
3

我使用Rails 4和Ruby 2.1和工作运行我的应用程序时,抱歉,但我的工作在Windows缺少的秘密令牌,密钥基地生产

我已经阅读了很多关于这个话题“缺少秘密令牌,密关键基地“,但实际上我没有对任何事情进行任何限制。

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

但我有错误“缺少secret_token和secret_key_base用于生产环境,设置在配置/ 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"] %> 

有人能解释如何具体解决这个问题?

回答

5

GDMN我很抱歉,每个人都给你这么差的解释和指示。好吧,那么我们会。

首先,每个人都是对的,你不再需要“secret_token”,但你确实需要“secret_key_base”。它所做的就是保护您的访客连接,并保持您的系统和应用程序更加安全。这是一个简单的解释,但您只需在初学者级别担心。

其次,ENV代表“环境变量”,它们用于所有操作系统,它们指的是操作系统级别的变量,用于保存您不希望访问某人试图访问您网站的人员访问的信息。例如,在Ruby On Rails中,如果你使用HARD CODE命令secrety_token_base string/hash,那么我的黑客可以通过使用你的security_token来获得访问权限。我看到过这种情况发生,并且这并不美妙,如果这个人足够熟练,那么他们甚至可以访问你的root/admin帐户。

现在开始设置它。我只知道linux的方式,我知道你正在寻找Windows方法,但这至少应该让你理解,找出与你的操作系统相关的信息。

,你需要做的第一件事是通过运行

bundle exec rake secret 

要我knowlege生成您secret_token_base这是你做的所有操作系统的方式。运行上述命令后,控制台将返回一个字符串,您需要将其复制。一旦复制您将运行以下命令:

export SECRET_KEY_BASE=WhatYouJustCopied 

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

env | grep -E "SECRET_TOKEN|SECRET_KEY_BASE" 

如果你没有SECRET_TOKEN设置你只会得到KEY_BASE。

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

+0

非常感谢。这对“SECRET_KEY_BASE”有很多解释 – Hanmaslah

0

从你的命令提示符下运行: 束EXEC耙秘密

它会生成字符的长字符串。复制此字符串并将其粘贴到配置/ 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/

+0

我用我的'config/secrets.yml'文件中的内容编辑了我的帖子。在你寄给我的网址中写道,RAILS 4.1已经集成了正确的更新来解决缺失密钥库的问题。那么,为什么我会遇到这个问题呢? – GDMN

+0

在您编辑的文章中,您键入了'config/secrets/secrets.yml'。它是在config目录还是在一个名为'secrets'的子目录中?在Rails控制台中,输入'Rails.application.secrets'。它显示密钥?如果没有,请确保您的环境变量在生产环境中正确设置。 –

+0

这是一个错误,它是'config/secrets.yml',所以我的文件'secrets.yml'在我的config目录中。当我在Rails控制台中键入'Rails.application.secrets'时,它返回一个带有两个参数的散列; secret_key_base是一个长字符串,但'secret_token'是零。 – GDMN

0

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

基本上,您将不得不在设备上设置env变量,以便在生产环境中运行您的Rails应用程序。有很多不同的方法来设置它。

我已经设置了初始化我ENV变量生产具有构造这样

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

然后我单独的服务器将被告知在哪里初始化变量之前找到此文件单独YML文件(这不会被检入版本控制)。文件到位后,它将知道在环境中从以下代码初始化变量。您的应用程序之前,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变量并将其部署到生产环境。我希望这可以帮助你。