.NET 6 Web API接收Starling Webhook:如何获取客户端证书验证
解决.NET 6中获取Starling Bank Webhook客户端证书的问题
核心原因:ASP.NET Core默认不强制要求客户端证书
你代码里clientCert返回null,本质是因为默认情况下Kestrel不会主动要求客户端提供证书,请求过来时自然不会携带证书数据。
步骤1:配置Kestrel启用客户端证书验证
在.NET 6的Program.cs中添加Kestrel的客户端证书配置,强制服务要求客户端发送证书:
var builder = WebApplication.CreateBuilder(args); // 配置Kestrel要求客户端证书 builder.WebHost.ConfigureKestrel(options => { options.ConfigureHttpsDefaults(httpsOptions => { // 设置为RequireCertificate,强制请求携带客户端证书 httpsOptions.ClientCertificateMode = ClientCertificateMode.RequireCertificate; // 沙箱环境可临时跳过证书链验证,正式环境需替换为严格验证逻辑 httpsOptions.ClientCertificateValidation = (cert, chain, errors) => true; }); }); // 常规服务配置 builder.Services.AddControllers(); var app = builder.Build(); app.UseHttpsRedirection(); app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run();
步骤2:Postman测试时正确携带客户端证书
用Postman模拟Starling请求时,需手动导入证书并配置到请求中:
- 打开目标请求的
Settings标签页 - 找到
Certificates选项,点击Add Certificate - 填写测试用的API域名(如
localhost:5001),导入Starling提供的.crt证书文件后保存 - 重新发送请求,此时
Request.HttpContext.Connection.ClientCertificate即可获取到证书数据
步骤3:正确验证Starling证书(替代Equals方法)
直接使用X509Certificate.Equals()不可靠,建议验证证书的公钥指纹或公钥内容,和Starling官方提供的沙箱公钥比对:
// 获取客户端证书 var clientCert = Request.HttpContext.Connection.ClientCertificate; if (clientCert == null) { return Ok(new { status = "error", message = "未获取到客户端证书" }); } // 加载本地保存的Starling沙箱证书(用X509Certificate2获取更多验证属性) var starlingCertPath = "D:\\Certificate\\Starling\\starling-sandbox-api-certificate.crt"; var starlingCert = new X509Certificate2(starlingCertPath); // 方式1:验证证书拇指纹(忽略大小写,避免哈希格式差异) var isValid = string.Equals(clientCert.Thumbprint, starlingCert.Thumbprint, StringComparison.OrdinalIgnoreCase); // 方式2:验证公钥内容(更安全,不受指纹哈希算法影响) // var clientPublicKey = clientCert.GetPublicKeyString(); // var starlingPublicKey = starlingCert.GetPublicKeyString(); // isValid = string.Equals(clientPublicKey, starlingPublicKey, StringComparison.OrdinalIgnoreCase); return Ok(new { status = isValid ? "ok" : "error", certValid = isValid });
关于X_Client-Cert头为null的说明
Starling Bank的Webhook是否携带X_Client-Cert头需以官方文档为准。若文档明确说明会发送但你未获取到,大概率是请求未触发Starling的证书发送逻辑,或是服务器配置拦截了请求头。优先通过SSL证书验证的方式获取证书,这是SSL固定的标准实现方式。
内容的提问来源于stack exchange,提问作者JasonWilliams
相关产品推荐
相关产品推荐

