https-запрос возвращает ошибку: Удаленный хост принудительно разорвал существующее подключение
Делаем https запросы с GOST-сертификатами, на компьютерах установлен КриптоПро CSP, используем класс HttpWebRequest.
В ходе подготовки запроса json-данные пишутся в поток RequestStream.
В итоге после выполнения строчки
Stream reqstream = req.GetRequestStream();
у некоторых клиентов при этом возникает указанная ошибка. В стеке:
в System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
в System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
--- Конец трассировки внутреннего стека исключений ---
в System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
в System.Net.FixedSizeReader.ReadPacket(Byte[] buffer, Int32 offset, Int32 count)
в System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
в System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
в System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
в System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
в System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
в System.Net.TlsStream.CallProcessAuthentication(Object state)
в System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
в System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result)
в System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size)
в System.Net.PooledStream.Write(Byte[] buffer, Int32 offset, Int32 size)
в System.Net.ConnectStream.WriteHeaders(Boolean async)
--- Конец трассировки внутреннего стека исключений ---
в System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)
в System.Net.HttpWebRequest.GetRequestStream()
В протоколе WireShark на сервер отправляется ClientHello. После этого сервер отправляет [ACK], а затем, вместо отправки Alert или ServerHello, немедленно разрывает подключение [RST, ACK] С чем может быть связано такое поведение? В какую сторону покопать?
Ответы (1 шт):
Итог: Все странности были связаны с настройками файервола: ServerHello отбрасывался на входе в сеть из-за того, что сертификат сервера был подписан неизвестным УЦ.