gpt4 book ai didi

c# - SslStream.AuthenticateAsServer 挂起

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

使用 VS 10 和 .NET Framework 4.0,我编写了三个 c# 单元测试来检查不同服务器/客户端协议(protocol)设置的 SslStream 行为。

  private void InternalTestSsl(SslProtocols serverProtocols, SslProtocols clientProtocols)
{
X509Certificate2 certificate = RetrieveServerCertificate();
var server = new TcpListener(new IPEndPoint(IPAddress.Any, 20000));
server.Start();
try
{
// create and execute a task for server operations
var serverTask = new Task(() =>
{
TcpClient connectionToClient = server.AcceptTcpClient();
var sslStream = new SslStream(connectionToClient.GetStream(), false, (a, b, c, d) => true, (a, b, c, d, e) => certificate);
sslStream.AuthenticateAsServer(certificate, false, serverProtocols, true);
Assert.IsTrue(sslStream.IsAuthenticated);
});
serverTask.Start();

// create and execute a task for client operations
var clientTask = new Task(() =>
{
var clientConnection = new TcpClient();
clientConnection.Connect(new IPEndPoint(IPAddress.Loopback, 20000));
var sslStream = new SslStream(clientConnection.GetStream(), false, (a, b, c, d) => true, (a, b, c, d, e) => null);
sslStream.AuthenticateAsClient(Environment.MachineName, null, clientProtocols, true);
Assert.IsTrue(sslStream.IsAuthenticated);
});
clientTask.Start();

// wait for both server and client task to finish, check results
if (!serverTask.Wait(TimeSpan.FromSeconds(1)))
{
throw new Exception("Server task did not end in time.");
}
if (!clientTask.Wait(TimeSpan.FromSeconds(1)))
{
throw new Exception("Client task did not end in time.");
}
}
finally
{
server.Stop();
}
}

[TestMethod]
public void TestTlsTls()
{
InternalTestSsl(SslProtocols.Tls, SslProtocols.Tls);
}

[TestMethod]
public void TestTlsSsl3()
{
InternalTestSsl(SslProtocols.Tls, SslProtocols.Ssl3);
}

[TestMethod]
public void TestSsl3Tls()
{
InternalTestSsl(SslProtocols.Ssl3, SslProtocols.Tls);
}

TestTlsTls 通过,因为服务器和客户端都定义了要使用的相同协议(protocol)(仅 TLS)。 TestTlsSsl3 的失败也是完全可以理解的(抛出 AuthenticationException 是因为服务器希望使用 TLS,但客户端希望单独使用 SSL3)。

我预计测试“TestSsl3Tls”会因相同的 AuthenticationException 而失败,但相反,我的自定义异常“服务器任务没有及时结束”。被解雇。调试时,我看到只有客户端任务收到 AuthenticationException,而 serverTask 仍在 AuthenticateAsServer 的调用中。交换我的等待命令会导致相反的结果:“TestSsl3Tls”的 AuthenticationException,“TestTlsSsl3”的“客户端没有及时结束”。

这是正常行为吗,AuthenticationException 仅在一侧抛出,另一侧等待(可能是新的身份验证尝试或断开连接)?

最佳答案

我不知道这个行为是否正常的问题的答案,但我认为这是一个错误,我最近遇到了同样的问题,由于我无法控制客户端安全协议(protocol),我的服务器最终卡住了所有时间。

我通过处理 sslstream 解决了这个问题,这会导致 AuthenticateAsServer 出现异常,从而允许我的服务器继续运行。

这是代码片段

    // wait for both server and client task to finish, check results
if (!serverTask.Wait(TimeSpan.FromSeconds(1)))
{
sslStream.Dispose(); // this line will cause an exception in the server task (AuthenticateAsServer), which allows the server to continue ...
}

既然你的问题让我找到了卡住问题的根源,我想我会分享我的解决方案......

关于c# - SslStream.AuthenticateAsServer 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43096996/

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