我在nginx.conf中需要一些帮助。 我需要从使用客户端证书身份validation的设备开始保护资源。 其他资源通过https,但不需要客户端证书。
我使用库在Ubuntu 16.04上安装了nginx。 然后我在/etc/nginx/conf.d/中创build一个名为dozee.conf的文件,并从服务器默认的Q&A( https://serverfault.com/a/721704/80340 )粘贴内容,并根据需要进行修改。
dozee.conf里面的configuration看起来像
server { listen *:443 ssl; server_name localhost; ssl on; ssl_certificate /etc/nginx/server.crt; ssl_certificate_key /etc/nginx/server.key; ssl_client_certificate /etc/nginx/ca.crt; ssl_verify_client on; location /device { proxy_pass http://localhost:8080/device; proxy_read_timeout 90; #proxy_redirect http://localhost/ $scheme://$host:$server_port/; } } server { listen *:443 ssl; ssl on; ssl_certificate /etc/nginx/server.crt; ssl_certificate_key /etc/nginx/server.key; ssl_client_certificate /etc/nginx/ca.crt; ssl_verify_client off; location / { proxy_pass http://localhost:8080/; proxy_read_timeout 90; #proxy_redirect http://localhost/ $scheme://$host:$server_port/; } }
我在这里面临的问题是,nginx的行为是由第二个服务器块主导。
如果我更改ssl_verify_client off; 在第二个服务器块到ssl_verify_client on; path/ & /device开始询问客户端证书。
如果我将ssl_verify_client保持为off ,则不需要客户端证书。
我在这里做错了什么?
您的第一个server块只匹配https://localhost/some/url类的请求。 所有其他请求由第二个server块处理。
但是,这可能是nginx不能用于你想要的用例。 当初始化TLS连接时,没有关于nginx的上层HTTP请求的信息来决定是否需要来自客户端的客户端证书。 它只能根据虚拟主机名信息做到这一点,在TLS连接设置中,通过SNI传递虚拟主机名信息。
在Apache中,可以根据URLpath强制进行TLS重新协商,其中Apache然后请求客户端证书。 我还没有在nginx中find类似的选项。
因此,您唯一的select与nginx可能是使用其他虚拟主机(例如devices.example.com)为您的设备。 这是答案在复制粘贴configuration的地方的实际解决scheme。