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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline sniker  
#1 Оставлено : 23 января 2017 г. 15:43:58(UTC)
sniker

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

Группы: Участники
Зарегистрирован: 16.01.2013(UTC)
Сообщений: 33
Российская Федерация

Сказал(а) «Спасибо»: 15 раз
Приветствую!

В дистрибутиве УЦ есть пример клиента на C# для работы с УЦ.
Код:
                var userId = client.RegisterUser();
                client.RenameUser(userId);
                var certId = client.IssueCertificate(userId);
                client.RevokeCertificate(certId);


Регистрация и переименование пользователя проходят успешно, но далее программа вылетает с ошибкой при выпуске сертификата.

Код:
public static string IssueCertificate(this RegAuthLegacyContractClient client, string userId)
{
 ...
 var requestString = "<здесь Base64 данные запроса на сертификат>";
 //var rawRequest = Helper.MakeRawRequest(request.RawData);
 var rawRequest = Helper.MakeRawRequest(BitConverter.ToString(Convert.FromBase64String(requestString)));
 var certRequestId = client.SubmitAndAcceptCertRequest(userId, rawRequest, null, null, false);
 ...
}



Ошибка происходит на SubmitAndAcceptCertRequest
Exception.toString выдаёт Недостаточно прав или объект не найден.
В консоли управления ЦР появляется запрос со статусом Отклонён ЦС
В журнале ошибок приложения появляется ошибка
Цитата:
Код события: 4006
Сообщение о событии: Проверка членских удостоверений не удалась.


Вариант 2.
Выполняем операцию в 2 этапа.
Сначала вызываем SubmitCertRequest для отправки запроса - Отрабатывает без ошибок. Запрос появляется в консоли ЦР со статусом Новый
Далее вызываем AcceptCertRequest для подтверждения запроса - Вылезает та же ошибка что и при выполнении SubmitAndAcceptCertRequest. В консоли и журнале те же сообщения об ошибке.

Вариант 3.
Вызываем SubmitCertRequest для создания запроса. Затем вручную в консоли ЦР одобряем запрос - всё проходит на УРА без ошибок.

Для сравнения используем вариант 4.
Там же в дистрибутиве берём пример VBS скрипта Test-CreateCert.vbs для аналогичной операции.
Код:
Dim rawRequest
rawRequest = "<здесь Base64 данные подписанного запроса на сертификат, значение rawRequest из кода выше>"

WScript.Echo objClient.SubmitAndAcceptCertRequest(userId, rawRequest, comment, authName, False)
WScript.Echo "Запрос подан и одобрен"

rawRequest был сгенерирован в C# коде и вставлен вручную в VBS скрипт
Запрос проходит успешно и без ошибок.

Итог.При C# запросе, судя по ошибкам, не хватает прав у того кто отправляет запрос. Но во всех случаях при подписи использовался один и тот же сертификат пользователя, у которого в консоли ЦР проставлены права на выполнение любых действий. Он состоит во всех группах безопасности.

Не понятно почему не работает код на C# из примера, но в тоже время работает код на vbs.
Конечно можно сказать, что раз VBS работает так его и используйте, но мы планируем уйти от VBS. Он заставляет для каждого скрипта вызывать %windir%\SysWoW64\wscript.exe.
Приложение на C# можно правильнее интегрировать в систему уменьшив количество костылей.

Есть идеи?

Отредактировано пользователем 24 января 2017 г. 14:39:03(UTC)  | Причина: Не указана

Offline Kirill Sobolev  
#2 Оставлено : 23 января 2017 г. 15:50:06(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
В vbs скрипте Вы задаете имя ЦС, на котором будет выпущен сертификат? А в примере на C#?
Техническую поддержку оказываем тут
Наша база знаний
Offline sniker  
#3 Оставлено : 23 января 2017 г. 16:16:53(UTC)
sniker

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

Группы: Участники
Зарегистрирован: 16.01.2013(UTC)
Сообщений: 33
Российская Федерация

Сказал(а) «Спасибо»: 15 раз
на vbs создаю клиента objClient:
Код:
adminCertName = "nik2"
wsdlURL = "https://ra3/ra/RegAuthLegacyService.svc?singleWsdl"
Dim adminCertNameWithStore: adminCertNameWithStore = "CURRENT_USER\My\" & adminCertName

Dim objSrvXMLHTTP: Set objSrvXMLHTTP = CreateObject("MSXML2.ServerXMLHTTP")
objSrvXMLHTTP.setOption SXH_OPTION_SELECT_CLIENT_SSL_CERT, adminCertNameWithStore
objSrvXMLHTTP.open "GET", wsdlURL
objSrvXMLHTTP.send
Dim wsdl: wsdl = objSrvXMLHTTP.responseText

Dim objClient: Set objClient = CreateObject("MSSOAP.SoapClient30")
objClient.mssoapinit wsdl, "RegAuthLegacyService", "RegAuthLegacyServiceEndpoint"
objClient.ConnectorProperty("SSLClientCertificateName") = adminCertNameWithStore


на C# заполняю заполняю App.config
Код:
...
      <client>
        <!-- В атрибут address скопируйте адрес сервиса -->
        <endpoint address="https://ra3/RA/RegAuthLegacyService.svc"
                  binding="basicHttpBinding"
                  contract="ServiceReference1.RegAuthLegacyContract" />
      </client>
...

Код:
      <behaviors>
        <endpointBehaviors>
          <behavior>
            <clientCredentials>
              <!-- В атрибут findValue перепечатайте отпечаток сертификата без пробелов -->
              <clientCertificate x509FindType="FindByThumbprint" findValue="7d6124c3b1002461b5ce5927ce8847386607d507" />
            </clientCredentials>
          </behavior>
        </endpointBehaviors>
      </behaviors>


В обоих случаях заполняю точку доступа к ЦР и выбираю клиентский сертификат.

А где можно задать имя ЦС?
Offline Kirill Sobolev  
#4 Оставлено : 23 января 2017 г. 16:31:27(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
В самом методе SubmitAndAcceptCertRequest - 4й параметр.
Техническую поддержку оказываем тут
Наша база знаний
Offline sniker  
#5 Оставлено : 23 января 2017 г. 19:25:41(UTC)
sniker

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

Группы: Участники
Зарегистрирован: 16.01.2013(UTC)
Сообщений: 33
Российская Федерация

Сказал(а) «Спасибо»: 15 раз
Спасибо. Нашёл причину. d'oh!
Цитата:
var requestString = "<здесь Base64 данные запроса на сертификат>";


Запрос был сгенерирован заранее в IE на JavaScript и вставлен в код. При первом запуске всё работает, а при последующих старый запрос не будет работать.
Причём 4й параметр можно оставить NULL.

Теперь другой вопрос, он же причина такой схемы.
Код в C# не генерирует запрос (из-за чего запрос пришлось вставлять из другого места)
Код:
            var privateKey = new CX509PrivateKey()
            {
            // Очевидно, что перечисление X509ProviderType не было рассчитано на ГОСТ-провайдеры.
            // Однако, принимая во внимание, что в .NET перечисление является, по сути, 
            // оберткой над целочисленным типом, мы можем на свой страх и риск писать так:
                ProviderType = (X509ProviderType)PROV_GOST_2001_DH
            };
            var request = new CX509CertificateRequestPkcs10();
            request.InitializeFromPrivateKey(X509CertificateEnrollmentContext.ContextUser, privateKey, "User");
            request.Encode();


InitializeFromPrivateKey выкидывает исключение
Цитата:
System.Runtime.InteropServices.COMException (0x80094015): CertEnroll::CX509CertificateRequestPkcs10::InitializeFromPrivateKey: Сервер политик регистрации не найден. 0x80094015 (-2146877419)
в CERTENROLLLib.IX509CertificateRequestPkcs10V2.InitializeFromPrivateKey(X509CertificateEnrollmentContext Context, CX509PrivateKey pPrivateKey, String strTemplateName)
в Client.Samples.IssueCertificate(RegAuthLegacyContractClient client, String userId) в C:\sdk\samples\RegAuthLegacySamples\Client\Samples.cs:строка 86
в Client.Program.Main(String[] args) в C:\sdk\samples\RegAuthLegacySamples\Client\Program.cs:строка 27


С этим что-то можно сделать?

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

Offline Kirill Sobolev  
#6 Оставлено : 23 января 2017 г. 21:20:22(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Передавайте string.Empty вместо "User".
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Кирилл Соболев за этот пост.
sniker оставлено 24.01.2017(UTC)
Offline sniker  
#7 Оставлено : 24 января 2017 г. 14:37:40(UTC)
sniker

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

Группы: Участники
Зарегистрирован: 16.01.2013(UTC)
Сообщений: 33
Российская Федерация

Сказал(а) «Спасибо»: 15 раз
Еще раз спасибо.
Всё получилось.

После использования string.Empty вылезла ошибка при вызове SubmitAndAcceptCertRequest
Цитата:
Сервер не смог обработать запрос в связи с внутренней ошибкой. Для получения дополнительных сведений об ошибке либо включите IncludeExceptionDetailInFaults (с помощью атрибута ServiceBehaviorAttribute или через поведение < serviceDebug >) на сервере для того чтобы выслать информацию об исключении назад клиенту, или включить трассировку согласно инструкции Microsoft .NET Framework SDK и проверить записи журнала трассировки клиента.


После сравнения с кодом создания PKCS10 запроса в vbs внес изменения по аналогии
Код:
            var privateKey = new CX509PrivateKey()
            {
            // Очевидно, что перечисление X509ProviderType не было рассчитано на ГОСТ-провайдеры.
            // Однако, принимая во внимание, что в .NET перечисление является, по сути, 
            // оберткой над целочисленным типом, мы можем на свой страх и риск писать так:
                ProviderType = (X509ProviderType)PROV_GOST_2001_DH
            };
            var request = new CX509CertificateRequestPkcs10();
            request.InitializeFromPrivateKey(X509CertificateEnrollmentContext.ContextUser, privateKey, string.Empty);

            var objObjectId = new CObjectId();
            objObjectId.InitializeFromValue("1.2.643.2.2.46.0.8");

            var objTemplateExt = new CX509ExtensionTemplate();
            objTemplateExt.InitializeEncode(objObjectId, 1, 0);

            request.X509Extensions.Add((CX509Extension)objTemplateExt);
            request.Encode();


Такой вариант заработал, только необходимо предварительно узнать ОИД шаблона для сертификата.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.