具有可选ClientCertificate的SslStream AuthenticateAsServer

斯蒂金·范·安特卫普(Stijn Van Antwerp)

考虑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);
}
神F

我坚信这是文档缺陷。

实际上,该参数clientCertificateRequired将控制是否忽略客户端证书这表示:

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

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

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

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);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有可选ClientCertificate的SslStream AuthenticateAsServer

来自分类Dev

如何使用带有自签名证书/密钥的SslStream / AuthenticateAsServer?

来自分类Dev

SslStream AuthenticateAsServer失败,并显示“服务器证书私钥不可用”。单声道异常

来自分类Dev

.NET SslStream AuthenticateAsServer可以尊重客户端发送的服务器名称指示器吗?

来自分类Dev

禁用AuthenticateAsServer的证书验证似乎无效

来自分类Dev

停留在 mitm https 代理中的 AuthenticateAsServer 方法上

来自分类Dev

println词典具有“可选”

来自分类Dev

具有可选参数的方法

来自分类Dev

Mypy 可选 dict 错误,具有非可选的预期类型

来自分类Dev

具有可选参数的接口实现

来自分类Dev

具有几个可选参数的路线

来自分类Dev

较少:具有可选参数的混入

来自分类Dev

具有可选参数的JavaScript函数

来自分类Dev

具有可选参数的mvc属性路由

来自分类Dev

具有可选参数的Web API路由

来自分类Dev

具有可选参数的GWT UiConstructor

来自分类Dev

如何具有默认和可选参数?

来自分类Dev

具有可选GUI的C#类?

来自分类Dev

c具有多个可选参数的宏

来自分类Dev

具有可选ID的@OnClick数组(ButterKnife)

来自分类Dev

BigQuery:具有可选参数的持久UDF

来自分类Dev

在余烬路线中具有可选的前缀

来自分类Dev

如何具有可选的OUTPUT参数

来自分类Dev

具有多个可选参数的Laravel路由

来自分类Dev

具有可选参数的mvc属性路由

来自分类Dev

具有动态可选参数的Symfony路由

来自分类Dev

Flask - 具有多个可选参数的路由

来自分类Dev

具有可选类型的 WebApi 模型

来自分类Dev

SslStream解密有问题吗?

Related 相关文章

热门标签

归档