能否在IIS/http.sys及浏览器端基于EKU过滤客户端证书?
利用EKU过滤客户端证书的实现方法
核心结论
可以通过EKU信息过滤客户端证书,只允许具备**客户端认证EKU(OID: 1.3.6.1.5.5.7.3.2)**或无任何EKU的证书参与TLS握手。
一、TLS握手阶段的OID Filter配置
在TLS的CertificateRequest消息中设置OID过滤器,本质是指定服务端接受的EKU OID列表,同时需允许无EKU的证书(适配部分无扩展字段的旧证书)。
配置逻辑
- 明确指定客户端认证EKU的OID:
1.3.6.1.5.5.7.3.2 - 开启允许无EKU证书的开关(不同服务器软件参数名不同,比如开源服务端常用
allow_unrestricted或permit_no_eku类参数)
OpenSSL示例配置
如果用OpenSSL搭建服务端,可在配置文件中添加:
[ssl_server] ssl_certificate = server.crt ssl_certificate_key = server.key verify_client = require # 指定接受的客户端认证EKU ssl_verify_eku = 1.3.6.1.5.5.7.3.2 # 允许无EKU的证书 ssl_verify_allow_no_eku = on
配置生效后,服务端会在CertificateRequest中携带指定OID过滤器,浏览器仅弹出符合条件的证书供选择。
二、IIS/http.sys的简便配置方式
IIS基于http.sys实现客户端证书验证,无需手动编辑底层TLS参数,可通过图形界面或PowerShell快速配置:
方法1:IIS管理器图形界面
- 打开IIS管理器,选中目标网站,双击SSL设置
- 勾选要求SSL和要求客户端证书
- 点击右侧高级设置,将客户端证书选项设为接受
- 打开服务器证书功能,点击右侧配置客户端证书映射,选择多对多映射
- 添加两条映射规则:
- 规则1:条件类型选扩展密钥用法,操作选包含,值填写
1.3.6.1.5.5.7.3.2 - 规则2:条件类型选扩展密钥用法,操作选不存在
- 规则1:条件类型选扩展密钥用法,操作选包含,值填写
- 保存配置后,仅符合条件的证书可通过验证。
方法2:PowerShell命令
使用Set-WebConfiguration配置EKU过滤规则:
# 配置允许客户端认证EKU的证书 Set-WebConfiguration -Filter "/system.webServer/security/authentication/clientCertificateMappingAuthentication/manyToOneMappings/add[@name='ClientAuthEKU']" -Value @{ enabled = 'True' permissionMode = 'Allow' rules = @( @{ condition = 'EKU' pattern = '1.3.6.1.5.5.7.3.2' operator = 'Contains' } ) } # 配置允许无EKU的证书 Set-WebConfiguration -Filter "/system.webServer/security/authentication/clientCertificateMappingAuthentication/manyToOneMappings/add[@name='NoEKU']" -Value @{ enabled = 'True' permissionMode = 'Allow' rules = @( @{ condition = 'EKU' pattern = '' operator = 'DoesNotExist' } ) }
执行后重启IIS生效:
iisreset
注意事项
- 部分旧版本浏览器对无EKU证书兼容性较差,建议同时测试两种证书场景
- 可通过
netsh http show sslcert命令查看http.sys的当前TLS配置,确保客户端证书请求已开启
内容的提问来源于stack exchange,提问作者Desperado
相关产品推荐
相关产品推荐

