Docker-registry v2 with tls and basic auth behind nginx authentication error
Docker-registry v2 with tls and basic auth behind nginx authentication error
简而言之:我无法从外部(我的本地计算机 运行 MAC) 使用 my.domain.ch 名称。
我可以从ubuntu机器(vm-2)运行注册表成功登录'docker login http://localhost:5000'
这是我的设置:
vm-1:nginx/1.10.1 在 Ubuntu 14.04 上作为反向代理(此处未安装 docker):
upstream registry {
server vm-2:5000 fail_timeout=5s;
}
server {
listen 80;
server_name my.domain.ch; # server_name ;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name my.domain.ch; # server_name ;
charset utf-8;
keepalive_timeout 5;
add_header Docker-Distribution-Api-Version registry/2.0 always;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
ssl_ecdh_curve secp521r1;
ssl_protocols TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCMSHA384:ECDHE-ECDSA-AES256-SHA384:EC$
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-Original-URI $request_uri;
proxy_set_header Docker-Distribution-Api-Version registry/2.0;
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 900;
location / {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/htpasswd;
proxy_pass https://registry;
}
}
vm-2 docker-registry on Ubuntu 14.04 作为注册表主机。
Docker version 1.12.1, build 23cf638
docker-compose version 1.7.0, build 0d7bf73
docker-registry version 2.5.1
这些是
- /opt/docker-registry/auth (htaccess)
- /opt/docker-registry/certs(密钥和证书)
- /opt/docker-registry/data(空)
- /opt/docker-registry/docker-compose.yml
docker-compose.yml 看起来像这样:
registry:
restart: always
image: registry:2
ports:
- 5000:5000
environment:
REGISTRY_HTTP_TLS_CERTIFICATE: /certs/cert.pem
REGISTRY_HTTP_TLS_KEY: /certs/key.pem
REGISTRY_AUTH: "htpasswd"
REGISTRY_AUTH_HTPASSWD_REALM: basic-realm
REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
REGISTRY_LOG_LEVEL: "debug"
volumes:
- /opt/docker_registry/data:/var/lib/registry
- /opt/docker_registry/certs:/certs
- /opt/docker_registry/auth:/auth
来自我的 MAC 我尝试
docker login https://my.domain.ch
Username: MyUserName
Password:
Error response from daemon: login attempt to https://my.domain.ch/v2/ failed with status: 401 Unauthorized
我的研究告诉我:
David Daeschler 写道 docker 仅支持 bcrypt 的基本身份验证。 (我尝试使用 apache-md5,md5 和 crypt 都不起作用)。所以我按照建议将 bcrypt 用于我的 htacces。
我的docker-注册表:
registry_1 | time="2016-09-22T10:01:00.809076941Z" level=debug msg="authorizing request" go.version=go1.6.3 http.request.host=mydomain.ch http.request.id=f1b0ccda-2d03-4480-aaf8-b7248acaed5f http.request.method=GET http.request.remoteaddr=xxx.xxx.xxx.127 http.request.uri="/v2/" http.request.useragent="docker/1.12.1 go/go1.6.3 git-commit/23cf638 kernel/4.4.20-moby os/linux arch/amd64 UpstreamClient(Docker-Client/1.12.1 \(darwin\))" instance.id=59b4a38a-307e-446d-9f8a-3618c35bb6bb service=registry version=v2.5.1
registry_1 | time="2016-09-22T10:01:00.811894104Z" level=error msg="error authenticating user \"MyUserName\": authentication failure" go.version=go1.6.3 http.request.host=my.domain.ch http.request.id=f1b0ccda-2d03-4480-aaf8-b7248acaed5f http.request.method=GET http.request.remoteaddr=xxx.xxx.xxx.127 http.request.uri="/v2/" http.request.useragent="docker/1.12.1 go/go1.6.3 git-commit/23cf638 kernel/4.4.20-moby os/linux arch/amd64 UpstreamClient(Docker-Client/1.12.1 \(darwin\))" instance.id=59b4a38a-307e-446d-9f8a-3618c35bb6bb service=registry version=v2.5.1
registry_1 | time="2016-09-22T10:01:00.812631504Z" level=warning msg="error authorizing context: basic authentication challenge for realm \"basic-realm\": authentication failure" go.version=go1.6.3 http.request.host=my.domain.ch http.request.id=f1b0ccda-2d03-4480-aaf8-b7248acaed5f http.request.method=GET http.request.remoteaddr=83.xxx.xxx.127 http.request.uri="/v2/" http.request.useragent="docker/1.12.1 go/go1.6.3 git-commit/23cf638 kernel/4.4.20-moby os/linux arch/amd64 UpstreamClient(Docker-Client/1.12.1 \(darwin\))" instance.id=59b4a38a-307e-446d-9f8a-3618c35bb6bb service=registry version=v2.5.1
registry_1 | xxx.xxx.xxx.11 - - [22/Sep/2016:10:01:00 +0000] "GET /v2/ HTTP/1.0" 401 87 "" "docker/1.12.1 go/go1.6.3 git-commit/23cf638 kernel/4.4.20-moby os/linux arch/amd64 UpstreamClient(Docker-Client/1.12.1 \(darwin\))"
nginx 日志:
2016/09/22 09:14:34 [crit] 13318#0: *8 crypt_r() failed (22: Invalid argument), client: xxx.xxx.xxx.127, server: my.domain.ch, request: "GET /v2/ HTTP/1.1", host: "my.domain.ch"
此答案 from a Docker.com guy 涵盖了此错误 的 原因。 (简而言之:向下搜索表明这取决于 debian 附带的 gcc 版本。)
我从日志和错误中知道的是:
- 已正确转发请求
- 端口已打开并接受请求
- TLS 有效且证书正确 - 它使用 api
的 v2
- 必须与 htaccess 有关
- 一定是nginx的问题。因此在本地有效
如何让nginx理解bcrypt?
或者是其他地方的错误?
感谢您的帮助
Swiggels
编辑:
Found this 来自 docker.com 人:
I'm not sure if this will help, but we've become tired of dealing with nginx's edge cases for new users, so registry 2.1 will come with htpasswd based basic auth support.
从使用 docker-registry v2.5.1 基本身份验证开始。
我在 vm-1 上安装了 sudo apt-get install apache2-utils
。我认为它可能会带来 bcrypt。它没有用。
显式安装 bcrypt 时 (sudo apt-get install bcrypt
) 我得到 bcrypt is already the newest version.
按照建议添加 sudo apt-get install libgmp3-dev
也没有效果。
如所述here auth_basic(nginx 的?还是一般的基本身份验证?)不支持 bcrypt。但是 docker-registry 允许的唯一加密是 bcrypt 用于 htaccess 密码。
已发现 read here nginx 无法处理 bcrypt 密码哈希。
nginx 1.10.1 后面不可能有 docker-registry v2.5.1 吗?
我仍然不知道如何解决我的问题。因此我得到了一个解决方法:我将防火墙配置为将端口直接转发到运行宁注册表的机器。所以我可以使用域名从外部连接到我的注册表。
如果有人知道如何使用 nginx 运行,我将不胜感激。
简而言之:我无法从外部(我的本地计算机 运行 MAC) 使用 my.domain.ch 名称。
我可以从ubuntu机器(vm-2)运行注册表成功登录'docker login http://localhost:5000'
这是我的设置:
vm-1:nginx/1.10.1 在 Ubuntu 14.04 上作为反向代理(此处未安装 docker):
upstream registry {
server vm-2:5000 fail_timeout=5s;
}
server {
listen 80;
server_name my.domain.ch; # server_name ;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name my.domain.ch; # server_name ;
charset utf-8;
keepalive_timeout 5;
add_header Docker-Distribution-Api-Version registry/2.0 always;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
ssl_ecdh_curve secp521r1;
ssl_protocols TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCMSHA384:ECDHE-ECDSA-AES256-SHA384:EC$
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-Original-URI $request_uri;
proxy_set_header Docker-Distribution-Api-Version registry/2.0;
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 900;
location / {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/htpasswd;
proxy_pass https://registry;
}
}
vm-2 docker-registry on Ubuntu 14.04 作为注册表主机。
Docker version 1.12.1, build 23cf638
docker-compose version 1.7.0, build 0d7bf73
docker-registry version 2.5.1
这些是
- /opt/docker-registry/auth (htaccess)
- /opt/docker-registry/certs(密钥和证书)
- /opt/docker-registry/data(空)
- /opt/docker-registry/docker-compose.yml
docker-compose.yml 看起来像这样:
registry:
restart: always
image: registry:2
ports:
- 5000:5000
environment:
REGISTRY_HTTP_TLS_CERTIFICATE: /certs/cert.pem
REGISTRY_HTTP_TLS_KEY: /certs/key.pem
REGISTRY_AUTH: "htpasswd"
REGISTRY_AUTH_HTPASSWD_REALM: basic-realm
REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
REGISTRY_LOG_LEVEL: "debug"
volumes:
- /opt/docker_registry/data:/var/lib/registry
- /opt/docker_registry/certs:/certs
- /opt/docker_registry/auth:/auth
来自我的 MAC 我尝试
docker login https://my.domain.ch
Username: MyUserName
Password:
Error response from daemon: login attempt to https://my.domain.ch/v2/ failed with status: 401 Unauthorized
我的研究告诉我:
David Daeschler 写道 docker 仅支持 bcrypt 的基本身份验证。 (我尝试使用 apache-md5,md5 和 crypt 都不起作用)。所以我按照建议将 bcrypt 用于我的 htacces。
我的docker-注册表:
registry_1 | time="2016-09-22T10:01:00.809076941Z" level=debug msg="authorizing request" go.version=go1.6.3 http.request.host=mydomain.ch http.request.id=f1b0ccda-2d03-4480-aaf8-b7248acaed5f http.request.method=GET http.request.remoteaddr=xxx.xxx.xxx.127 http.request.uri="/v2/" http.request.useragent="docker/1.12.1 go/go1.6.3 git-commit/23cf638 kernel/4.4.20-moby os/linux arch/amd64 UpstreamClient(Docker-Client/1.12.1 \(darwin\))" instance.id=59b4a38a-307e-446d-9f8a-3618c35bb6bb service=registry version=v2.5.1
registry_1 | time="2016-09-22T10:01:00.811894104Z" level=error msg="error authenticating user \"MyUserName\": authentication failure" go.version=go1.6.3 http.request.host=my.domain.ch http.request.id=f1b0ccda-2d03-4480-aaf8-b7248acaed5f http.request.method=GET http.request.remoteaddr=xxx.xxx.xxx.127 http.request.uri="/v2/" http.request.useragent="docker/1.12.1 go/go1.6.3 git-commit/23cf638 kernel/4.4.20-moby os/linux arch/amd64 UpstreamClient(Docker-Client/1.12.1 \(darwin\))" instance.id=59b4a38a-307e-446d-9f8a-3618c35bb6bb service=registry version=v2.5.1
registry_1 | time="2016-09-22T10:01:00.812631504Z" level=warning msg="error authorizing context: basic authentication challenge for realm \"basic-realm\": authentication failure" go.version=go1.6.3 http.request.host=my.domain.ch http.request.id=f1b0ccda-2d03-4480-aaf8-b7248acaed5f http.request.method=GET http.request.remoteaddr=83.xxx.xxx.127 http.request.uri="/v2/" http.request.useragent="docker/1.12.1 go/go1.6.3 git-commit/23cf638 kernel/4.4.20-moby os/linux arch/amd64 UpstreamClient(Docker-Client/1.12.1 \(darwin\))" instance.id=59b4a38a-307e-446d-9f8a-3618c35bb6bb service=registry version=v2.5.1
registry_1 | xxx.xxx.xxx.11 - - [22/Sep/2016:10:01:00 +0000] "GET /v2/ HTTP/1.0" 401 87 "" "docker/1.12.1 go/go1.6.3 git-commit/23cf638 kernel/4.4.20-moby os/linux arch/amd64 UpstreamClient(Docker-Client/1.12.1 \(darwin\))"
nginx 日志:
2016/09/22 09:14:34 [crit] 13318#0: *8 crypt_r() failed (22: Invalid argument), client: xxx.xxx.xxx.127, server: my.domain.ch, request: "GET /v2/ HTTP/1.1", host: "my.domain.ch"
此答案 from a Docker.com guy 涵盖了此错误 的 原因。 (简而言之:向下搜索表明这取决于 debian 附带的 gcc 版本。)
我从日志和错误中知道的是:
- 已正确转发请求
- 端口已打开并接受请求
- TLS 有效且证书正确 - 它使用 api 的 v2
- 必须与 htaccess 有关
- 一定是nginx的问题。因此在本地有效
如何让nginx理解bcrypt? 或者是其他地方的错误?
感谢您的帮助 Swiggels
编辑:
Found this 来自 docker.com 人:
I'm not sure if this will help, but we've become tired of dealing with nginx's edge cases for new users, so registry 2.1 will come with htpasswd based basic auth support.
从使用 docker-registry v2.5.1 基本身份验证开始。
我在 vm-1 上安装了 sudo apt-get install apache2-utils
。我认为它可能会带来 bcrypt。它没有用。
显式安装 bcrypt 时 (sudo apt-get install bcrypt
) 我得到 bcrypt is already the newest version.
按照建议添加 sudo apt-get install libgmp3-dev
如所述here auth_basic(nginx 的?还是一般的基本身份验证?)不支持 bcrypt。但是 docker-registry 允许的唯一加密是 bcrypt 用于 htaccess 密码。
已发现 read here nginx 无法处理 bcrypt 密码哈希。
nginx 1.10.1 后面不可能有 docker-registry v2.5.1 吗?
我仍然不知道如何解决我的问题。因此我得到了一个解决方法:我将防火墙配置为将端口直接转发到运行宁注册表的机器。所以我可以使用域名从外部连接到我的注册表。
如果有人知道如何使用 nginx 运行,我将不胜感激。