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

System.Net.Quic中信任自签名证书:X509ChainPolicy设置无效问题

解答

核心原因

在.NET 7 Preview 7版本中,System.Net.Quic底层的TLS实现并未正确传递SslClientAuthenticationOptions.CertificateChainPolicy到证书验证流程,导致自定义策略完全不生效,这属于该预览版本的已知问题(后续正式版已修复)。

无需全局信任的解决方案

既然自定义X509ChainPolicy不生效,你可以在RemoteCertificateValidationCallback中手动执行证书验证,有两种可行方式:

方式一:手动使用自定义策略构建证书链

private static bool ProcessCertificate(
    object sender,
    X509Certificate? certificate,
    X509Chain? chain,
    SslPolicyErrors sslPolicyErrors)
{
    if (certificate == null || chain == null)
        return false;

    // 重新定义自定义验证策略
    var customPolicy = new X509ChainPolicy
    {
        TrustMode = X509ChainTrustMode.CustomRootTrust,
        VerificationFlags = X509VerificationFlags.AllowUnknownCertificateAuthority
    };
    // 加载本地自签名证书到信任存储
    using var serverCert = LoadCert();
    customPolicy.CustomTrustStore.Add(serverCert);

    // 应用自定义策略并重新构建证书链
    chain.ChainPolicy = customPolicy;
    bool isValid = chain.Build(new X509Certificate2(certificate));

    if (!isValid && chain.ChainStatus.Length > 0)
    {
        var errs = string.Join(
            Environment.NewLine,
            chain.ChainStatus
                .Select(x => $"[{x.Status}] {x.StatusInformation}"));
        Console.WriteLine(errs);
    }

    return isValid;
}

方式二:直接对比证书指纹(简单高效)

如果不需要完整的证书链验证,仅需确认服务器证书与本地证书一致,可直接对比证书指纹:

private static bool ProcessCertificate(
    object sender,
    X509Certificate? certificate,
    X509Chain? chain,
    SslPolicyErrors sslPolicyErrors)
{
    if (certificate == null)
        return false;

    using var serverCert = LoadCert();
    // 对比SHA256指纹,忽略大小写
    return string.Equals(
        certificate.GetCertHashString(System.Security.Cryptography.HashAlgorithmName.SHA256),
        serverCert.GetCertHashString(System.Security.Cryptography.HashAlgorithmName.SHA256),
        StringComparison.OrdinalIgnoreCase);
}

额外说明

  • 升级到.NET 7正式版或更高版本后,SslClientAuthenticationOptions.CertificateChainPolicy会被正确传递,你最初的代码即可正常工作。
  • 方式一能完成完整的证书链验证(包括有效期、用途等),安全性更高;方式二更简洁,但仅验证证书本身的一致性,适合测试场景。

内容的提问来源于stack exchange,提问作者freakish

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 02:24:37