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

Уведомление

Icon
Error

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

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

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

Есть .NET-клиент, который отправляет запросы по HTTPS, используя стандартный WebRequest; и HTTP-сервер на HttpListener'е. Периодически, при обращении к серверу в несколько потоков, клиент впадает в ступор: на каждую попытку запроса к серверу в лог валится следующая ошибка:

Код:
System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a receive. ---> System.ComponentModel.Win32Exception: The Local Security Authority cannot be contacted
   at System.Net.SSPIWrapper.AcquireCredentialsHandle(SSPIInterface SecModule, String package, CredentialUse intent, SecureCredential scc)
   at System.Net.Security.SecureChannel.AcquireCredentialsHandle(CredentialUse credUsage, SecureCredential& secureCredential)
   at System.Net.Security.SecureChannel.AcquireClientCredentials(Byte[]& thumbPrint)
   at System.Net.Security.SecureChannel.GenerateToken(Byte[] input, Int32 offset, Int32 count, Byte[]& output)
   at System.Net.Security.SecureChannel.NextMessage(Byte[] incoming, Int32 offset, Int32 count)
   at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
   at System.Net.TlsStream.CallProcessAuthentication(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result)
   at System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.PooledStream.Write(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.ConnectStream.WriteHeaders(Boolean async)
   --- End of inner exception stack trace ---
   at System.Net.HttpWebRequest.GetResponse()


При этом в Application-логе появляются соответствующие ошибки Крипто-Про:

Код:
КриптоПро TLS. Ошибка 0x8009001a при обращении к CSP: Keyset as registered is invalid.

Type: Error
Source: cpSSPCore
EventID: 300


Лечится только перезапуском клиента.

WinXP SP3, .NET Framework SP2, Crypto-Pro 3.0 SP3.

Ниже - тестовый сервер и клиент, с помощью которых можно воспроизвести ошибку. По-видимому, чем больше потоков, тем больше вероятность падения. На тестовой машинке при 32 потоках - падает стабильно. При этом, если уж работает - то без ошибок до перезапуска.

Клиент:
Код:
using System;
using System.Net;
using System.Security.Cryptography.X509Certificates;
using System.Threading;

namespace Client
{
	internal class Program
	{
		private static void Main(string[] args)
		{
			int threadsCount = int.Parse(args[0]);
			serviceUriString = args[1];
			certCommonName = args[2];
			Thread[] threads = new Thread[threadsCount];
			for(int i = 0; i < threadsCount; i++)
			{
				threads[i] = new Thread(Start);
				threads[i].Start();
			}
			for(int i = 0; i < threadsCount; i++)
				threads[i].Join();
		}

		private static void Start()
		{
			while(true)
			{
				try
				{
					Console.WriteLine("Sending request, thread: {0}", Thread.CurrentThread.ManagedThreadId);
					CreateRequest().GetResponse().Close();
					Thread.Sleep(1);
				}
				catch(Exception exception)
				{
					Console.WriteLine(exception);
				}
			}
		}

		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 = 128;
			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;
	}
}


Сервер:
Код:
	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);
			context.Response.ContentType = "text/plain";
			context.Response.ContentLength64 = 0;
			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();
	}

Отредактировано пользователем 19 июля 2010 г. 21:23:11(UTC)  | Причина: Не указана

Offline IvanZzz  
#2 Оставлено : 19 июля 2010 г. 22:31:19(UTC)
IvanZzz

Статус: Активный участник

Группы: Участники
Зарегистрирован: 23.04.2008(UTC)
Сообщений: 519
Мужчина
Откуда: Крипто-Про

Если CSP по КС2, то нужно установить SP3 на CSP: http://www.cryptopro.ru/...d/files/SP3/CSP30SP3.msp
Offline Dmitriy  
#3 Оставлено : 19 июля 2010 г. 22:40:43(UTC)
Dmitriy

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

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

IvanZzz написал:
Если CSP по КС2, то нужно установить SP3 на CSP: http://www.cryptopro.ru/...d/files/SP3/CSP30SP3.msp

KC1 3.0.3300.3, зарегистрирован один считыватель - "Реестр".

Отредактировано пользователем 19 июля 2010 г. 22:46:40(UTC)  | Причина: Не указана

Offline IvanZzz  
#4 Оставлено : 19 июля 2010 г. 22:59:55(UTC)
IvanZzz

Статус: Активный участник

Группы: Участники
Зарегистрирован: 23.04.2008(UTC)
Сообщений: 519
Мужчина
Откуда: Крипто-Про

Попробуйте доставить КриптоПро Winlogon - без лицензии.
Offline Dmitriy  
#5 Оставлено : 19 июля 2010 г. 23:19:44(UTC)
Dmitriy

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

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

IvanZzz написал:
Попробуйте доставить КриптоПро Winlogon - без лицензии.

Забавно, после установки КриптоПро Winlogon, ошибка не повторяется. В чем же состоит такая замечательность Winlogon? :) Можно ли устранить проблему без его установки?

Отредактировано пользователем 19 июля 2010 г. 23:22:15(UTC)  | Причина: Не указана

Offline IvanZzz  
#6 Оставлено : 20 июля 2010 г. 0:50:20(UTC)
IvanZzz

Статус: Активный участник

Группы: Участники
Зарегистрирован: 23.04.2008(UTC)
Сообщений: 519
Мужчина
Откуда: Крипто-Про

Для CSP 3.0 по КС1 "КриптоПро Winlogon" исправляет ошибки TLS.
Offline Dmitriy  
#7 Оставлено : 20 июля 2010 г. 13:07:22(UTC)
Dmitriy

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

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

Поторопился, все-таки проблема не исчезла, хотя поведение немного изменилось (не в лучшую сторону). Проделал все еще раз, установил Winlogon, запустил клиента:

Код:
System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
   at System.Net.HttpWebRequest.GetResponse()


При этом, возможны 2 варианта:
1. После перезагрузки запустить IE и через него законнектиться по HTTPS на сервер. После этого клиент в несколько потоков работает нормально.
2. После перезагрузки сразу запустить клиента в 32 потока. После этого даже через IE SSL-соединение не устанавливается. Перезапуск клиента не помогает, только перезагрузка машины.

В Application-логе все то же самое:
Код:
КриптоПро TLS. Ошибка 0x8009001a при обращении к CSP: Keyset as registered is invalid.


Удалил Winlogon, переустановил CSP, теперь, по крайней мере, перезапуск клиента помогает.

Отредактировано пользователем 20 июля 2010 г. 13:13:52(UTC)  | Причина: Не указана

Offline Максим Коллегин  
#8 Оставлено : 20 июля 2010 г. 13:21:23(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 720 раз в 624 постах
А если поставить CSP 3.6 (последнюю сборку 3.6.1)?
Знания в базе знаний, поддержка в центре поддержки
Offline Dmitriy  
#9 Оставлено : 20 июля 2010 г. 13:30:11(UTC)
Dmitriy

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

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

С CSP 3.6.1 таких проблем не возникает, только это не выход.

UPD: если нужно, могу предоставить образ виртуалки.

Отредактировано пользователем 20 июля 2010 г. 22:08:11(UTC)  | Причина: Не указана

Offline Максим Коллегин  
#10 Оставлено : 20 июля 2010 г. 22:15:50(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 720 раз в 624 постах
В 3.0 много проблем с .net - если есть договор техподдержки - можно рассмотреть вариант private patch. Так же должна помочь установка любого из ФКН-дистрибутивов - подсистема TLS полностью заменяется на новую.
Знания в базе знаний, поддержка в центре поддержки
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.