C# 如何使用BouncyCastle csharp验证SSL证书
我必须为C# 如何使用BouncyCastle csharp验证SSL证书,c#,.net,ssl-certificate,bouncycastle,C#,.net,Ssl Certificate,Bouncycastle,我必须为HttpRequests和websocket连接验证非浏览器应用程序中的几个SSL证书。我正在使用一个插件来处理那些http和websocket连接,而这些连接反过来又使用来验证证书。但是,“验证”部分必须由我通过实施ICertificateVerifier来完成,该验证应包含isValid方法中的验证检查 public interface ICertificateVerifyer { bool IsValid(Uri targetUri, X509CertificateStru
HttpRequests
和websocket
连接验证非浏览器应用程序中的几个SSL证书。我正在使用一个插件来处理那些http和websocket连接,而这些连接反过来又使用来验证证书。但是,“验证”部分必须由我通过实施ICertificateVerifier
来完成,该验证应包含isValid
方法中的验证检查
public interface ICertificateVerifyer
{
bool IsValid(Uri targetUri, X509CertificateStructure[] certs);
}
理论上,我知道我必须做什么,但我的问题是实现以及如何利用bouncycastle库实现这一点。我对密码学没有深入的了解,但是经过一些阅读之后,我想我知道为了验证证书而要做的步骤,但是它不知道如何实现它
1。信任链验证
我的第一个简单方法是对certs[0].Issuer.ToString()
和certs[1].Subject.ToString()
进行字符串比较,这虽然有效,但不是一个好主意。因此,我发现这个实现(据我所知)检查父级的公共证书是否用于签署子级证书。这听起来更合理,但我无法将其移植到bouncycastle csharp,因为我无法从父项的公钥中提取模
和exp
整数
我也不明白为什么实现只处理certs数组中2个证书的情况。我的理解是,也可能会有更长的证书链,只有最下面的证书是服务器证书,最上面的证书应该是根CA
我缺少的另一件事是“检查”根CA必须是客户机信任的CA之一。我不知道如何做,也不知道如何加载CAs
2。主机名验证
乍一看很简单,因为我得到了证书[0]。Subject{CN=“myDomainIwanttoverify}
,但是根据我的建议,你应该使用“SubjectAltNames”,而不是“Common Name”,我猜这是属性CN
。我也不知道怎么做
3.证书撤销
这是我不知道如何做的一部分,也没有找到我理解并能够使用的任何实现。据我所知,除了CA(用于信任链验证)之外,我还必须提供证书吊销列表(CLR)。如果是这样的话,是否有必要尽可能频繁地更新此列表
我知道这是一个复杂的话题,但据我所知,大多数非浏览器应用程序都没有验证证书或“做错了”“我想,至少我会尽我最大的努力。X509链接验证,包括吊销列表和主机名比较,已内置到该框架中。您使用BouncyCastle有什么特别的原因吗?如果有其他选择,请先参考这篇文章,看看它是否已经满足您的要求:不幸的是,我被迫使用BouncyCastle。为什么?我最好随时在BC上使用
X509Chain
类。此类完全实现RFC5280证书验证规则。您是对的,但这是一个不同的用例。我想我将为此创建一个新问题。我创建了一个关于同一问题的新问题,但现在使用X509Chain
validation。框架中内置了X509链接验证,包括吊销列表和主机名比较。您使用BouncyCastle有什么特别的原因吗?如果有其他选择,请先参考这篇文章,看看它是否已经满足您的要求:不幸的是,我被迫使用BouncyCastle。为什么?我最好随时在BC上使用X509Chain
类。此类完全实现RFC5280证书验证规则。您是对的,但这是一个不同的用例。我想我将为此创建一个新问题。我创建了一个关于同一问题的新问题,但现在使用X509Chain
验证。