Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Dmitriy  
#1 Оставлено : 7 июля 2009 г. 14:41:31(UTC)
Dmitriy

Статус: Участник

Группы: Участники
Зарегистрирован: 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 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline Dmitriy  
#2 Оставлено : 7 июля 2009 г. 14:50:11(UTC)
Dmitriy

Статус: Участник

Группы: Участники
Зарегистрирован: 13.03.2008(UTC)
Сообщений: 24
Откуда: Russia

Разрывает соединение http.sys, до обработчика запрос не доходит.
В трейсах можно обратить внимание на следующую ошибку:
"SslQueryConnInfoFailed"- "Query for SSL connection parameters failed. Security status: 0xC000000D. Connection will be reset."
Offline Максим Коллегин  
#3 Оставлено : 7 июля 2009 г. 16:07:42(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,391
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 715 раз в 620 постах
Посмотрю.
Платформа x86?
Знания в базе знаний, поддержка в техподдержке
Offline Dmitriy  
#4 Оставлено : 7 июля 2009 г. 16:19:47(UTC)
Dmitriy

Статус: Участник

Группы: Участники
Зарегистрирован: 13.03.2008(UTC)
Сообщений: 24
Откуда: Russia

maxdm написал:
Платформа x86?

Да
Offline Максим Коллегин  
#5 Оставлено : 7 июля 2009 г. 22:15:43(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,391
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 715 раз в 620 постах
Ничего не падает:
Цитата:
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)  | Причина: Не указана

Знания в базе знаний, поддержка в техподдержке
Offline Dmitriy  
#6 Оставлено : 8 июля 2009 г. 11:51:26(UTC)
Dmitriy

Статус: Участник

Группы: Участники
Зарегистрирован: 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()
Offline Dmitriy  
#7 Отправлено: : 8 июля 2009 г. 12:52:25(UTC)
Dmitriy

Статус: Участник

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

Offline Максим Коллегин  
#8 Оставлено : 8 июля 2009 г. 15:08:49(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,391
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 715 раз в 620 постах
воспроизвел
Знания в базе знаний, поддержка в техподдержке
Offline Максим Коллегин  
#9 Оставлено : 8 июля 2009 г. 15:55:15(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,391
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 715 раз в 620 постах
пофиксил, скоро вышлю новый билд для тестирования.
Знания в базе знаний, поддержка в техподдержке
Offline Dmitriy  
#10 Оставлено : 9 июля 2009 г. 12:18:07(UTC)
Dmitriy

Статус: Участник

Группы: Участники
Зарегистрирован: 13.03.2008(UTC)
Сообщений: 24
Откуда: Russia

Билд 3.6.5391 проблему решил.
Не могли бы вы объяснить, за что отвечает параметр clientcertnegotiation? Некоторое представление есть, но хотелось бы все-таки иметь более четкое.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.