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

Уведомление

Icon
Error

3 Страницы123>
Опции
К последнему сообщению К первому непрочитанному
Offline sadgb  
#1 Оставлено : 4 декабря 2014 г. 16:03:49(UTC)
sadgb

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

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

Сказал(а) «Спасибо»: 4 раз
Здраввствуйте. Столкнулся со следующими проблемами.

Развернут ЦР Криптопро, и сервер на IIS
Сервер на IIS обладает сертификатом подтверждающим его права на выпуск и регистрацию пользователей.

Проблема в том, что после старта сервера IIS первые несколько запросов выполняются и пользователь создается и сертификат выпускается
а после этого пока не перезапустишь сервер на все попытки создать еще пользователей выдает

Цитата:
System.ServiceModel.Security.SecurityNegotiationException: Не удалось установить безопасный канал для SSL/TLS с полномочиями "cp-pek-cr".
---> System.Net.WebException: Запрос был прерван: Не удалось создать защищенный канал SSL/TLS. в System.Net.HttpWebRequest.GetResponse()
в System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)


Все запросы делаются в 1 поток, закрыты lock. Пробовал сделать синглтон SOAP клиента эффект тот же.

Пробовал сделать в Global.asax:

Код:
            //Trust all certificates
            ServicePointManager.ServerCertificateValidationCallback =
                ((sender, certificate, chain, sslPolicyErrors) => true);

            // trust sender
            ServicePointManager.ServerCertificateValidationCallback
                            = ((sender, cert, chain, errors) => true);

            // validate cert by calling a function
            ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, errors) => true;
            ServicePointManager.Expect100Continue = true;
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

но не помогло.

Меня смущает больше всего тот факт, что он несколько ( минимум 1 ) раз работает, а потом сразу эта ошибка.

Привожу свой код:
Код:
 
 
            lock (RaWorkerLock)
            {
                using (var client = CreateCertRequestClient())
                {
                    try
                    {
                        var requestId = client.SubmitRequest(requestStr, "Автоматический запрос");
                        client.AcceptRequest(requestId, SignString(requestStr));

                        var certInfoXml = client.GetCertificateInfo(requestId);
                        var certificateUpdate = GetCertificateFromCertificateInfo(certInfoXml);

                        client.ConfirmRequest(requestId);
                        return certificateUpdate;
                    }
                    catch (Exception e)
                    {
                        throw new RaApiCallFailureException(e);
                    }
                }
            }
            
 
 public RaService.CertRequestSoapPortClient CreateCertRequestClient()
        {
            try
            {
                // Create the binding.
                var myBinding = new BasicHttpBinding
                {
                    Security =
                    {
                        Mode = BasicHttpSecurityMode.Transport,
                        Transport = { ClientCredentialType = HttpClientCredentialType.Certificate }
                    }
                };

                var ea = new
                   EndpointAddress(RaUrl);
                   
                var client = new RaService.CertRequestSoapPortClient(myBinding, ea);

                client.ClientCredentials.ClientCertificate.Certificate = ClientCertificate;

                return client;
            }
            catch (Exception e)
            {
                throw new RaApiCallFailureException(e);
            }
        }
Offline Максим Коллегин  
#2 Оставлено : 4 декабря 2014 г. 21:24:48(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 32 раз
Поблагодарили: 704 раз в 613 постах
Какие версии КриптоПро CSP и .NET?
Знания в базе знаний, поддержка в техподдержке
Offline sadgb  
#3 Оставлено : 5 декабря 2014 г. 12:25:48(UTC)
sadgb

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

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

Сказал(а) «Спасибо»: 4 раз
CSP 3.6.7491 KC2

.net 1.0.5210.0
Offline Максим Коллегин  
#4 Оставлено : 5 декабря 2014 г. 13:27:25(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 32 раз
Поблагодарили: 704 раз в 613 постах
Для начала, установите последние: 3.6.7777 и 1.0.5425.0
Знания в базе знаний, поддержка в техподдержке
Offline sadgb  
#5 Оставлено : 6 декабря 2014 г. 1:05:53(UTC)
sadgb

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

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

Сказал(а) «Спасибо»: 4 раз
Автор: maxdm Перейти к цитате
Для начала, установите последние: 3.6.7777 и 1.0.5425.0


не помогло. Что дальше ?
Offline sadgb  
#6 Оставлено : 10 декабря 2014 г. 11:12:55(UTC)
sadgb

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

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

Сказал(а) «Спасибо»: 4 раз
up
Offline Максим Коллегин  
#7 Оставлено : 10 декабря 2014 г. 12:20:30(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 32 раз
Поблагодарили: 704 раз в 613 постах
Нет идей. Сможете предоставить пример для воспроизведения?
Знания в базе знаний, поддержка в техподдержке
Offline sadgb  
#8 Оставлено : 11 декабря 2014 г. 8:18:08(UTC)
sadgb

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

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

Сказал(а) «Спасибо»: 4 раз
Автор: maxdm Перейти к цитате
Нет идей. Сможете предоставить пример для воспроизведения?


В целом суть такая - если мы создали CertRequestSoapPortClient однажды, то как бы мы не пытались его очистить, при создании и использовании следющих начинается эта ошибка.
Если не очищать или использовать using (var client = CreateCertRequestClient()) то падает на 2-3, если замутить очистку пожестче (см ниже ) то порой удается прожить 5-7 созданий закрытий, но все равно валится.

Код:
var clientProxy = CreateCertRequestClient();

try
{
   .. use your service
   clientProxy.Close();
}
catch(FaultException)
{
   clientProxy.Abort();
}
catch(CommunicationException)
{
   clientProxy.Abort();
}
catch (TimeoutException)
{ 
   clientProxy.Abort();
}



Для воссоздания ситуации понадобятся следующие условия.
Развернутый УЦ / ЦР
Вторая машина с CS{ 3.6.7777 и .net 1.0.5425.0 с установленным сертификатом и закрытым ключом пользователя ЦР.

Прикладываю свой референс на сервис ( RaService ) и класс, работающий с референсом ( RaWorker )

После чего в коде

Код:
var requests = new List<String> { /* сюда вставить 10 самоподписанных запросов на сертификат */ };
foreach ( var request in requests )
{
   var clientCertificate = /* получить клиентский сертификат. У меня он получается каждый раз заново, вам тоже рекомендую, ибо http://www.cryptopro.ru/forum2/default.aspx?g=posts&t=6337 */
   
   var raWorker = new RaWorker( "https://ra-sa/ra/ra.asp", clientCertificate);
   return raWorker.CreateUserAndGetCertificate(request);
}


Для чистоты эксперимента у меня Windows Server 2008 все крутится на .net 4 в рамках Asp.Net MVc в IIS


Код:
using System;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Security.Cryptography.Pkcs;
using System.Security.Cryptography.X509Certificates;
using System.ServiceModel;
using System.Xml.Linq;
using ExceptionsLibrary;

namespace CryptoLibrary.CertificateEnrollment
{
    class RaWorker
    {
        public string RaUrl { get; set; }
        public X509Certificate2 ClientCertificate { get; set; }

        public RaWorker( String raUrl, X509Certificate2 clientCertificate )
        {
            RaUrl = raUrl;
            ClientCertificate = clientCertificate;
        }

        // подписывает содержимое base64 строки и возвращает base64 строку
        public String SignString(String str)
        {
            var encode = SignHelper.SignMsg(Convert.FromBase64String(str), ClientCertificate, detached:false);
            return Convert.ToBase64String(encode);
        }

        public String ResignString(String str)
        {
            var buf = SignHelper.VerifyBuffer(Convert.FromBase64String(str)).Content.Content;
            return SignString(Convert.ToBase64String(buf));
        }

        public X509Certificate2 GetCertificateFromCertificateInfo(String certInfoXml)
        {
            var doc = XDocument.Parse(certInfoXml);
            XNamespace rs = "urn:schemas-microsoft-com:rowset";
            XNamespace z = "#RowsetSchema";
            var certBodyBase64 = doc.Descendants(rs + "data").Elements(z + "row").First().Attribute("PKCS").Value;
            return new X509Certificate2(Convert.FromBase64String(certBodyBase64));
        }


        public X509Certificate2 SubmitAcceptConfirmCertRequest(String requestStr)
        {
            var client = CreateCertRequestClient();

            try
            {
                var requestId = client.SubmitRequest(requestStr, "Автоматический запрос");
                client.AcceptRequest(requestId, SignString(requestStr));

                var certInfoXml = client.GetCertificateInfo(requestId);
                var certificateUpdate = GetCertificateFromCertificateInfo(certInfoXml);
              
                client.ConfirmRequest(requestId);
                return certificateUpdate;
            }
            catch (Exception e)
            {
                throw new RaApiCallFailureException(e);
            }

        }

        public X509Certificate2 SubmitAcceptConfirmFirstCertRequest(String regRequestId, String requestStr)
        {
            var client = CreateCertRequestClient();

            try
            {
                bool unused = true;
                string additionalInfo = null;
                var requestId = client.SubmitFirstCertRequest(regRequestId, requestStr, ref unused, ref additionalInfo);
                client.AcceptFirstRequest(requestId, SignString(requestStr));

                var certInfoXml = client.GetCertificateInfo(requestId);
                var certificateUpdate = GetCertificateFromCertificateInfo(certInfoXml);

                client.ConfirmRequest(requestId);
                return certificateUpdate;
            }
            catch (Exception e)
            {
                throw new RaApiCallFailureException(e);
            }

        }

        public RaService.CertRequestSoapPortClient CreateCertRequestClient()
        {
            try
            {
                // Create the binding.
                var myBinding = new BasicHttpBinding
                {
                    Security =
                    {
                        Mode = BasicHttpSecurityMode.Transport,
                        Transport = { ClientCredentialType = HttpClientCredentialType.Certificate }
                    }
                };


                // Create the endpoint address. Note that the machine name 
                // must match the subject or DNS field of the X.509 certificate
                // used to authenticate the service. 
                var ea = new
                   EndpointAddress(RaUrl);


                var client = new RaService.CertRequestSoapPortClient(myBinding, ea);

                Debug.Assert(client.ClientCredentials != null, "client.ClientCredentials != null");

                client.ClientCredentials.ClientCertificate.Certificate = ClientCertificate;

                return client;
            }
            catch (Exception e)
            {
                throw new RaApiCallFailureException(e);
            }
        }

        public X509Certificate2 CreateUserAndGetCertificate(string selfSignedCertRequestBase64)
        {
            using (var registrationClient = CreateRegistrationClient())
            {
                try
                {
                    var requestId = registrationClient.CreateRequestByAdmin(selfSignedCertRequestBase64, "1", "2",
                        "Автоматическая регистрация");
                    try
                    {
                        registrationClient.AcceptRequest(requestId);
                    }
                    catch (Exception)
                    {
                    }

                    return SubmitAcceptConfirmFirstCertRequest(requestId, selfSignedCertRequestBase64);

                }
                catch (Exception e)
                {
                    throw new RaApiCallFailureException(e);
                }
            }
        }


        public RaService.RegistrationSoapPortClient CreateRegistrationClient()
        {
            try
            {
                // Create the binding.
                var myBinding = new BasicHttpBinding
                {
                    Security =
                    {
                        Mode = BasicHttpSecurityMode.Transport,
                        Transport = { ClientCredentialType = HttpClientCredentialType.Certificate }
                    }
                };


                // Create the endpoint address. Note that the machine name 
                // must match the subject or DNS field of the X.509 certificate
                // used to authenticate the service. 
                var ea = new
                   EndpointAddress(RaUrl);


                var client = new RaService.RegistrationSoapPortClient(myBinding, ea);

                Debug.Assert(client.ClientCredentials != null, "client.ClientCredentials != null");

                client.ClientCredentials.ClientCertificate.Certificate = ClientCertificate;

                return client;
            }
            catch (Exception e)
            {
                throw new RaApiCallFailureException(e);
            }
        }

    }
}

Отредактировано пользователем 11 декабря 2014 г. 8:19:58(UTC)  | Причина: Не указана

Вложение(я):
Service References.zip (21kb) загружен 4 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline sadgb  
#9 Оставлено : 11 декабря 2014 г. 10:32:09(UTC)
sadgb

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

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

Сказал(а) «Спасибо»: 4 раз
Еще в журнале windows заметил следующую ошибку КриптоПРО TLS ошибка 0x57 параметр задан неверно. Источник cpsspap
Появляется 2 ошибки при каждом воспроизведении ошибки описанной в данном треде
Offline sadgb  
#10 Оставлено : 11 декабря 2014 г. 11:18:58(UTC)
sadgb

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

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

Сказал(а) «Спасибо»: 4 раз
Причем в системном журнале пишет подтверждение
Подтверждение SSL успешно выполнено
Далее приведены согласованные параметры шифрование

ПРотокол TLS 1.0
Набор шифров 0х2f
Стойкость обмена 1024
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
3 Страницы123>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.