Rails Production - 如何设置密钥库?

Posted

技术标签:

【中文标题】Rails Production - 如何设置密钥库?【英文标题】:Rails Production - How to set Secret Key Base? 【发布时间】:2015-05-25 02:06:57 【问题描述】:

所以我试图让我的 Rails 应用程序在生产模式下部署,但我收到错误消息:“生产”环境缺少 secret_tokensecret_key_base,请在 config/secrets.yml 中设置这些值

我的 secrets.yml 文件符合预期:

development:
  secret_key_base: xxxxxxx

test:
  secret_key_base: xxxxxxx

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

但即使经过谷歌和研究,我也不知道如何处理生产密钥库。那里的大部分信息都假设我有一定的背景知识,但事实是我是个菜鸟。

谁能向我解释如何设置我的密钥并让它在生产模式下工作?

【问题讨论】:

How to solve error "Missing `secret_key_base` for 'production' environment" on Heroku (Rails 4.1)的可能重复 【参考方案1】:

您得到的错误只是表明secret_key_base 的环境变量未在服务器上正确设置。

您可以使用各种脚本(例如 capistrano)在应用程序运行之前自动设置这些脚本。

至于快速修复试试这个:

export SECRET_KEY_BASE=YOUR SECRET BASE

验证环境变量并检查是否已设置。

命令:

env | grep -E "SECRET_TOKEN|SECRET_KEY_BASE"

如果您的值弹出,那么这些值是在生产服务器上设置的。

此外,最佳做法是使用ENV.fetch(SECRET_KEY),因为这会在应用尝试启动之前引发异常。

【讨论】:

我的秘密令牌应该是什么?我使用了 $rake secret,它给了我一个密钥,但是基础呢? rake secret 创建一个安全密钥字符串以用作TOKENBASE。 Rails 只需要它们正常运行并在幕后做一些安全工作。 最新的 Rails 不再需要secret_token;只需要secret_key_base 感谢您的提醒,我正在更新原始答案。【参考方案2】:

现在(rails 6)rails 会为您生成 tmp/development_secret.txt 中的密钥库。

在生产环境中,最好的方法是将 SECRET_KEY_BASE 作为 en 环境变量,它会被 rails 拾取。

您可以通过Rails.application.secret_key_base查看。

应该给你一长串从“a”到“f”的数字和字符(一个 128 字符长的十六进制编码字符串)

【讨论】:

【参考方案3】:

这个答案对我帮助很大。他向您指出了如何在生产环境中配置 secrets.yml 文件以及如何从环境中读取它:

原链接: https://***.com/a/26172408/4962760

我遇到了同样的问题,我通过创建环境解决了它 每次我登录到生产环境时要加载的变量 服务器并制作了配置步骤的迷你指南:

https://gist.github.com/pablosalgadom/4d75f30517edc6230a67

当我尝试部署我的 应用程序它没有正常启动,在 unicorn.log 文件中我发现了这个 错误信息:

"应用程序错误:缺少'生产'环境的secret_key_base,设置 这个值在 config/secrets.yml (RuntimeError)"

经过一些研究,我发现 Rails 4.1 改变了 管理 secret_key,因此如果您阅读位于 [exampleRailsProject]/config/secrets.yml 你会发现类似 这个:

不要在存储库中保留生产机密,

而是从环境中读取值。生产:secret_key_base: 这意味着轨道

建议您为 secret_key_base 使用环境变量 在您的生产服务器中,为了解决此错误,您应该 按照以下步骤为 Linux 创建环境变量(在我的 case Ubuntu)在您的生产服务器中:

1.- 在生产服务器的终端执行下一条命令:

$ RAILS_ENV=production rake secret 这将返回一个大字符串 字母和数字,复制(我们将该代码称为 GENERATED_CODE)。

2.1- 以 root 用户登录你的服务器,找到这个文件并编辑它: $ vi /etc/profile

转到文件底部(“SHIFT + G”表示 VI 中的大写 G)

使用 GENERATED_CODE 写入您的环境变量(按“i”键 写VI),一定要在文件末尾换行:

export SECRET_KEY_BASE=GENERATED_CODE 保存更改并关闭 文件(我们按“ESC”键,然后写“:x”和“ENTER”键保存 并在 VI 中退出)

2.2 但是,如果您以普通用户身份登录,我们将其命名为 example_user 作为此要点,您将需要找到其他文件之一:

$ vi ~/.bash_profile $ vi ~/.bash_login $ vi ~/.profile 这些文件 按重要性排序,这意味着如果你有第一个 文件,那么你就不需要写其他的了。所以如果你发现 这两个文件在你的目录“~/.bash_profile”和“~/.profile”你 只需要在第一个“~/.bash_profile”中写入,因为 Linux 将只读取这一项,而另一项将被忽略。

然后我们转到文件底部(“SHIFT + G”表示VI中的大写G)

我们将使用 GENERATED_CODE 编写环境变量 (在VI中按“i”键写),一定要换行结尾 文件:

export SECRET_KEY_BASE=GENERATED_CODE 写完代码,保存 更改并关闭文件(我们按下“ESC”键然后写“:x” 和“ENTER”键在VI中保存和退出)

3.- 您可以使用以下命令验证我们的环境变量是否在 Linux 中正确设置:

$ 打印环境 | grep SECRET_KEY_BASE 或使用:

$ echo $SECRET_KEY_BASE 当你执行这个命令时,如果一切 没问题,它会显示之前的 GENERATED_CODE。终于有了 所有完成的配置你应该能够在没有的情况下部署 问题你的 Rails 应用程序与 Unicorn 或其他。

当你关闭你的 shell 终端并再次登录到生产环境时 服务器,您将设置此环境变量并准备使用 它。

就是这样!!我希望这个迷你指南可以帮助您解决这个错误。

免责声明:我不是 Linux 或 Rails 专家,所以如果你发现了什么 错误或任何错误我会很乐意修复它!

【讨论】:

【参考方案4】:

您可以使用以下命令生成密钥

$ irb
>> require 'securerandom'
=> true
>> SecureRandom.hex(64)
=> "3fe397575565365108556c3e5549f139e8078a8ec8fd2675a83de96289b30550a266ac04488d7086322efbe573738e7b3ae005b2e3d9afd718aa337fa5e329cf"
>> exit

【讨论】:

如何使用这个,我可以放吗?? 或现在使用rails secret【参考方案5】:

如您所见,developmenttest 环境有一个硬编码值,但production 的值来自一个变量。首先,为什么要这样?这是一项安全功能。这样,如果您将此文件签入版本控制(例如 git 或 svn),developmenttest 值将共享,这很好,但 production 一个(将在真实网站上使用的那个) ) 不是,所以没有人可以通过查看源代码来获得这个秘密。

至于使用的变量ENV["SECRET_KEY_BASE"],这是来自Rails运行环境的环境变量(不要与Rails“环境”混淆,例如developmenttest和@987654335 @)。这些环境变量来自 shell。正如JensD 的帖子中提到的,您可以通过以下方式临时设置此环境变量:

export SECRET_TOKEN=YOUR SECRET TOKEN
export SECRET_KEY_TOKEN=YOUR SECRET BASE

要生成新的秘密令牌,请在命令行中使用rake secret 命令。

不过,这只是暂时的,并不是一个好的最终解决方案。要获得最终解决方案,请查看this article,它在快结束时介绍了实现dotenv 以加载配置机密。请记住,如果您使用版本控制,请务必将您的 .env 文件排除在签入之外!

设置 dotenv 需要一些工作,但我强烈推荐它而不是尝试手动配置这些环境变量。

【讨论】:

是否有关于将 Rails 应用程序推向生产的分步教程?由于缺乏必要的背景知识,我无法将所有这些片段拼凑起来 你可以试试digitalocean的这个教程:digitalocean.com/community/tutorials/… @nvrpicurnose 哈哈,学习的方法是一遍又一遍地做,直到它开始变得更容易。很长一段时间以来,我一直在不断地启动和拆除服务器,直到我最终得到它。需要花费大量时间和大量教程才能真正获得它。至少,在没有人真正握住我的手向我展示的情况下,我就是这样。坚持下去,它会变得更容易。查看我尝试部署的这个演示应用程序的自述文件。可能会帮助github.com/adiakritos/sw-checkin

以上是关于Rails Production - 如何设置密钥库?的主要内容,如果未能解决你的问题,请参考以下文章

Rails 4 - 如何在 /config/environments/production.rb 文件中使用常量?

如何从heroku中的rails应用程序获取完整的production.log?

如何在 Ruby on Rails 中为我的开发和生产环境设置不同的 api 密钥?

使用 Rails 为 capistrano 3.8.0 运行“cap production deploy”时不知道如何构建任务“start”

Rails Production 未将 relative_url_root 附加到图像

Ubuntu 14.04 中的 production.log 在哪里 - Rails 4