尝试从 SSL 证书的主题获取非英语字符时,它会返回一个编码值

问题描述 投票:0回答:1

在 nginx 中,当尝试从客户端证书的主题获取非英语字符时,它会返回一个编码值。

我需要 nginx 中的实际值,以便我可以处理我的情况。

例如,如果在主题中我有一个值为 TÉST 并尝试检索该值,则它将返回为 T\C3\A9ST。

期望有一个解决方案能够在 nginx 本身中处理这种情况,而无需任何其他第三方与 nginx 集成。

nginx escaping encode client-certificates
1个回答
0
投票

请看我的回答这里

这是一篇很长的文章,但本质上,当 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 语句,但对于这个用例来说它非常适合。

© www.soinside.com 2019 - 2024. All rights reserved.