【发布时间】:2016-10-18 07:59:30
【问题描述】:
我必须在一个非浏览器应用程序中验证几个 SSL 证书,以便在 IOS、Android 和 Linux 上运行 HttpRequests 和 websocket 连接。
当发生通过HTTPS 的连接时,我会收到一组X509Certificate2 对象,其中底部是服务器证书,最顶部的是根CA(希望如此)。例如,当我连接到 https://google.com 时,我收到 3 个 X509Certificate2 和以下 SubjectName.Name:
- 0:
"CN=google.com, O=Google Inc, L=Mountain View, S=California, C=US" - 1:
"CN=Google Internet Authority G2, O=Google Inc, C=US" - 2:
"CN=GeoTrust Global CA, O=GeoTrust Inc., C=US"
我现在需要使用给定信息和以下验证来验证证书验证:
- 信任链验证
- 主机名验证
- 证书吊销验证
我尝试过但不理解并失败了:
当我在每个证书上独立调用X509Certificate2.Verify() 方法时,它每次都返回false。我也不明白为什么它可以返回 false 之后的任何其他内容,因为验证是独立进行的。相反,就我理解的理论而言,应该检查完整的链,即所有证书。
然后我使用了X509Chain 类:
foreach (X509Certificate2 cert in allthreecerts)
{
X509Chain chain = new X509Chain();
X509ChainPolicy chainPolicy = new X509ChainPolicy()
{
RevocationMode = X509RevocationMode.Offline,
RevocationFlag = X509RevocationFlag.EntireChain
};
chain.ChainPolicy = chainPolicy;
if (!chain.Build(cert))
{
foreach (X509ChainElement chainElement in chain.ChainElements)
{
foreach (X509ChainStatus chainStatus in chainElement.ChainElementStatus)
{
Debug.WriteLine(chainStatus.StatusInformation);
}
}
}
}
这将为每个证书打印出RevocationStatusUnknown 和OfflineRevocation。
再次,我不明白为什么这应该起作用,因为每个证书都是独立构建的链。父证书不应该是子证书的问题全部到根 CA 吗?
我想我需要什么,但不知道怎么做。
为了验证证书吊销,所有客户端都需要提供证书吊销列表。我从哪里获得这样的列表以及在哪里加载它并告诉连锁店使用这个本地列表?
同样的问题是信任链验证,因为最后一个认证应该是根认证,并且必须是客户信任的根 CA 之一。因此,例如,我必须加载 Firefox 附带的所有根 CA,并检查根 CA 是否是其中之一?最好的方法是什么?
[更新]
我在 google.com 示例中复制粘贴错误,我粘贴了两个相同的证书主题名称。
【问题讨论】:
-
RevocationMode = X509RevocationMode.Offline-- 切换到Online。客户端必须具有本地 CRL/OCSP 缓存才能在脱机模式下成功验证吊销。 -
这就是重点。我正在实施“客户”。那么我如何提供这样的 CRL。这就是我要问的问题。
-
CRL 是从在线资源中检索的。 CRL 位置在
CRL Distribution Points证书扩展中指定。或者在Authority Information Access扩展的On-line Certificate Status Protocol部分中。 -
谢谢,.NET 中是否有任何帮助程序可以加载这样的 .crl 文件并搜索它以检查特定证书是否已被吊销?
-
您可以使用充气城堡来解析 CRL。也许 Mono 也有一些东西,但我对 Mono 不是很熟悉。
标签: c# mono ssl-certificate x509certificate2