Authentication 在一台主机上具有多个客户端证书的Nginx

Authentication 在一台主机上具有多个客户端证书的Nginx,authentication,nginx,kubernetes,Authentication,Nginx,Kubernetes,我想使用nginx1.15.12作为tls终止和身份验证的代理。如果显示有效的客户端证书,nginx服务器将转发到相应的后端系统(在本例中为localhost:8080),当前配置会为每个请求转发该证书 遗憾的是,无法为每个位置{}块配置一个证书。可以创建多个服务器块,每个服务器块检查另一个证书,但我也要求只通过一个端口接收请求 nginx.conf:| 事件{ 辅助连接1024;##默认值:1024 } http{ #要移动到单独文件夹的密码文件? ssl\u password\u文件/etc

我想使用nginx1.15.12作为tls终止和身份验证的代理。如果显示有效的客户端证书,nginx服务器将转发到相应的后端系统(在本例中为localhost:8080),当前配置会为每个请求转发该证书

遗憾的是,无法为每个位置{}块配置一个证书。可以创建多个服务器块,每个服务器块检查另一个证书,但我也要求只通过一个端口接收请求

nginx.conf:|
事件{
辅助连接1024;##默认值:1024
}
http{
#要移动到单独文件夹的密码文件?
ssl\u password\u文件/etc/nginx/certs/global.pass;
服务器{
听8443;
ssl-on;
服务器名称*.blabla.domain.com;
错误\u日志stderr调试;
#服务器证书
ssl_certificate/etc/nginx/certs/server.crt;
ssl\u certificate\u key/etc/nginx/certs/server.key;
#共同TLS的CA证书
ssl_client_certificate/etc/nginx/certs/ca.crt;
代理ssl受信任证书/etc/nginx/certs/ca.crt;
#需要验证客户端证书(如果此标志是可选的,则不会
#验证客户端证书)
在客户端上验证ssl;
地点/{
#远程ip和转发ip
代理集头X-Real-IP$remote\u addr;
proxy\u set\u header X-Forwarded-For$proxy\u add\u X\u Forwarded\u For;
#证书验证信息
#如果客户端证书已根据CA验证,则标头已验证
#将具有“成功”和“无”的价值
代理\u设置\u头验证$ssl\u客户端\u验证;
#客户端证书信息(DN)
代理设置头DN$ssl\U客户端DN;
代理通行证http://localhost:8080/;
}
}
}
理想情况下,我希望实现这样的目标: (对除“/blabla”之外的任何路径“/”的请求都应使用cert1进行检查,如果“/blabla”匹配,则应使用另一个密钥检查客户端证书

nginx.conf:|
事件{
辅助连接1024;##默认值:1024
}
http{
#要移动到单独文件夹的密码文件?
ssl\u password\u文件/etc/nginx/certs/global.pass;
服务器{
听8443;
ssl-on;
服务器名称*.blabla.domain.com;
错误\u日志stderr调试;
#服务器证书
ssl_certificate/etc/nginx/certs/server.crt;
ssl\u certificate\u key/etc/nginx/certs/server.key;
#共同TLS的CA证书
ssl_client_certificate/etc/nginx/certs/ca.crt;
代理ssl受信任证书/etc/nginx/certs/ca.crt;
#需要验证客户端证书(如果此标志是可选的,则不会
#验证客户端证书)
在客户端上验证ssl;
地点/{
#远程ip和转发ip
代理集头X-Real-IP$remote\u addr;
proxy\u set\u header X-Forwarded-For$proxy\u add\u X\u Forwarded\u For;
#证书验证信息
#如果客户端证书已根据CA验证,则标头已验证
#将具有“成功”和“无”的价值
代理\u设置\u头验证$ssl\u客户端\u验证;
#客户端证书信息(DN)
代理设置头DN$ssl\U客户端DN;
代理通行证http://localhost:8080/;
}
位置/布拉布拉{
#基本上和上面一样,但是使用另一个ca.crt检查客户端证书。
}
}
}
Im位于kubernetes群集上,但出于各种原因,此处不选择使用Ingres auth机制。理想的结果是,可以为nginx中的同一服务器块配置不同的路径,并使用不同的证书

谢谢大家!

编辑: 以下nginx.conf可用于检查nginx中的不同证书。因此,需要使用不同的
服务器名称
两个独立的
服务器{}
块。现在只能通过blablabla-api.blablabla.domain.com访问URI/blablabla

events {
      worker_connections  1024;  ## Default: 1024
    }
    http{
      server_names_hash_bucket_size 128;
      server {
        listen 8443;
        ssl on;
        server_name *.blabla.domain.com;
        error_log stderr debug;
        # password file (passphrase) for secret keys
        ssl_password_file /etc/nginx/certs/global.pass;
        # server certificate
        ssl_certificate     /etc/nginx/certs/server.crt;
        ssl_certificate_key /etc/nginx/certs/server.key;
        # CA certificate for mutual TLS
        ssl_client_certificate /etc/nginx/certs/ca.crt;
        proxy_ssl_trusted_certificate /etc/nginx/certs/ca.crt;
        # need to validate client certificate(if this flag optional it won't
        # validate client certificates)
        ssl_verify_client on;

        location / {
          # remote ip and forwarding ip
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          # certificate verification information
          # if the client certificate verified against CA, the header VERIFIED
          # will have the value of 'SUCCESS' and 'NONE' otherwise
          proxy_set_header VERIFIED $ssl_client_verify;
          # client certificate information(DN)
          proxy_set_header DN $ssl_client_s_dn;
          proxy_pass http://localhost:8080/;
        }
        location /blabla {
          return 403 "authorized user is not allowed to access /blabla";
        }

      }
      server {
        listen 8443;
        ssl on;
        server_name blabla-api.blabla.domain.com;
        error_log stderr debug;
        # password file (passphrase) for secret keys
        ssl_password_file /etc/nginx/certs/global-support.pass;
        # server certificate
        ssl_certificate     /etc/nginx/certs/server-support.crt;
        ssl_certificate_key /etc/nginx/certs/server-support.key;
        # CA certificate for mutual TLS
        ssl_client_certificate /etc/nginx/certs/ca-support.crt;
        proxy_ssl_trusted_certificate /etc/nginx/certs/ca-support.crt;
        # need to validate client certificate(if this flag optional it won't
        # validate client certificates)
        ssl_verify_client on;

        location /blabla {
          # remote ip and forwarding ip
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          # certificate verification information
          # if the client certificate verified against CA, the header VERIFIED
          # will have the value of 'SUCCESS' and 'NONE' otherwise
          proxy_set_header VERIFIED $ssl_client_verify;
          # client certificate information(DN)
          proxy_set_header DN $ssl_client_s_dn;
          proxy_pass http://localhost:8080/blabla;
        }
      }
    }
我想SNI就是答案。 在ssl握手中,具有一个IP和一个端口的服务器可以提供多个端口

但据我所知,这两台服务器的
server\u name
属性必须不同。不确定顶级域和二级域是否需要此属性,或者您是否可以简单地使用路径

SNI扩展了TLS的握手协议。通过这种方式,在ssl握手过程中建立连接之前,服务器可以知道使用什么

较新的nginx版本默认应启用SNI。可选中:
nginx-V


看看如何构造nginx.conf

谢谢,这已经解决了,使用多个“服务器名称”属性,nginx根据请求的域名选择相应的证书。服务器名称指示(SNI)解决得很好。我的问题随着解决方案的配置而更新。@LeonG如果我们想要一个IP地址,并且想要基于路径提供多个证书,该怎么办?没有可用的域。一个负载平衡器IP是入口点。用例是一个服务后端TLS传递,其他终止是需要的奎德,你能给我引路吗?