Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ 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
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 31 раз
Поблагодарили: 703 раз в 612 постах
Какие версии КриптоПро 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
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 31 раз
Поблагодарили: 703 раз в 612 постах
Для начала, установите последние: 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
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 31 раз
Поблагодарили: 703 раз в 612 постах
Нет идей. Сможете предоставить пример для воспроизведения?
Знания в базе знаний, поддержка в техподдержке
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 Лента
Пользователи, просматривающие эту тему
Guest
3 Страницы123>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.