gpt4 book ai didi

c# - SslStream 和身份验证

转载 作者:太空狗 更新时间:2023-10-30 00:48:59 38 4
gpt4 key购买 nike

我看了很长时间的 MSDN 信息文章,但我仍然无法理解。

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

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

2.在建立SslStream时,是只有服务端负责建立SslStream还是服务端和客户端都负责?

3.如果只是服务器的责任,是否意味着客户端可以只使用常规的send()receive() 不自己创建 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。您只需在其周围“包装”一个 TcpClient NetworkStream 即可创建它(例如,但还有其他方法)

服务器示例:

// 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/

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