关于SslStream握手的问题
最近遇到一个奇怪的问题,使用SslStream做Socket通讯,发现建立Ssl连接很慢,客户端代码如下:
我通过断点调试发现程序走到sslStream.AuthenticateAsClient(CERT_NAME) 就卡在这里了,需要等待10多秒才会继续执行。应该是SslStream在握手的时候耗时了,但是不明白我已经在验证的回调函数处直接返回true,也没有做证书验证,为什么握手还这么慢呢?
另外,只有某些环境下才有这个问题,我猜测可能与网络环境有关,出问题的环境是内网,连不了互联网。
难道SslStream在握手的过程中试图连接了互联网上某个证书验证服务器?
try
{
mTcpClient = new TcpClient(AddressFamily.InterNetwork);
mTcpClient.Connect(address, port);
if (mTcpClient.Connected)
{
if (mIsSSL)
{
SslStream sslStream = new SslStream(mTcpClient.GetStream(), false, (s, cert, chain, err) => true);
sslStream.AuthenticateAsClient(CERT_NAME);
mStream = sslStream;
}
else
{
mStream = mTcpClient.GetStream();
}
mIsConnected = true;
OnConnectionEvent(Defines.EVT_NET_CONNECTED, string.Format("Server connected"));
OnDebug(LogMode.Info,
string.Format("Server connected.\tLocal:{0}\tRemote:{1}", mTcpClient.Client.LocalEndPoint,
mTcpClient.Client.RemoteEndPoint));
//开始接收数据
mStream.BeginRead(mReceiveBuffer, 0, mHeadSize, ReceiveMessageWorker, mStream);
//发送Hello消息
SendHelloMessage();
//启动发送心跳的线程
CreateHeartbeatThread();
}
}
catch (Exception ex)
{
OnDebug(LogMode.Error, string.Format("Connect fail.\t{0}", ex.Message));
optReturn.Result = false;
optReturn.Code = Defines.RET_FAIL;
optReturn.Message = ex.Message;
}我通过断点调试发现程序走到sslStream.AuthenticateAsClient(CERT_NAME) 就卡在这里了,需要等待10多秒才会继续执行。应该是SslStream在握手的时候耗时了,但是不明白我已经在验证的回调函数处直接返回true,也没有做证书验证,为什么握手还这么慢呢?
另外,只有某些环境下才有这个问题,我猜测可能与网络环境有关,出问题的环境是内网,连不了互联网。
难道SslStream在握手的过程中试图连接了互联网上某个证书验证服务器?
...全文
相关推荐
解决.NET6连接低版本SQL Server的TLS握手失败问题[可运行源码]
值得注意的是,此方案必须配合.NET6 SDK 6.0.300及以上版本使用,低版本SDK存在SslStream与BCL加密模块的ABI不兼容问题,可能导致内存泄漏或握手死锁。
C#_FTPS_demo.rar
- 使用SSL/TLS进行安全握手,确保数据传输的加密。- 如何处理证书验证,特别是对于自签名证书的情况。
C# TLS SSL TCP双向认证 X509Store SslStream Certificate
C# TLS SSL TCP双向认证 X509Store SslStream CertificateVisual Studio 2017 命令提示 键入: makecert -r -pe -n “CN
C# TCP 通信(数据、文件的传输)
TCP是一种面向连接的、可靠的传输协议,它通过三次握手建立连接,保证数据的有序和无损传输。
C#网络编程技术教程
TCP通过建立连接来保证数据的可靠传输,它采用三次握手建立连接,确保双方都准备好通信。


