C# 如何在ServerCertificateValidationCallback中使用代码实现仅信任一个特定证书(我自己的证书)

C# 如何在ServerCertificateValidationCallback中使用代码实现仅信任一个特定证书(我自己的证书),c#,ssl,ssl-certificate,C#,Ssl,Ssl Certificate,上下文 客户端代码必须连接到远程web api。SSL是强制性的,因为在导线上交换敏感信息。我们有自己签发的证书a 在该项目中,当前没有在远程IIS中正确配置的内容,所有测试都正常,但证书不受信任 我知道我可以在本地计算机上安装证书并信任它。然而,由于某些原因(例如,也有Xamarin Android客户端),它不是一个合适的解决方案 当前的解决方法是忽略代码中的证书错误,这在桌面和Android Xamarin上都有效: ServicePointManager.ServerCertificat

上下文

客户端代码必须连接到远程web api。SSL是强制性的,因为在导线上交换敏感信息。我们有自己签发的证书a 在该项目中,当前没有在远程IIS中正确配置的内容,所有测试都正常,但证书不受信任

我知道我可以在本地计算机上安装证书并信任它。然而,由于某些原因(例如,也有Xamarin Android客户端),它不是一个合适的解决方案

当前的解决方法是忽略代码中的证书错误,这在桌面和Android Xamarin上都有效:

ServicePointManager.ServerCertificateValidationCallback =
(s, certificate, chain, sslPolicyErrors) =>
{
    // Here I would like to check against that the certificate
    // is the specific one I issued, and only that case return with true

    // if (what is the most suitable to write here?) 
    return true;
};
问题

注:这是开发/测试阶段。在生产环境中,将安装由受信任的证书颁发机构创建的证书

现在我对接受任何东西都有不好的感觉,所以我想缩小范围。 如何检查证书是否是我颁发的特定证书,并且只有该情况下才会返回true。 运行代码、放置断点并获取certificate.Thumbprint,然后编写一个if来检查它,这是一个可行的想法吗

(编辑)
……或者更好。。。获取PublicKeyString并对其进行检查?

根据指纹进行检查是一个确定的选项。使用指纹,您可以将信任范围缩小到仅一个证书

检查公钥或主题密钥标识符也可以,但您将把信任扩展到相同的密钥对。可以在同一公钥上颁发多个证书(具有或不具有相同的可分辨名称)

正如@bartonjs所述,另一个选项是检查原始数据。这种方法具有与检查指纹相同的功能。这样做的好处是,一年后当您查看代码时,您仍然会知道您信任的证书:)


无论如何,在检查确切的证书时,请记住证书将在某一天过期(即,如果我没有记错,让我们加密颁发一个3个月的证书),并且您的应用程序将必须重新部署一个新的证书检查。您必须跟踪证书的过期日期。

您可以检查证书扩展名并允许唯一不同的值。使用指纹,您可以将其缩小为一个证书。使用公钥或主键标识符,您可以将其缩小为相同的密钥对,但不是相同的证书。一旦您硬编码了一个标识符,只需将整个证书嵌入为
字节[]
,并将其与
cert.RawData
进行比较。非常感谢大家,这似乎很清楚,也许@pepo愿意写一个答案,我会接受的。