Форум КриптоПро
»
КриптоПро УЦ
»
КриптоПро УЦ 2.0
»
Ошибка при выпуске сертификата (пример из дистрибутива УЦ 2.0)
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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);
...
}
Ошибка происходит на SubmitAndAcceptCertRequestException.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)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
В vbs скрипте Вы задаете имя ЦС, на котором будет выпущен сертификат? А в примере на C#? |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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>
В обоих случаях заполняю точку доступа к ЦР и выбираю клиентский сертификат. А где можно задать имя ЦС?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
В самом методе SubmitAndAcceptCertRequest - 4й параметр. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 16.01.2013(UTC) Сообщений: 33  Сказал(а) «Спасибо»: 15 раз
|
Спасибо. Нашёл причину. Цитата: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)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Передавайте string.Empty вместо "User". |
|
 1 пользователь поблагодарил Кирилл Соболев за этот пост.
|
sniker оставлено 24.01.2017(UTC)
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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();
Такой вариант заработал, только необходимо предварительно узнать ОИД шаблона для сертификата.
|
|
|
|
Форум КриптоПро
»
КриптоПро УЦ
»
КриптоПро УЦ 2.0
»
Ошибка при выпуске сертификата (пример из дистрибутива УЦ 2.0)
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close