如何在NGINX中配置多CN的$ssl_client_s_dn检查及正则通配符
解决NGINX证书CN匹配问题
你的问题出在原有正则表达式的匹配逻辑上——你写的CN=\*\.lmback\.com是用来匹配CN值为*.lmback.com的通配符证书,但你的实际证书CN是具体的子域名(比如map.lmback.com),自然匹配失败。
修正后的配置
将正则表达式调整为匹配任意以.lmback.com结尾的CN,同时保留对LMProdusr的精确匹配:
location /api/1.0/alameda { set $ssl_client_s_dn "CN=map.lmback.com"; # 测试用,实际环境可注释 if ($ssl_client_s_dn !~ "(CN=[a-zA-Z0-9-]+\.lmback\.com|CN=LMProdusr)"){ return 403; } return 410; }
正则逻辑说明
CN=[a-zA-Z0-9-]+:匹配子域名部分,允许字母、数字和连字符,覆盖map、gustavo这类子域名\.lmback\.com:精确匹配域名后缀,转义.避免被正则当作任意字符处理|CN=LMProdusr:并列匹配精确的CN值LMProdusr
如果你的子域名包含除字母、数字、连字符外的其他字符,可把[a-zA-Z0-9-]+替换为.*?(非贪婪匹配任意字符),更灵活的写法如下:
if ($ssl_client_s_dn !~ "(CN=.*?\.lmback\.com|CN=LMProdusr)"){ return 403; }
验证建议
实际环境中可以去掉测试用的set $ssl_client_s_dn,让NGINX自动获取客户端证书的DN值进行校验。
内容的提问来源于stack exchange,提问作者Sergey Bakotin
相关产品推荐
相关产品推荐

