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

OWASP.org展示的.NET公钥固定实现方式是否正确?

关于.NET公钥固定代码中sslPolicyErrors的处理问题

你完全说对了——这段OWASP的示例代码确实存在一个关键的安全漏洞,没有正确处理sslPolicyErrors参数是非常危险的。

为什么忽略sslPolicyErrors会有风险?

.NET内置的默认SSL验证会检查多项关键安全指标:

  • 证书是否由受信任的CA签发
  • 证书的域名是否与请求的目标域名匹配
  • 证书是否过期或被吊销
  • 证书链是否完整可信

如果跳过这些检查,只验证公钥是否匹配,攻击者可以轻松构造一个拥有目标公钥但其他属性完全非法的证书(比如生成一个自签名证书,复用目标的公钥,但域名任意填写)。此时这段代码会直接返回true,导致中间人攻击成功——攻击者可以用这个恶意证书拦截你的HTTPS请求,窃取或篡改数据。

正确的公钥固定逻辑

公钥固定应该作为默认SSL验证通过后的附加校验,而不是替代默认验证。正确的实现步骤应该是:

  1. 先检查sslPolicyErrors是否为SslPolicyErrors.None,如果存在任何未预期的错误,直接返回false
  2. 确认证书不为空后,再验证公钥是否与我们预先固定的值匹配

改进后的代码示例:

public static bool PinPublicKey(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    // 优先确保默认SSL验证无错误
    if (sslPolicyErrors != SslPolicyErrors.None)
    {
        return false;
    }

    if (certificate == null)
    {
        return false;
    }

    string publicKey = certificate.GetPublicKeyString();
    // 仅在默认验证通过后,再校验公钥是否匹配
    return publicKey.Equals(PUB_KEY, StringComparison.Ordinal);
}

额外说明

如果你有特殊场景需要忽略某些特定的SSL错误(比如测试环境使用自签名证书),一定要精准控制忽略的范围,不要直接跳过所有错误。但在生产环境的公钥固定场景下,强烈建议严格遵循默认验证逻辑,再叠加公钥固定的校验,才能最大化安全性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:13:46