我读了很长一段时间的msdn信息文章,但还是不明白。
基于不需要客户端身份验证的假设:
1.当我调用SslStream.AuthenticateAsServer(...)时,是在服务器端还是在客户端调用此方法?
2.在建立sslstream时,服务器是否只负责建立SslStream或同时建立服务器和客户端?
3.如果这只是服务器的责任,是否意味着客户端可以只使用常规的send()recieve()操作,而不需要自己创建sslstream?
4.客户端是否需要获取证书文件才能验证服务器?
非常感谢您的提前,我真的找不到关于这个主题的很多信息,我已经搜索了很长一段时间了。

最佳答案

编辑: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。您只需在它周围“包装”一个TcpClientNetworkStream即可创建它(例如,还有其他方法)
服务器示例:

// 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创建,以验证服务器接收到的证书。
例子:
// 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

然后在代码中的其他地方:
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;
    }

关于c# - SslStream和身份验证,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41863244/

10-09 09:30