我有一个使用HttpListener在C#中实现的web服务器,有一个Go客户端与这个服务器进行对话。作为需求的一部分,我需要验证从服务器上的客户端发送的证书,并从客户机发送证书链。我找到了在服务器上获取证书的方法HttpListenerRequest.GetClientCertificate(),但是我只能接收叶子证书,而不能接收整个链,这阻碍了我执行链验证。是否有方法使用HttpListener作为服务器接收整个链。
PS:我尝试将相同的证书链发送到Go服务器,并且Go在Tls Config中有ssl回调处理程序(Tls Config),我可以使用它读取整个证书链。我只想用我在C#中现有的C#服务器来实现这一点。
编辑: My client证书是一个链(client cert +中间CA +根CA)。我已将根CA预先存储在受信任的根证书颁发机构中。我需要在Windows信任存储中获得中间CA,这样我就可以为客户端证书构建链,而且由于无法预存储中间CA,所以当客户端与服务器交谈时,想法是从客户端发送该链并提取中间CA。由于我能够使用具有相同客户端的Go服务器接收完整的链,所以我可以确认客户端始终发送该链,但是我们在C# for HttpListener
中使用的方法似乎忽略了该链。
发布于 2021-11-25 17:39:12
通常,客户端只是发送其客户端证书,然后由服务器负责检查客户端证书是否可信。如果任何人都可以发送包含完整链的客户端证书,那么服务器可以接受任何证书颁发机构(包括任何已泄露的证书)。因此,发出客户端证书的证书颁发机构的证书必须在服务器上被信任,以确保该授权被信任,并且服务器可以请求此授权以确保客户端证书没有被撤销。在Windows上,这是通过将证书颁发机构的证书添加到受信任的根证书颁发机构存储区来完成的。
HttpListenerRequest.GetClientCertificate()
来源只加载一个证书。
它在服务器端检查完整的链。服务器必须能够连接到已签署客户端证书以下载中间CA的AIA。
var chain = new X509Chain();
chain.ChainPolicy = new X509ChainPolicy()
{
DisableCertificateDownloads = false,
RevocationFlag = X509RevocationFlag.EntireChain,
RevocationMode = X509RevocationMode.Online,
UrlRetrievalTimeout = TimeSpan.Zero,
VerificationFlags = X509VerificationFlags.AllFlags
};
您可以尝试实现您自己的HttpListenerRequest
,并将其用作管道中的一个中间件。
https://stackoverflow.com/questions/70115199
复制相似问题