【问题标题】:Nginx gives an Internal Server Error 500 after I have configured basic auth配置基本身份验证后,Nginx 给出内部服务器错误 500
【发布时间】:2015-08-05 13:12:28
【问题描述】:

我正在尝试在 Nginx 上进行基本身份验证。我已经在 Ubuntu 14.04 上启动并运行了 1.9.3 版本,它适用于一个简单的 html 文件。

这是html文件:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title></title>
</head>
<body>
  "Some shoddy text"
</body>
</html>

这是我的 nginx.conf 文件:

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
    server {
        listen 80;
        server_name 192.168.1.30;
        location / {
            root /www;
            index index.html;
            auth_basic "Restricted";
            auth_basic_user_file /etc/users;
        }
    }
}

我使用 htpasswd 在 /etc 下的“users”文件中创建了两个用户(用户名“calvin”密码“Calvin”,用户名“hobbes”密码“Hobbes”)。它的加密方式如下所示:

calvin:$apr1$Q8LGMfGw$RbO.cG4R1riIfERU/175q0
hobbes:$apr1$M9KoUUhh$ayGd8bqqlN989ghWdTP4r/

所有文件都属于 root:root。服务器 IP 地址是 192.168.1.30,我直接在 conf 文件中引用它。

如果我注释掉两个 auth 行并重新启动 nginx,一切正常,但是如果我取消注释它们,那么当我尝试加载站点时确实会收到用户名和密码提示,但随后会立即收到错误 500内部服务器错误似乎持续存在,我必须重新启动 nginx。

任何人都可以看到我在这里做错了什么?我在标准的 Ubuntu 14.04 apt-get 版本的 Nginx (1.4.something) 上有相同的行为,所以我不认为它是 nginx 版本。

【问题讨论】:

    标签: nginx


    【解决方案1】:

    由于您使用的是 MD5,因此无法真正回答您的问题。但是,当搜索错误时弹出此线程,我将其附加到它。

    使用bcryptauth_basic 生成密码时会发生类似错误:

    htpasswd -B <file> <user> <pass>
    

    由于auth_basic ATM 不支持bcrypt,可以在nginx error.log 中找到神秘的500 错误(通常在/var/log/nginx/error.log 找到),它们看起来像这样:

    *1 crypt_r() failed (22: Invalid argument), ...

    目前的解决方案是使用md5生成新密码,反正是默认的。

    编辑以解决 @EricWolf 在 cmets 中提出的 md5 问题:

    md5肯定有问题,可以在以下线程中找到一些上下文

    在这两者中,速度问题可以通过使用 fail2ban 来缓解,通过禁止失败的基本身份验证,您将使在线暴力破解变得不切实际 (guide)。您也可以按照here 的建议使用长密码来尝试加强一点。

    除此之外,它似乎与 nginx 一样好......

    【讨论】:

    • OP 的 htpasswd 文件包含 $apr1$ 这是 Apache 的 MD5。如果他们使用 bcrypt,它将包含$2y$。见httpd.apache.org/docs/2.4/misc/password_encryptions.html
    • 这是一个有价值的答案。有问题。不使用 bcrypt 进行基本身份验证解决了这个问题。
    • 这个答案不太正确。 nginx 推迟对 crypt_r 的支持,它是 libc 的一部分。如果操作系统附带的 libc 版本不支持 bcrypt,那么您将看到此错误消息。
    • @DrazenUrch 这正是错误消息所说的。 crypt_r 是一个 libc 函数。 This 直接来自 nginx 开发者。我不熟悉 htpasswd 的代码库,但可以安全地假设它使用其他东西,可能由 apr 提供。
    • md5 确实不是一个好主意,但幸运的是 nginx 支持库所做的任何事情,因此您可以使用 sha-512 (mkpasswd -m sha-512) 作为不支持的 bcrypt、scrypt 或其他的安全替代方案。
    【解决方案2】:

    您想使用 nginx basic_auth 获得更安全的密码哈希吗?这样做:

    echo "username:"$(mkpasswd -m sha-512) >> .htpasswd
    

    SHA-512 被认为不如 bcrypt,但它是目前 nginx 支持的最好的。

    【讨论】:

    • 只需htpasswd -5 将为您生成。
    • htpasswd: 非法选项 -- 5
    • 有趣,必须是特定于版本的。
    【解决方案3】:

    我在 Docker 环境中运行 Nginx,遇到了同样的问题。原因是某些密码是使用 bcrypt 生成的。我通过使用nginx:alpine 解决了它。

    【讨论】:

    • 可以确认使用 alpine 风格允许 bcrypt 密码
    【解决方案4】:

    在为 kibana 设置身份验证时,我也遇到了同样的问题。这是我的 /var/log/nginx/error.log 文件中的错误

    2020/04/13 13:43:08 [暴击] 49662#49662: *152 crypt_r() 失败 (22: 无效参数),客户端:157.42.72.240,服务器:168.61.168.150, 请求:“GET / HTTP/1.1”,主机:“168.61.168.150”

    我通过添加身份验证解决了这个问题。

    sudo sh -c "echo -n 'kibanaadmin:' >> /etc/nginx/htpasswd.users"
    sudo sh -c "openssl passwd -apr1 >> /etc/nginx/htpasswd.users"
    

    如果您尝试设置 kibana 并遇到此问题,可以参考这篇文章。

    https://medium.com/@shubham.singh98/log-monitoring-with-elk-stack-c5de72f0a822?postPublishedType=repub

    【讨论】:

      【解决方案5】:

      我在最初创建用户时搞砸了。结果,htpasswd 文件看起来像:

      user:
      user:$apr1$passwdhashpasswdhashpasswdhash...
      

      删除空白用户后,一切正常。

      【讨论】:

      • 我遇到了完全相同的问题!我希望错误消息更具描述性。
      【解决方案6】:

      首先,查看您的 nginx 错误日志:

      tail -f /var/log/nginx/error.log
      

      就我而言,我发现了错误:

      [crit] 18901#18901: *6847 open() "/root/temp/.htpasswd" failed (13: Permission denied),
      

      /root/temp 目录是我的测试目录之一,无法被 nginx 读取。将其更改为/etc/apache2/(按照官方指南https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-http-basic-authentication/)后一切正常。

      ===

      执行ps命令后,我们可以看到用户www-data维护的nginx工作进程,我尝试chown www-data:www-data /root/temp确保www-data可以访问这个文件,但它仍然无法正常工作。说实话,我对 Linux File Permissions 的理解不是很深,所以最后改成/etc/apache2/ 来解决这个问题。并且经过测试,您可以将.htpasswd文件放到/etc的其他目录中(如/etc/nginx)。

      【讨论】:

        【解决方案7】:

        我将自己将 htpassword 文件粘贴在“/etc/nginx”下。 假设它被命名为htcontrol,那么...

        sudo htpasswd -c /etc/nginx/htcontrol calvin

        按照提示输入密码,文件将位于正确的位置。

        location / {
            ...
        
            auth_basic "Restricted";
            auth_basic_user_file htcontrol;
        }
        

        auth_basic_user_file /etc/nginx/htcontrol;,但第一个变体对我有用

        【讨论】:

          【解决方案8】:

          我只是遇到了同样的问题-在检查@Drazen Urch 建议的日志后,我发现该文件具有root:root 权限-在更改为forge:forge 之后(我正在使用 Forge 和 Digital Ocean)-问题消失了。

          【讨论】:

            【解决方案9】:

            好吧,只要使用正确的RFC 2307 语法:

            passwordvalue          = schemeprefix encryptedpassword
            schemeprefix           = "{" scheme "}"
            scheme                 = "crypt" / "md5" / "sha" / altscheme
            altscheme              = "x-" keystring
            encryptedpassword      = encrypted password
            

            例如:helloworldadmin 的 sha1 将是

            • admin:{SHA}at+xg6SiyUovktq1redipHiJpaE=

            我有同样的错误,因为我写了 {SHA1} 什么反对 RFC 语法。当我修复它时 - 一切都像魅力一样。 {sha} 也不起作用。只正确{SHA}

            【讨论】:

              【解决方案10】:

              在我的例子中,我使用-p标志的纯文本密码,巧合的是我的密码以$字符开头。 所以我更新了我的密码,因此错误消失了。

              注意:其他人的回答帮助我解决了我的问题。如果有人遇到像我这样的罕见情况,我会在这里发布我的解决方案。

              【讨论】:

                【解决方案11】:

                就我而言,我的auth_basic 设置保护了一个由proxy_pass 配置提供服务的nginx 位置。

                配置的proxy_pass 位置没有返回成功的 HTTP200 响应,这导致我输入正确的用户名和密码后 nginx 响应内部服务器错误。

                如果您有类似的设置,请确保在排除用户名/密码问题后,受 auth_basic 保护的 proxy_pass 位置返回 HTTP200 响应。

                【讨论】:

                  猜你喜欢
                  • 2016-09-05
                  • 1970-01-01
                  • 2020-10-23
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-12-28
                  • 2015-03-09
                  • 1970-01-01
                  相关资源
                  最近更新 更多