Rails:如何修复“在'production'环境中缺少secret_key_base”错误

52

我就是无法忽略这个信息:

Missing `secret_key_base` for 'production' environment, set this string with `rails credentials:edit` (ArgumentError)

我使用的是Rails 5.2.0版本,并且运行了以下命令

EDITOR=vim rails credentials:edit

并且里面:

production:
   secret_key_base: xxxxxxxxxxxxxxxxxxxxxxx

保存后,在终端中执行:

RAILS_ENV=production rails c

我错过了什么吗?我已经重启了服务器,但是仍然遇到相同的问题,在开发模式下没有问题。

8个回答

43

Rails v4/5

保持默认的secrets.yml文件

# config/secrets.yml
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
  aws_secret: abcde
  some_password: abcdex

development:
  secret_key_base: static_secret_key
  aws_secret: abcde

test:
  secret_key_base: static_test_secret_key


#not_indented: key for all env in once
secret_key_base: global_key_for_all_env

RAILS_ENV=production SECRET_KEY_BASE=production_test_key rails c

Rails v5.2.0 添加到生产环境下面,检查这个链接

config.require_master_key = true    #config/environments/production.rb

Rails v7 https://blog.assistancy.be/blog/how-to-store-credentials-in-rails-7/

2
请确保这个秘密文件位于您的应用程序的“config”目录中。 - vaibhavatul47
7
这种解决方案是旧的方法,Rails 5.2 有一个更好的解决方案("encrypted credentials")。 - TomDogg
1
文件名应该是 secrets.yml。顺便说一下,这个解决方案对我不起作用。 - zmd94
7
好的,没关系。我找到了另一种解决这个问题的方法,即在位于config/environments文件夹中的production.rb中添加config.secret_key_base = 'YourSecretKeyHere'。'YourSecretKeyHere'可以通过运行bundle exec rake secret命令生成。 - zmd94
1
这里有正确的答案,也包括2018年的内容。Rails 5在2016年发布。你的答案甚至没有指明它是针对Rails 4的,这非常误导人。 - Andrew Koster
显示剩余5条评论

37
Rails 5.2.0 要求在生产环境中增加一个额外的阶段:
config.require_master_key = true    # in config/environments/production.rb

如果没有它,Rails仍然会回退到传统的secret.yml机制(目前为止)。

Engine Yard的Christopher Rigor在一篇简明的文章中对此进行了阐述。相关部分:

读取凭据

如果您想在生产环境中使用凭据,请将以下内容添加到config/environments/production.rb中:

config.require_master_key = true

这是一个很好的阅读材料,可以看到其优点和缺点。

注意:正如@TomDogg发现的那样,Rails 5.2.1似乎又有所不同,因此本答案可能仅适用于5.2.0版本。


2
不需要 config.require_master_key = true(也许以前是必需的)。现在需要的是 config.read_encrypted_secrets = true - TomDogg
2
@TomDogg 你的评论是否明确与Rails 5.2(问题的范围)有关?这个答案是针对5.2构建的,并且基于经验和Rigor的帖子支持。它可能不适用于其他版本的Rails。 - Eric Platon
我面前正在运行Rails 5.2.1。它没有任何config.require_master_key,这意味着我的最初评论仍然有效。(而我回答中的“第二点”对于使其工作至关重要,您可以尝试一下。) - TomDogg
抱歉在上面的评论中使用了快捷方式。问题是关于5.2.0版本的。我也在使用那个版本。很高兴知道5.2.1仍然不同。将一个标签添加到问题。 - Eric Platon
2
我正在使用Rails 6,这仍然是必要的。这里只有正确的答案。 - Andrew Koster
显示剩余3条评论

7

config/credentials.yml.enc:

development:
  some_username: XXXXXXXXX
  some_password: YYYYYYYYY

test:
  some_username: XXXXXXXXX
  some_password: YYYYYYYYY

production:
  some_username: XXXXXXXXX
  some_password: YYYYYYYYY

secret_key_base: ZZZZZZZZZ
# `secret_key_base:` must NOT be indented !
# It must be put at the very start of a new line.
# There is also no need for it in development or test environment,
#   since there are no attacks to be expected.

同时确保您遵守所有YAML缩进规则(即仅2个空格),因为未能这样做可能会导致加载此文件失败而不发出任何错误提示。


@7urkm3n - 好的,伙计。 - TomDogg
1
@7urkm3n,这只是跟随Rails现在如何处理凭据(加密)的方式。当然,你可以自由地认为旧的方式出于某种原因更好。如果你不确定,只需阅读相关的博客文章,解释其背后的理念即可。 - TomDogg

6

Secret_key_base没有被正确设置。 这是一个已知问题,但并未得到足够的关注:https://github.com/rails/rails/issues/32947

使用以下命令生成密钥:

EDITOR=vim rails credentials:edit

记录密钥。 保存在config/master.key中。

SECRET_KEY_BASE=`cat config/master.key` bin/rails assets:precompile

这是我想到的解决方案。我真的不喜欢被迫使用环境变量的方式。如果有人对主密钥(master.key)等相关信息有更多的了解,请务必评论。

你的答案是错误的。它等于SECRET_KEY_BASE=dummy。"dummy"在具有secrets.yml的Dockerfile中非常有效。环境中具有真正的SECRET_KEY_BASE,在docker构建时不可访问。感谢您的指导。 - Aivils Štoss
编辑:我稍后会回来看这个。 - RWDJ

5
在凭证文件中没有“production:”、“development:”和“test:”环境标签。更多信息请参考 DHH 的帖子:https://github.com/rails/rails/pull/30067
因此,请直接编写。
secret_key_base: xxxxxxxxxxxxxxxxxxxxxxx

请不要把主密钥与密钥库混淆。主密钥用于打开凭据加密文件。
回到以前的密码系统不应该是解决方案,也不应该被接受。

是的,您可以在凭据文件中使用诸如production:development:test:等键来创建分层结构。 - TomDogg
1
我并没有说你不能有分层结构,当然可以,读完整篇文章。如果你在生产环境下有一个密钥X:可以直接通过Rails.application.secrets.X访问。使用凭据应该类似于Rails.application.credentials.dig(:production, :X)。在“secrets”中,环境会自动选择。如果您使用凭据,则不建议使用这些类别,只需为每个环境使用不同的凭据文件,并忘记生产、开发或测试。这种情况下,使用类似于.env文件。 - LightMan

4
我在使用Dockerfile将我的Rails应用部署到dokku时遇到了这个问题。我的解决方案是:
文件config/secrets.yml引用了一个环境变量:
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

我需要使用dokku命令行(直接在服务器上或在我的开发机器上使用dokku-cli gem)来设置这个变量。使用dokku-cli,我可以远程执行以下操作:

dokku config:set SECRET_KEY_BASE=blalbalblablahblablah

或者如果我登录到服务器并在那里运行dokku命令

dokku config:set myrailsapplication SECRET_KEY_BASE=blalbalblablahblablah

应该是 dokku config:set <appname> SECRET_KEY_BASE=blalbalblablahblablah - MECU
1
啊,我在我的开发机上使用dokku-cli,这样我就不必指定应用程序了。它会从git远程dokku中读取。我已经添加了更多细节。 - bjelli

3

不要把 secret_key_base 放在环境标签下面,应该把它放在上面。

以下写法是错误的:

production:
   secret_key_base: xxxxxxxxxxxxxxxxxxxxxxx
   some_other_key: xxx

试试这个替代方案:
secret_key_base: xxxxxxxxxxxxxxxxxxxxxxx
production:
   some_other_key: xxx

0

我在生产环境下开发Rails 5.2应用程序时遇到了同样的问题。

我已经设置好了其他东西。对我来说,问题不在于secret_key_base没有正确设置,而是因为像下面这样将环境名称作为常规参数传递已被弃用

rails c RAILS_ENV=production

如果您仔细查看生成的错误日志,您会看到以下内容:

DEPRECATION WARNING: 传递环境名称作为常规参数已被弃用,并将在下一个Rails版本中删除。请改用-e选项。(called from at bin/rails:9)

要在不同的环境中运行rails控制台,请使用以下命令:-e选项。
rails console -e production

注意:在secrets.yml文件中设置secret_key_base不安全,因为这不是一种安全的存储密钥的方式,请使用加密的credential.yml文件和master key来解密。

就这些。

希望这可以帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接