【问题标题】:Client Certificate Authentication Nginx SSL Pass Through客户端证书认证 Nginx SSL 直通
【发布时间】:2019-07-04 04:52:07
【问题描述】:

我在 docker 注册表之前设置了 NGINX 作为代理。注册表使用 tls 对用户进行身份验证(并且配置正确;我可以使用证书在集群内拉取图像)。 nginx是这样配置的:

 server {
      listen 443;
      server_name default_server;

      #charset koi8-r;
      #access_log  /var/log/nginx/host.access.log  main;

      location / {
        if ($remote_addr != xxx) {
          return 403;
          break;
        }
        proxy_set_header Host $host; 
        proxy_pass https://xxx:xxx;
        break;
      }

      error_page  404              /404.html;  
      error_page   500 502 503 504  /50x.html;
      location = /50x.html {
        root   /usr/share/nginx/html;
      }
    }

现在,当我尝试使用这样的有效证书进行卷曲时:

curl -v --key client.key --cert client.cert  xxx:xxx/v2/_catalog

我在 docker 注册表日志中收到 http: TLS handshake error from xxx:xxx: tls: client didn't provide a certificate 错误。 nginx 配置正确还是缺少某些东西?关于如何进一步调试的任何想法?

NGINX 日志状态:

[error] 8#8: *65 SSL_do_handshake() failed (SSL: error:14094412:SSL routines:ssl3_read_bytes:sslv3 alert bad certificate:SSL alert number 42) while SSL handshaking to upstream,

【问题讨论】:

  • 你在哪里卷曲?同一个nginx服务器?
  • 我的本地电脑
  • 试试看:curl -v --key client.key --cert client.cert xxx:443/v2/_catalog
  • 这个有效:curl -v -k --key client.key --cert client.cert docker-registry-ip:port/v2/_catalog 这个无效:curl -v -k --key client.key --cert client.cert https://localhost:443/v2/_catalog 导致SSL routines:ssl3_get_record:wrong version number
  • 更改 server_name 本地主机;证书应该归你用来卷曲的域(localhost 或 xxx 域)所有,然后再次卷曲

标签: docker nginx tls1.2 docker-registry nginx-reverse-proxy


【解决方案1】:

终于找到了解决办法。直通功能仅嵌入在流指令中(它本身必须包含在 http 指令之外)。所以最后它非常简单干净:

stream {
  server {
    listen 443;
    allow <IP_TO_BE_ALLOWED>;
    deny all;
    proxy_pass xxx:xxx;
  }
}

【讨论】:

    猜你喜欢
    • 2013-08-04
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 2017-06-08
    • 2015-09-06
    • 2010-10-16
    • 2017-04-28
    • 2012-02-15
    相关资源
    最近更新 更多