gpt4 book ai didi

c# - 带可选 ClientCertificate 的 SslStream AuthenticateAsServer

转载 作者:太空宇宙 更新时间:2023-11-03 13:12:18 24 4
gpt4 key购买 nike

考虑到 SslStream.AuthenticateAsServer方法,第二个参数clientCertificateRequired:

如果设置为true,则需要客户端证书。如果没有,它将抛出异常。客户端证书将在 RemoteCertificate 属性中可用。

当设置为 false 时,不需要客户端证书,属性 RemoteCertificate 应始终为 null。即使客户提供了一个。

我想完成的是让客户决定是否提供证书。但是,如果他们确实提供了一个,我想在服务器上知道它。

我尝试先将变量设置为 true,如果失败,回退到不需要证书。但是,这会导致“已验证异常”。

try{
sslStream.AuthenticateAsServer(x509certificate, true, SslProtocols.Tls, true);
}catch(Exception ex){
sslStream.AuthenticateAsServer(x509certificate, false, SslProtocols.Tls, true);
}

最佳答案

我坚信这是一个文档缺陷。

实际上,参数 clientCertificateRequired 将控制客户端证书是否不被忽略。这意味着:

clientCertificateRequired = false 将忽略服务器端的任何客户端证书。不检查证书是否存在或是否有效。

clientCertificateRequired = true 将尊重服务器端发送的任何客户端证书。如果缺少客户端证书,则会使用 SslPolicyErrors.RemoteCertificateNotAvailable 调用验证回调,这会导致您在使用默认实现时捕获异常。

因此在您的情况下:将 clientCertificateRequired 设置为 true 并实现自定义验证回调,如下所示:

var client = server.AcceptTcpClient()
var networkStream = client.GetStream()

var sslStream = new SslStream(
networkStream,
false,
(sender, certificate, chain, errors) =>
{
if (errors == SslPolicyErrors.None)
{
return true;
}

if (errors == SslPolicyErrors.RemoteCertificateNotAvailable)
{
// seems to be okay for you
return true;
}

return false;
},
(sender, host, certificates, certificate, issuers) => x509certificate
);

sslStream.AuthenticateAsServer(x509certificate, true, SslProtocols.Tls, true);

关于c# - 带可选 ClientCertificate 的 SslStream AuthenticateAsServer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26930398/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com