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

问题描述:

语境我如何能实现信任使用代码只有一个特定的证书(我自己),在ServerCertificateValidationCallback

客户端代码必须连接到远程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。 这是一个工作思路来运行代码,放置一个断点,并获得证书.Thumbprint,然后写一个if来检查它吗?

(编辑) ...或更好...获取PublicKeyString并检查它?

+0

您可以检查证书扩展[主题密钥标识符](https://knowledge.symantec.com/support/registrar-name/index?page=content&actp=CROSSLINK&id=SO18140#SKI)并允许使用不同的值。 –

+0

使用指纹,您可以将其缩小到只有一个证书。使用公钥或主题密钥标识符,您将缩小到相同的密钥对,但不是相同的证书。 – pepo

+0

一旦你对一个标识符进行了硬编码,只需将整个证书嵌入为'byte []',并将其与'cert.RawData'进行比较。 – bartonjs

检查指纹是恕我直言的一个确定的选项。通过拇指指纹,您可以将信任范围缩小到一个证书。

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

由于@bartonjs表示另一种选择是检查原始数据。这种方法与检测指纹相同。国际海事组织的好处是,当你从现在起一年后看代码时,你仍然会知道你信任哪个证书:)

无论如何,当检查确切的证书时,请记住证书将在某一天过期(即如果我没有记错的话,让我们加密问题3个月的证书),您的应用程序将不得不重新部署一个新的证书检查。你将不得不跟踪证书的到期日期。