在 nginx 中,当尝试从客户端证书的主题获取非英语字符时,它会返回一个编码值。
我需要 nginx 中的实际值,以便我可以处理我的情况。
例如,如果在主题中我有一个值为 TÉST 并尝试检索该值,则它将返回为 T\C3\A9ST。
期望有一个解决方案能够在 nginx 本身中处理这种情况,而无需任何其他第三方与 nginx 集成。
请看我的回答这里
这是一篇很长的文章,但本质上,当 Nginx 读取证书主题 DN 并将值分配给 $ssl_client_s_dn 时,如果存在“非英语”字符(Ascii > 127,或证书可分辨名称中允许的其他格式),那么它将从提交给 Nginx 的客户端证书中读取。
虽然缺少实现的细节,但至少您提到Nginx应该在进一步处理之前验证正确的主题DN(将请求传递给上游,或者当App && Nginx位于同一服务器上时在内部)。
在这种情况下,应该有一份可接受的主题 DN 的简短列表,并且可以对这些进行映射。请注意,映射中没有任何正则表达式键...如果有必要,请努力将大量正则表达式键减少为少数但可读的实例。
这里是根据给定示例验证证书主题 DN 的示例代码,然后针对不需要的客户端证书实施 403。
#in http {} block
map $ssl_client_s_dn $reject_client_cert {
"T\C3\89ST" 0; #allow "TÉST"
"R\C3\A4ksm\C3\B6rg\C3\A5s" 0; #allow "Räksmörgås"
default 1; #else reject
}
#in server {} block before location {} blocks for better reading:
if ($reject_client_cert) {
#set $append_log 'loc=reject s_dn=$ssl_client_s_dn'; custom logging could to be set up to provide useful stats on rejects
return 403; #you may provide a custom error code/page if desired
}
注意:我不喜欢 Nginx 配置中的 IF 语句,但对于这个用例来说它非常适合。