我正在尝试在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在&#34;用户&#34;中创建了两个用户。 / etc下的文件(用户名&#34; calvin&#34;密码&#34; Calvin&#34;和用户名&#34; hobbes&#34;密码&#34; Hobbes&#34;)。它的加密方式如下:
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版本。
答案 0 :(得分:30)
当您使用MD5时,不是您的问题的答案。但是,当搜索错误时弹出此线程,我将其附加到它。
使用bcrypt
生成auth_basic
的密码时会发生类似错误:
htpasswd -B <file> <user> <pass>
由于bcrypt
ATM中不支持auth_basic
,因此可以在nginx error.log中找到神秘的500错误(通常位于/var/log/nginx/error.log
),它们看起来像这样:< / p>
*1 crypt_r() failed (22: Invalid argument), ...
目前解决方案是使用md5生成一个新密码,无论如何都是默认密码。
md5 肯定存在问题,可以在以下主题中找到一些上下文
在这两者中,使用fail2ban可以减轻速度问题,通过禁止失败的基本身份验证,您将使在线暴力行为变得不切实际(guide)。您还可以使用长密码尝试按照建议here进行强化。
除此之外,它似乎与nginx一样好......
答案 1 :(得分:7)
最初创建用户时我已经搞砸了。因此,htpasswd文件看起来像:
user:
user:$apr1$passwdhashpasswdhashpasswdhash...
删除空白用户后,一切正常。
答案 2 :(得分:2)
我将自己将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;
,但第一个版本适用于我
答案 3 :(得分:2)
我在Docker环境中运行Nginx,遇到同样的问题。原因是某些密码是使用bcrypt生成的。我使用nginx:alpine
解决了这个问题。
答案 4 :(得分:1)
我遇到了同样的问题 - 按照@Drazen Urch建议检查日志后我发现该文件具有$('#btn').click(function () {
$.ajax({
type: "GET",
contentType: "application/json; charset=utf-8",
url: "http://x.x.x.x:xxxx/app/x/" + $("#xcoord").val() + '/y/' + $("#ycoord").val(),
dataType: "json",
success: function (data) {
alert(data);
}
});
});
权限 - 更改为root:root
后(我正在使用Forge with Digital海洋) - 问题消失了。
答案 5 :(得分:1)
在设置kibana身份验证时,我也面临着同样的问题。这是我的/var/log/nginx/error.log文件中的错误
2020/04/13 13:43:08 [crit] 49662#49662:* 152 crypt_r()失败(22: 参数无效),客户端:157.42.72.240,服务器:168.16.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并遇到此问题,可以参考这篇文章。
答案 6 :(得分:1)
是否要使用Nginx basic_auth进行更多安全的密码哈希处理?这样做:
echo "username:"$(mkpasswd -m sha-512) >> .htpasswd
SHA-512几乎不如bcrypt优秀,但它是目前nginx支持的最佳方式。
答案 7 :(得分:0)
好吧,只需使用正确的RFC 2307语法:
passwordvalue = schemeprefix encryptedpassword
schemeprefix = "{" scheme "}"
scheme = "crypt" / "md5" / "sha" / altscheme
altscheme = "x-" keystring
encryptedpassword = encrypted password
例如:helloworld
的{1}的sha1将是
* admin
我遇到了同样的错误,原因是我写了admin:{SHA}at+xg6SiyUovktq1redipHiJpaE=
违反RFC语法的内容。当我修复它时-一切都像魅力一样。 {SHA1}
也不起作用。仅正确{sha}
。
答案 8 :(得分:0)
首先,检查您的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 worker进程,我曾尝试chown www-data:www-data /root/temp
以确保www-data
可以访问此文件,但仍然无法正常工作。老实说,我对Linux文件权限没有很深入的了解,因此最终将其更改为/etc/apache2/
来解决此问题。经过测试后,您可以将.htpasswd
文件放在/etc
(例如/etc/nginx
)中的其他目录中。
答案 9 :(得分:0)
就我而言,我使用的是-p
标志的纯文本密码,巧合的是,我的密码以$
字符开头。
所以我更新了密码,因此错误消失了。
NB:其他人的回答对我找出问题有很大帮助。如果有人遇到像我这样的罕见情况,我会在这里发布我的解决方案。
答案 10 :(得分:0)
就我而言,我进行了auth_basic
设置,以保护由proxy_pass
配置提供服务的nginx位置。
配置的proxy_pass
位置未返回成功的HTTP200响应,这导致nginx在输入正确的用户名和密码后以内部服务器错误响应。
如果您使用类似的设置,请在排除用户名/密码问题之后,确保受proxy_pass
保护的auth_basic
位置返回HTTP200响应。