具有多个客户端证书的nginx客户端身份验证

时间:2018-02-22 21:18:08

标签: ssl nginx

我正在尝试设置NGINX来对多个客户端执行客户端身份验证。我遇到的问题是那些客户端将拥有不同的证书,基本上是不同的根CA:

[clientA.crt] ClientA > IntermediateA > RootA
[clientB.crt] ClientB > IntermediateB1 > IntermediateB2 > RootB

我查看了NGINX文档,并注意到了ssl_client_certificate指令。但是,单独该属性本身似乎不起作用,例如,如果我现在将其配置为仅为clientA工作:

ssl_client_certificate /etc/nginx/ssl/clientA.crt;   
ssl_verify_client on;

然后我收到了400错误代码。通过查看其他问题,我发现我还必须使用ssl_verify_depth: 3。因此,如果我想在捆绑PEM中连接clientA和clientB以允许两个客户端,我是否需要使用高值?该指令的目的是什么?使用捆绑的PEM设置为高数字的含义是什么?

1 个答案:

答案 0 :(得分:5)

http://nginx.org/r/ssl_client_certificate指令用于指定您信任哪些证书进行基于客户端的身份验证。请注意,每次尝试连接时基本上都会发送整个列表(如果不需要,请按照文档使用ssl_trusted_certificate。)

如上所述,请注意ssl_verify_depth基本上控制了进入系统的容易程度 - 如果将其设置为足够高的值,并且有人能够获得一个证书您信任的CA,或通过他们信任的中介机构生成自己的证书,然后他们就能够使用您的nginx进行身份验证,无论这是否是您的愿望。

因此,通常情况下,用于基于客户端的身份验证的所有证书都是由私人认可的CA生成的,因此,通常,链的长度不应太长。如果要平衡两个CA之间的深度编号,为了获得ssl_verify_depth的最佳保护,那么可以设想创建一个额外的CA来添加深度,然后将CA添加到可信列表而不是现在的CA一个实际的中介。 (请注意,一旦涉及一些中介,它会变得复杂,浏览器需要知道它们的存在,这通常是缓存的,并且在非缓存时可能导致许多鬼问题。)

另外,请注意,您实际上不必在指定文件中包含单个CA - 它可以包含多个不相关的“根”CA,因此,如果您要添加多个独立CA,则实际上并不打扰创建另一个CA来证明它们 - 你可以按原样包括这样的独立CA.