2015-09-08 15 views
5

我们碰巧运行暴露的https://端点的REST API服务。最近我们更改了SSL证书,几个用户(主要是libcurl和Java用户)抱怨说他们不再验证证书,他们的程序拒绝连接到我们的服务。其他用户,包括.NET用户,没有观察到任何问题。 Firefox也很乐意使用该证书在网站上打开页面。如何使用.NET代码执行最难的SSL证书检查?

我们需要手艺一些代码,验证证书之前,我们使用他们在生产中可能最困难的方式。

我制作了一段代码创建一个证书X509Certificate2对象,然后从它试图X509Chain.Build()

var certDataArray = File.ReadAllBytes(path); 
var cert = new X509Certificate2(certDataArray, password); 
var chain = new X509Chain(); 
var result = chain.Build(cert); 
var status = chain.ChainStatus; 

此代码运行好于我们之前的证书(尚未到期)和失败(Build()返回falseX509Chain.ChainStatus包含许多元件 - X509ChainStatusFlags.RevocationStatusUnknownX509ChainStatusFlags.PartialChainX509ChainStatusFlags.OfflineRevocation)。所以对于这个特定的证书看起来这个检查就足够了。

X509Chain.Build()足以保证我们所有的用户都可以成功地验证证书?是否需要其他检查?

+0

那你的证书中的变化?您是否使用新的CA /发行人? –

+0

@ stephen.vakil新证书来自另一个CA,并且CA基础架构出现问题,导致无法进行彻底验证。真的有关系吗? – sharptooth

回答

3

X509ChainStausFlags.PartialChain代码是你有问题的迹象。链中至少有一个证书a)没有已经存在于本地证书存储区中的颁发者,并且b)没有可解析的颁发机构信息访问扩展,它允许系统下载证书(尽管这也可能是网络错误)。

如果缺少的证书是根,那么将其提供给chain.ChainPolicy.ExtraStore(在调用Build之前)将会将X509ChainStatusFlags.PartialChain更改为X509ChainStatusFlags.UntrustedRoot。如果这是一个中间环节,那么很可能会成功建立连锁店。

OfflineRevocation代码看起来很奇怪,因为你没有指定X509RevocationMode.Offline(至少,不在你的代码片段中)。