NGINX ssl上游验证失败

时间:2017-06-29 14:53:13

标签: ssl nginx proxypass

[UPDATE]

has been raised a a bug支持NGINX。

我使用了NGINX网站的默认配置文件(但没有双向身份验证),以便通过SSL在proxy_ssl_verify设置为on的情况下在四个上游应用服务器之间进行负载平衡。是的,所有上游服务器都具有CN匹配其主机名的有效证书,并且CA已被放置在具有适当权限的NGINX服务器上,并在nginx.conf文件中设置。以下是我的发现(删除了配置的其余部分,因为它不相关):

  1. 确定 - 适用于proxy_ssl_verify off

    stream {
          upstream upstream_appsrv{
              server serverA.domain.com:443;
          }
          server {
              listen     8443;
              proxy_pass https://upstream_appsrv;
                (...)
              proxy_ssl  off;
              proxy_ssl_verify off;
          }
    }
    
  2. 不行 - 只要我设置proxy_ssl_verify on + proxy_ssl on

    stream {
        upstream upstream_appsrv{
            server serverA.domain.com:443;
        }
        server {
            listen     8443;
            proxy_pass https://upstream_appsrv;
            (...)
            proxy_ssl  on;
            proxy_ssl_verify on;
        }
    }
    
  3. NGINX开始抛出与后端不匹配的上游SSL证书的错误:2 upstream SSL certificate does not match "serverB.domain.com" while SSL handshaking to upstream...让我们改变一些事情,然后转到第三步。

    1. OK! - 现在一切正常:

      stream {
              upstream serverA.domain.com{
                  server serverA.domain.com:443;
              }
              server {
                  listen     8443;
                  proxy_pass https://serverA.domain.com;
                  (...)
                  proxy_ssl  on;
                  proxy_ssl_verify on;
              }
      }
      
    2. 事实证明,不仅server定义必须与上游服务器上证书中使用的CN相匹配(显然),而且upstream upstream_appsrv需要匹配CN!好的,下一步,让我们添加另一个上游服务器:

      1. 不行......

        stream {
                upstream serverA.domain.com{
                    server serverB.domain.com:443;
                }
                server {
                    listen     8443;
                    proxy_pass https://serverA.domain.com;
                    (...)
                    proxy_ssl  on;
                    proxy_ssl_verify on;
                }
        }
        
      2. 一旦NGINX连接到serverB,我们就会再次看到相同的错误......即使serverB已经获得了与其主机名相匹配的正确CN集(并且使用与服务器A相同的CA),但事实证明NGINX尝试了将CN与upstream定义相匹配。这就是我要解决的问题。

0 个答案:

没有答案