ASP.Net Core 2.0 IIS Express访问静态文件时SSL客户端证书弹窗问题
我之前在Windows 7 + VS2017 + IIS Express的环境下折腾过ASP.NET Core 2.0的客户端证书验证,结合你的场景,给你梳理一套完整的实现流程,确保能顺利让用户访问时必须选择客户端证书:
环境确认
先对齐一下咱们的环境,避免踩版本适配的坑:
- 操作系统:Windows 7
- 开发工具:Visual Studio 2017 + IIS Express
- 应用框架:ASP.NET Core 2.0 MVC
- 测试浏览器:IE11、Edge、Chrome
关键配置步骤
1. 自签名证书的收尾检查(你已完成生成,补个关键验证)
确保你生成的自签名证书已经正确安装:
- 客户端证书要放到本地计算机的“个人”证书存储
- 对应的根证书要放到本地计算机的“受信任的根证书颁发机构”(不然浏览器会提示证书不受信任,直接拦截)
- 检查证书的「增强密钥使用」属性,必须包含「客户端身份验证」用途,不然IIS不会把它当作有效客户端证书
2. 修改IIS Express的配置文件
IIS Express的配置文件有两个位置,推荐修改项目本地的(避免影响其他项目):你的项目目录/.vs/config/applicationhost.config,如果找不到就用全局的:%USERPROFILE%\Documents\IISExpress\config\applicationhost.config
- 找到你的站点对应的
<site>节点,确认<bindings>里有HTTPS绑定,示例:<binding protocol="https" bindingInformation="*:44300:localhost" /> - 找到该站点下的
<security>节点,替换成以下配置:
划重点:<security> <access sslFlags="Ssl, SslNegotiateCert, SslRequireCert" /> <clientCertificates> <authentication certificateValidationMode="None" revocationMode="NoCheck" /> </clientCertificates> </security>sslFlags设置成SslRequireCert才会强制要求客户端证书;certificateValidationMode="None"是测试用的宽松模式,正式环境记得改成ChainTrust来验证证书链
3. ASP.NET Core应用的代码配置
3.1 配置证书认证服务(Startup.cs)
在ConfigureServices方法里添加证书认证的服务配置:
using Microsoft.AspNetCore.Authentication.Certificate; // 其他代码... public void ConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_0); // 添加客户端证书认证 services.AddAuthentication(CertificateAuthenticationDefaults.AuthenticationScheme) .AddCertificate(options => { options.AllowedCertificateTypes = CertificateTypes.All; options.Events = new CertificateAuthenticationEvents { OnCertificateValidated = context => { // 这里可以加自定义的验证逻辑,比如检查证书主题、序列号 var clientCert = context.ClientCertificate; // 示例:验证证书主题是否包含咱们的测试标识 if (clientCert.Subject.Contains("TestClientCert")) { context.Success(); // 验证通过 } else { context.Fail("证书主题不符合要求"); // 验证失败 } return Task.CompletedTask; } }; }); }
然后在Configure方法里启用认证中间件(一定要放在UseMvc前面!):
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { // 其他中间件配置... // 启用认证 app.UseAuthentication(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }
3.2 给需要保护的页面加授权
在控制器或者Action上加上[Authorize]特性,这样只有提供有效证书的请求才能访问:
using Microsoft.AspNetCore.Authorization; [Authorize] public class HomeController : Controller { public IActionResult Index() { // 获取当前请求的客户端证书信息,用来展示或者后续业务处理 var cert = HttpContext.Connection.ClientCertificate; ViewData["CertSubject"] = cert.Subject; ViewData["CertSerialNumber"] = cert.SerialNumber; return View(); } }
4. 浏览器端的配置与测试
IE11/旧版Edge
- 打开「Internet选项」→「内容」→「证书」→「个人」,确认你的测试证书在列表里
- 访问站点时,浏览器会自动弹出证书选择对话框,选咱们的测试证书就能正常访问了
Chrome
- 打开Chrome设置→「隐私和安全」→「安全」→「管理证书」→「个人」,确认证书存在
- 访问HTTPS站点时,Chrome会弹出证书选择窗口,选中测试证书即可进入页面
常见坑点排查
- 浏览器没弹出证书选择框:检查IIS Express的
sslFlags是不是包含SslRequireCert,同时确认站点的HTTPS绑定端口和你访问的一致 - 证书验证失败:先把
certificateValidationMode改成None测试,如果能通,说明是证书链的问题,检查根证书有没有装对;如果还是失败,看Startup里的自定义验证逻辑是不是写得太严 - Windows 7下IIS Express可能需要权限:记得用管理员身份启动VS2017,不然可能读不到证书存储
内容的提问来源于stack exchange,提问作者Everto
相关产品推荐
相关产品推荐

