首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SslStream与认证

SslStream与认证
EN

Stack Overflow用户
提问于 2017-01-25 22:58:40
回答 1查看 16.9K关注 0票数 7

我读了相当长一段时间的MSDN信息文章,但我仍然不理解它。

基于不需要客户端身份验证的假设:

1.当我调用SslStream.AuthenticateAsServer(...)时,我是在服务器端还是在客户端调用此方法?

2.在建立SslStream时,建立SslStream是服务器的责任,还是服务器和客户端的责任?

3.如果仅由负责,是否意味着客户端可以使用常规的send()receive()操作,而无需自己创建SslStream?

4.客户端是否需要获取证书文件才能验证服务器?

非常感谢,我真的找不到很多关于这个话题的信息,我已经搜索这个信息很长时间了…

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-26 00:15:34

编辑:MSDN在本页底部有一个完整的工作示例:https://msdn.microsoft.com/en-us/library/system.net.security.sslstream?f=255&MSPPError=-2147217396,所以您应该开始在那里进行实验,因为这个示例已经全部完成了。

原始答案

我必须在此回答“不需要客户端身份验证”是大多数SSL实现的情况。客户端身份验证很少见:您可能会在VPN应用程序、银行业和其他安全应用程序中看到它。因此,当您尝试在没有客户端身份验证的情况下开始使用SslStream()时,这将是明智的。

当您浏览到HTTPS网站时,您不会使用客户端证书对浏览器进行身份验证,而是只想确认连接到的服务器名称与证书中的CNAME匹配,并且服务器证书由计算机信任的CA签名--它还有更多内容,但本质上是这样的。

既然如此,让我回答你们的问题:

1) SslStream.AuthenticateAsServer(...)仅在服务器端使用服务器509证书完成。在客户端,您必须调用SslStream.AuthenticateAsClient(serverName),服务器名是证书的CNAME (公共名称)(例如:"domain.com")。

2)必须同时为客户端和服务器创建SslStream。您可以简单地通过“包装”一个TcpClient NetworkStream来创建它(例如,还有其他方法)。

服务器示例:

代码语言:javascript
复制
// assuming an 509 certificate has been loaded before in an init method of some sort
X509Certificate serverCertificate = X509Certificate2.CreateFromCertFile("c:\\mycert.cer"); // for illustration only, don't do it like this in production
...

// assuming a TcpClient tcpClient was accepted somewhere above this code
slStream sslStream = new SslStream(tcpClient.GetStream(), false);
sslStream.AuthenticateAsServer(
                serverCertificate,
                false, 
                SslProtocols.Tls, 
                true);

( 3)不。通信在两端都被加密。因此双方都必须使用SslStream。在客户机上使用receive()send()将产生二进制加密数据。

( 4)否。客户端将回调方法传递给SslStream创建,以验证服务器接收的证书。

示例:

代码语言:javascript
复制
// assuming a TcpClient tcpClient was connected to the server somewhere above this code
SslStream sslStream = new SslStream(
            tcpClient.GetStream(),
            false,
            new RemoteCertificateValidationCallback(ValidateServerCertificate),
            null
            ); 
sslStream.AuthenticateAsClient(serverName); // serverName: "domain.com" for example

然后在代码中的其他地方:

代码语言:javascript
复制
public static bool ValidateServerCertificate(
          object sender,
          X509Certificate certificate,
          X509Chain chain,
          SslPolicyErrors sslPolicyErrors)
    {
        if (sslPolicyErrors == SslPolicyErrors.None) {
            return true;
        }

        Console.WriteLine("Certificate error: {0}", sslPolicyErrors);

        // refuse connection
        return false;
    }
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41863244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档