如何使用.NET代码执行最难的SSL证书检查?

sha*_*oth 5 .net c# ssl pki x509certificate2

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

在生产中使用它们之前,我们需要制作一些能够以最难的方式验证证书的代码.

我精心设计了一段代码,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;
Run Code Online (Sandbox Code Playgroud)

此代码运行好于我们之前的证书(尚未到期)和失败(Build()回报falseX509Chain.ChainStatus包含许多元素- ,X509ChainStatusFlags.RevocationStatusUnknown,).X509ChainStatusFlags.PartialChain X509ChainStatusFlags.OfflineRevocation因此,对于此特定证书,此检查就足够了.

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

bar*_*njs 4

X509ChainStausFlags.PartialChain代码表明您有问题。链中至少有一个证书 a) 没有本地证书存储中已有的颁发者,并且 b) 没有可解析的授权信息访问扩展,该扩展允许系统下载证书(尽管这也可能是网络错误)。

如果缺少的证书是根证书,则将其提供给 chain.ChainPolicy.ExtraStore (在调用 Build 之前)将更X509ChainStatusFlags.PartialChain改为X509ChainStatusFlags.UntrustedRoot。如果它是中间体,那么很可能会成功构建链条。

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