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

Уведомление

Icon
Error

3 Страницы<123
Опции
К последнему сообщению К первому непрочитанному
Offline sadgb  
#21 Оставлено : 21 июня 2013 г. 9:58:04(UTC)
sadgb

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

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

Сказал(а) «Спасибо»: 4 раз
Автор: Kirill Sobolev Перейти к цитате
Цитата:
Причем один и тот же сертификат добавлен в оба места

с помощью панели управления CSP?


Сертификат я добавлял программно в X509Store

Через панель управления CSP у меня на компьютере почему то можно работать столько с контейнерами текущего пользователя ( я писал об этом выше )
Offline Kirill Sobolev  
#22 Оставлено : 21 июня 2013 г. 14:39:51(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Цитата:
Через панель управления CSP у меня на компьютере почему то можно работать столько с контейнерами текущего пользователя ( я писал об этом выше )

Запустите ее от администратора, там есть ссылка на первой вкладке.
Техническую поддержку оказываем тут
Наша база знаний
Offline sadgb  
#23 Оставлено : 24 июня 2013 г. 14:19:28(UTC)
sadgb

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

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

Сказал(а) «Спасибо»: 4 раз
На энный день удалось вот что отловить - если сгенерировать строку запроса ( requestStr ) в коде и сохранить ее значение в переменную, а потом закомментировать код генерации это строки и подсунуть в метод SubmitRequest сохраненную с прошлого запуска строку, то все работает!

И я решил выяснить какая же строка мешает работе и оказалось, что
signedCms.ComputeSignature(cmsSigner, true);

Если ее закомментировать, то SubmitRequest прекрасно работает ( используем строку сгенерированную при прошлых запусках ), если ее раскомментить, то даже используя заведомо сохраненную строку запроса клиент не может связаться с сервером - ошибка все та же - Could not establish secure channel for SSL/TLS with authority 'ra-sa'.

Похоже либо я что-то принципиально не так делаю, либо я столкнулся с какой-то внутренней ошибкой в реализации Crypto-pro.
Пожалуйста, помогите мне с этой проблемой. Готов предоставить любые данные кроме доступа к серверу ra-sa.

Прикладываю свой код


Код:
   var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
            store.Open(OpenFlags.ReadOnly);
            var saCert = store.Certificates[0];


            // Create the binding.
            var myBinding = new BasicHttpBinding();
            myBinding.Security.Mode = BasicHttpSecurityMode.Transport;
            myBinding.Security.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. 
            EndpointAddress ea = new
               EndpointAddress("https://RA-SA/RA/RA.asp");

           
           
           var cspInformations = new CCspInformations();

            cspInformations.AddAvailableCsps();

            var key = new CX509PrivateKey
            {
                ProviderType = (X509ProviderType)75,
                KeySpec = X509KeySpec.XCN_AT_SIGNATURE,
                KeyUsage = X509PrivateKeyUsageFlags.XCN_NCRYPT_ALLOW_ALL_USAGES,
                MachineContext = false,
                ExportPolicy = X509PrivateKeyExportFlags.XCN_NCRYPT_ALLOW_EXPORT_FLAG,
                CspInformations = cspInformations,
                ContainerName = Guid.NewGuid().ToString()
            };

            
            IX509CertificateRequestPkcs10 request = new CX509CertificateRequestPkcs10();
            request.InitializeFromPrivateKey(X509CertificateEnrollmentContext.ContextUser, key, null);

            // Задаем DN.
            request.Subject = new CX500DistinguishedNameClass();
            request.Subject.Encode(saCert.Subject);
            

            // Добавляем Extended Key Usage: Проверка подлинности клиента (1.3.6.1.5.5.7.3.2)
            var clientAuth = new CObjectId();
            clientAuth.InitializeFromName(CERTENROLL_OBJECTID.XCN_OID_PKIX_KP_CLIENT_AUTH);

            //  Пользователь Центра Регистрации, HTTP, TLS клиент (1.2.643.2.2.34.6)
            var tlsClient = new CObjectId();
            tlsClient.InitializeFromValue("1.2.643.2.2.34.6");

            var ekuIds = new CObjectIds { clientAuth, tlsClient };

            var ekuExtension = new CX509ExtensionEnhancedKeyUsage();
            ekuExtension.InitializeEncode(ekuIds);

            request.X509Extensions.Add((CX509Extension)ekuExtension);

            // Добавляем Key Usage: Digital Signature, Non-Repudiation, 
            // Key Encipherment, Data Encipherment (f0)
            var keyUsage = new CX509ExtensionKeyUsage();

            // ReSharper disable BitwiseOperatorOnEnumWithoutFlags
            keyUsage.InitializeEncode(
                CERTENROLLLib.X509KeyUsageFlags.XCN_CERT_DIGITAL_SIGNATURE_KEY_USAGE
                | CERTENROLLLib.X509KeyUsageFlags.XCN_CERT_NON_REPUDIATION_KEY_USAGE
                | CERTENROLLLib.X509KeyUsageFlags.XCN_CERT_KEY_ENCIPHERMENT_KEY_USAGE
                | CERTENROLLLib.X509KeyUsageFlags.XCN_CERT_DATA_ENCIPHERMENT_KEY_USAGE);
            request.X509Extensions.Add((CX509Extension)keyUsage);
            // ReSharper restore BitwiseOperatorOnEnumWithoutFlags

            // Кодируем запрос.
            request.Encode();

            // Объект, реализующий IX509Enrollment
            var enrollment = new CX509Enrollment();

            // Строка с запросом:
            enrollment.InitializeFromRequest(request);


            var contentInfo = new ContentInfo(Encoding.UTF8.GetBytes(enrollment.CreateRequest()));
            var signedCms = new SignedCms(contentInfo, false);

            
            var cmsSigner = new CmsSigner(saCert);
            signedCms.ComputeSignature(cmsSigner, true);
            var encode = signedCms.Encode();
            var requestStr = Convert.ToBase64String(encode);
            var client = new RaService.CertRequestSoapPortClient(myBinding, ea);
            client.ClientCredentials.ClientCertificate.Certificate = saCert;

           var requestId = client.SubmitRequest(requestStr, "1");
           Console.WriteLine(requestId);
            Console.ReadKey();
Offline Kirill Sobolev  
#24 Оставлено : 24 июня 2013 г. 15:05:20(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Какая ОС и версия CSP?
Техническую поддержку оказываем тут
Наша база знаний
Offline sadgb  
#25 Оставлено : 24 июня 2013 г. 15:56:53(UTC)
sadgb

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

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

Сказал(а) «Спасибо»: 4 раз
Windows 7 x64 UAC отключен
Криптопро
Ядро СКЗИ 3.6.5364 KC1
Версия продукта 3.6.7491

Прикладываю osinfo
Вложение(я):
osinfo.xml (79kb) загружен 3 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline sadgb  
#26 Оставлено : 25 июня 2013 г. 9:42:30(UTC)
sadgb

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

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

Сказал(а) «Спасибо»: 4 раз
И вот к какому выводу удалось придти после еще эн часов раздумий.
Когда вы используете сертификат для того, чтобы подписать что-либо, криптопро ( или windows ) его ломает, и дальше уже использовать его нельзя, потому что он как бы "сломанный". И надо опять получить его из хранилища! И вот тогда все работает!

Так что я делаю
store.Close()
store.Open(...)
saCert = store.Certificates[0]; // эта строчка для примера, в реальном коде я получаю его по отпечатку

и только после этого создаю клиент.
Offline Павел Смирнов  
#27 Оставлено : 25 июня 2013 г. 10:01:35(UTC)
Павел Смирнов

Статус: Вам и не снилось

Группы: Администраторы
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 831
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 48 раз в 44 постах
В реализации класса SingedCms от Microsoft имеется ошибка. В некоторых случаях он закрывает дескриптор криптопровайдера, связанный с сертификатом для подписи.
Техническую поддержку оказываем тут.
Наша база знаний.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
3 Страницы<123
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.