ruby-on-rails Rails:如何修复“Missing secret_key_base for 'production' environment”

oxiaedzo  于 2023-05-02  发布在  Ruby
关注(0)|答案(8)|浏览(200)

我只是不能接受这个信息:

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

Rails 52.0,并运行

EDITOR=vim rails credentials:edit

里面:

production:
   secret_key_base: xxxxxxxxxxxxxxxxxxxxxxx

保存并在终端中:

RAILS_ENV=production rails c

我错过什么了吗?我已经重新启动了服务器,并得到了同样的问题,但在开发模式没有问题。

zlwx9yxi

zlwx9yxi1#

保留默认的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 5。2.0,添加到下面的生产环境中,检查此LINK

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

wecizke32#

Rails 5.2.0需要一个额外的阶段用于生产环境:

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

没有它,Rails仍然福尔斯到遗留的secret.yml机制(目前)。
引擎场的克里斯托弗Rigor has written a concise post on it。相关片段:

阅读凭证

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

config.require_master_key = true

一本好书也能看到上下两面。
注意:正如@TomDogg发现的,Rails 5。2.1似乎又不同了,所以这个答案可能只适用于5。2.0.

lztngnrs

lztngnrs3#

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个空格),因为如果不这样做,则会使该文件的加载默默失败。

5f0d552i

5f0d552i4#

凭据文件中没有production:development:test:环境标记。更多信息在此DHH的帖子:https://github.com/rails/rails/pull/30067
所以直接写

secret_key_base: xxxxxxxxxxxxxxxxxxxxxxx

请不要将主密钥与密钥库混淆。主密钥用于打开凭据加密文件。
切换回以前的秘密系统不应该是解决方案,也不是公认的答案。

z0qdvdin

z0qdvdin5#

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

这是我想到的解决办法。我真的不喜欢我被迫把它通过一个环境变量。如果有人有更多的信息,提请我注意如何掌握。关键等工作,请做评论。

0md85ypi

0md85ypi6#

我在使用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
xqk2d5yq

xqk2d5yq7#

避免将secret_key_base放在environment标签下。放在上面。
这是错误的:

production:
   secret_key_base: xxxxxxxxxxxxxxxxxxxxxxx
   some_other_key: xxx

试试这个:

secret_key_base: xxxxxxxxxxxxxxxxxxxxxxx
production:
   some_other_key: xxx
cpjpxq1n

cpjpxq1n8#

我在使用Rails 5时遇到了同样的问题。2在生产中的应用。
我已经安排好了其他事情。对我来说,问题不是secret_key_base没有正确设置,而是因为像下面这样将环境的名称作为常规参数传递是不推荐的

rails c RAILS_ENV=production

如果你仔细查看你的错误日志,你会看到:
降级警告:将环境的名称作为常规参数传递已被弃用,并将在下一个Rails版本中删除。请使用-e选项。(从bin/rails调用:9)
要在不同的环境中运行rails控制台,请使用-e选项,如下所示:

rails console -e production

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

就这样

希望这能帮上忙

相关问题