Authentication 在一台主机上具有多个客户端证书的Nginx
我想使用nginx1.15.12作为tls终止和身份验证的代理。如果显示有效的客户端证书,nginx服务器将转发到相应的后端系统(在本例中为localhost:8080),当前配置会为每个请求转发该证书 遗憾的是,无法为每个位置{}块配置一个证书。可以创建多个服务器块,每个服务器块检查另一个证书,但我也要求只通过一个端口接收请求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
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传递,其他终止是需要的奎德,你能给我引路吗?