为何IIS 8.5升级到IIS 10后SSL客户端证书设置行为改变?
解决方案:IIS10下保留文件夹级客户端证书控制
核心原因
IIS10对客户端证书协商逻辑做了变更:默认仅当站点绑定开启Negotiate Client Certificate时,IIS才会向客户端请求证书;但开启后全站都会触发证书提示,原IIS8.5的文件夹级“接受客户端证书”设置无法单独生效。需结合绑定配置与路径级IIS设置实现原有需求。
步骤1:配置站点SSL绑定启用证书协商
用netsh命令重新配置站点SSL绑定,开启证书协商并禁用IIS层面的证书吊销验证(避免内部证书因吊销列表不可达导致验证失败):
netsh http add sslcert ipport=0.0.0.0:443 certhash=你的站点证书哈希值 appid={你的应用GUID} certstorename=MY verifyclientcertrevocation=disable negotiateclientcert=enable
注:替换
certhash和appid为实际值,可通过netsh http show sslcert查看现有绑定信息。
步骤2:通过web.config设置路径级证书要求
在应用根目录的web.config中添加location节点,分别控制API路径和其他页面的证书行为:
针对API路径(允许证书传递到应用处理)
<location path="api"> <system.webServer> <security> <!-- Ssl确保HTTPS,SslAcceptCert允许客户端提交证书但IIS不做验证 --> <access sslFlags="Ssl, SslAcceptCert" /> </security> </system.webServer> </location>
针对根目录及MVC页面(不触发证书提示)
<location path="."> <system.webServer> <security> <!-- 仅要求HTTPS,不主动请求客户端证书 --> <access sslFlags="Ssl" /> </security> </system.webServer> </location>
步骤3:禁用IIS层面的证书身份验证
确保IIS站点的客户端证书映射身份验证和IIS客户端证书映射身份验证均处于禁用状态,避免IIS提前拦截未通过验证的证书:
- 打开IIS管理器,选择目标站点
- 进入“身份验证”功能
- 找到上述两项身份验证,设置为“禁用”
验证效果
- 访问MVC视图页面:浏览器不会弹出证书选择提示
- 调用API接口:客户端提交的证书会被传递到Owin中间件,由应用自行完成验证,不再返回403
内容的提问来源于stack exchange,提问作者NiteFiddle
相关产品推荐
相关产品推荐

