You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 08:23:34