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

时间:2017-09-17 07:42:20

标签: c# ssl ssl-certificate

上下文

客户端代码必须连接到远程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并检查它?

1 个答案:

答案 0 :(得分:2)

检查指纹是恕我直言,可以选择。使用指纹,您可以将信任范围缩小到一个证书。

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

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

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