如何使用BouncyCastle csharp验证SSL证书

时间:2016-06-16 09:39:57

标签: c# .net ssl-certificate bouncycastle

我必须在非{-1}}和HttpRequests连接的非浏览器应用程序中验证多个SSL证书。我正在使用一个处理那些http和websocket连接的插件,后者又使用bouncycastle csharp来验证证书。然而,"验证"部分必须通过实施websocket来完成,ICertificateVerifyer应包含isValid方法中的验证检查;

public interface ICertificateVerifyer
{
    bool IsValid(Uri targetUri, X509CertificateStructure[] certs);
}

从理论上讲,我知道我必须做什么,但我的问题是实施以及如何利用bouncycastle库。我没有深入的密码学知识,但经过一些阅读后,我想我知道我想要做的步骤,以验证证书,但它缺乏了解"如何"实施它。

1。信任链验证

我的第一个天真的方法是对certs[0].Issuer.ToString()certs[1].Subject.ToString()进行字符串比较,但是这不是一个好主意。因此,我在Java中找到了这个实现(据我所知),检查父母的公共证书是否用于签署孩子的证书。这听起来更合理但我无法将其移植到bouncycastle csharp,因为我无法从父级的公钥中提取modulusexp整数。

我也不明白为什么实现只处理certs数组中2个证书的情况。我的理解是,也可能存在更长的证书链,并且只有底层证书是服务器证书,最顶层的证书应该是根CA.

我缺少的另一件事是"检查"根CA必须是客户端受信任的CA之一。我不知道如何做到这一点,也不知道如何加载CA.

2。主机名验证

由于我得到certs[0].Subject{CN="myDomainIwanttoverify},因此乍一看这很容易,但根据RFC2818,你应该使用" SubjectAltNames"而不是"通用名称"我猜是属性CN。我再也不知道该怎么做了。

第3。证书撤销

这是我不知道如何做到的一部分,也没有找到我理解并能够使用的任何实现。据我了解,除了CA(用于信任链验证)之外,我还必须提供证书撤销列表(CLR)。如果是这样,这个机制是否必须尽可能频繁地更新此列表?

我知道这是一个复杂的话题,但据我所知,大多数非浏览器应用程序都没有验证证书,或者"做错了#34;我想,至少,我会尽力而为。

0 个答案:

没有答案