Форум КриптоПро
»
Устаревшие продукты
»
КриптоПро CSP 3.6
»
Сервер обрывает запрос при использовании SSL-соединения
Статус: Участник
Группы: Участники
Зарегистрирован: 13.03.2008(UTC) Сообщений: 24 Откуда: Russia
|
Здравствуйте. Имеем следующую проблему: при наличии одного "висящего" HTTP-соединения на ip:port (запрос клиента, ответ для которого сервер удерживает), второе соединение на этот же ip:port разрывается на этапе SSL-рукопожатия. При этом, если использовать RSA'шные сертификаты, все работает отлично. Стабильно воспроизводится на Windows 2008 SP1, Крипто Про КС1 CSP 3.6.5371 (или 5031) (протестировано на 2-х машинах). На следующем ПО ошибку воспроизвести не удалось: * Windows Vista SP1, Крипто Про КС1 CSP 3.6.5152 * Windows 2003, Крипто Про КС1 3.0 SP3 (или 3.6.5371) Вот тестовый сервер и клиент, с помощью которых можно воспроизвести ошибку. Клиент:Код:using System;
using System.Net;
using System.Security.Cryptography.X509Certificates;
using System.Threading;
namespace Client
{
internal class Program
{
private static void Main(string[] args)
{
serviceUriString = args[0];
certCommonName = args[1];
Thread thread1 = new Thread(SendRequest);
Thread thread2 = new Thread(SendRequest);
thread1.Start();
Thread.Sleep(5000);
thread2.Start();
thread1.Join();
thread2.Join();
}
private static void SendRequest()
{
Console.WriteLine("Sending request, thread: {0}", Thread.CurrentThread.ManagedThreadId);
CreateRequest().GetResponse().Close();
}
private static HttpWebRequest CreateRequest()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(string.Format("{0}?thread={1}",
serviceUriString, Thread.CurrentThread.ManagedThreadId));
request.ClientCertificates.Add(GetCertificate(certCommonName));
request.ServicePoint.ConnectionLimit = 10;
request.Timeout = 60000;
return request;
}
private static X509Certificate GetCertificate(string commonName)
{
X509Store x509Store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
x509Store.Open(OpenFlags.ReadOnly);
foreach(X509Certificate2 x509Certificate in x509Store.Certificates)
{
string currentCommonName = x509Certificate.GetNameInfo(X509NameType.SimpleName, false);
if(currentCommonName == commonName)
return x509Certificate;
}
x509Store.Close();
throw new Exception("Cert not found");
}
private static string serviceUriString;
private static string certCommonName;
}
}
Сервер:Код:using System;
using System.Net;
using System.Security.Cryptography.X509Certificates;
using System.Threading;
namespace Server
{
internal class Program
{
private static void Main(string[] args)
{
listener.Prefixes.Add(args[0]);
listener.Start();
listener.BeginGetContext(BeginProcessRequest, null);
Thread.Sleep(-1);
}
private static void BeginProcessRequest(IAsyncResult asyncResult)
{
listener.BeginGetContext(BeginProcessRequest, null);
HttpListenerContext context = listener.EndGetContext(asyncResult);
Console.WriteLine("{0}, beginGetClientCert", context.Request.RawUrl);
X509Certificate2 certificate = context.Request.GetClientCertificate();
if(certificate == null)
{
ShowStatusAndCloseRespose(context, 403);
return;
}
string certName = certificate.GetNameInfo(X509NameType.SimpleName, false);
Console.WriteLine("Cert: {0}, request: {1}", certName, context.Request.RawUrl);
Thread.Sleep(30000);
ShowStatusAndCloseRespose(context, 204);
}
private static void ShowStatusAndCloseRespose(HttpListenerContext context, int statusCode)
{
Console.WriteLine("{0}, request: {1}", statusCode, context.Request.RawUrl);
context.Response.StatusCode = statusCode;
try
{
context.Response.Close();
}
catch
{}
}
private static readonly HttpListener listener = new HttpListener();
}
}
В аттаче трейсинги http.sys: * httptrace_fail.xml - случай, когда возникает ошибка (используются ГОСТовские сертификаты); * httptrace_success.xml - используются RSA'шные сертификаты. Вложение(я): httptrace_fail.xml (51kb) загружен 31 раз(а). httptrace_success.xml (56kb) загружен 20 раз(а).У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 13.03.2008(UTC) Сообщений: 24 Откуда: Russia
|
Разрывает соединение http.sys, до обработчика запрос не доходит. В трейсах можно обратить внимание на следующую ошибку: "SslQueryConnInfoFailed"- "Query for SSL connection parameters failed. Security status: 0xC000000D. Connection will be reset."
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,393 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 717 раз в 621 постах
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 13.03.2008(UTC) Сообщений: 24 Откуда: Russia
|
maxdm написал:Платформа x86? Да
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,393 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 717 раз в 621 постах
|
Ничего не падает: Цитата:C:\Users\rt-admin>C:\Users\rt-admin\Desktop\ssl_server.exe https://test-x86-w2k8:88/ /?thread=3, beginGetClientCert Cert: cln512b, request: /?thread=3 /?thread=4, beginGetClientCert Cert: cln512b, request: /?thread=4 204, request: /?thread=3 204, request: /?thread=4 Цитата:C:\Users\rt-admin\Desktop>ssl_client.exe https://test-x86-w2k8:88/ cln512b Sending request, thread: 3 Sending request, thread: 4 Отредактировано пользователем 7 июля 2009 г. 22:28:32(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 13.03.2008(UTC) Сообщений: 24 Откуда: Russia
|
maxdm написал:Ничего не падает: А точно первый запрос дошел до сервера до того, как был отправлен второй запрос с клиента? Если нет, надо подкрутить задержки. Сборка 3.6.5390 проблему не решила. Цитата:Sending request, thread: 3 Sending request, thread: 4
Unhandled Exception: System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a receive. - --> System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. ---> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags) at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) --- End of inner exception stack trace --- at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) at System.Net.FixedSizeReader.ReadPacket(Byte[] buffer, Int32 offset, Int32 count) at System.Net.Security._SslStream.StartFrameHeader(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncReques t) at System.Net.Security._SslStream.StartReading(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest) at System.Net.Security._SslStream.ProcessRead(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest) at System.Net.TlsStream.Read(Byte[] buffer, Int32 offset, Int32 size) at System.Net.PooledStream.Read(Byte[] buffer, Int32 offset, Int32 size) at System.Net.Connection.SyncRead(HttpWebRequest request, Boolean userRetrievedStream, Boolean probeRead) --- End of inner exception stack trace --- at System.Net.HttpWebRequest.GetResponse() at Client.Program.SendRequest() in C:\Dmitriy\projects\Client\Program.cs:line 26 at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart()
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 13.03.2008(UTC) Сообщений: 24 Откуда: Russia
|
Выяснилось, что ошибка воспроизводится при установленном параметре clientcertnegotiation=enable. Цитата:netsh http add sslcert ipport=0.0.0.0:443 appid={00000000–0000–0000–0000–000000000000} certhash=0000000000000000000000000000000000000000 clientcertnegotiation=enable На Vista SP1 тоже воспроизвелась. На 2003 SP2 - нет (negotiate client cert стоит). Отредактировано пользователем 8 июля 2009 г. 13:16:02(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,393 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 717 раз в 621 постах
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,393 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 717 раз в 621 постах
|
пофиксил, скоро вышлю новый билд для тестирования. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 13.03.2008(UTC) Сообщений: 24 Откуда: Russia
|
Билд 3.6.5391 проблему решил. Не могли бы вы объяснить, за что отвечает параметр clientcertnegotiation? Некоторое представление есть, но хотелось бы все-таки иметь более четкое.
|
|
|
|
Форум КриптоПро
»
Устаревшие продукты
»
КриптоПро CSP 3.6
»
Сервер обрывает запрос при использовании SSL-соединения
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close