Статус: Участник
Группы: Участники
Зарегистрирован: 16.04.2015(UTC) Сообщений: 27  Откуда: Ярославль Сказал(а) «Спасибо»: 2 раз
|
Есть ли возможность средствами Криптопро.NET создать запрос на отзыв сертификата? ( не используя библиотеки enroll от windows (certadm.dll и т.д. ))? Если да, то где посмотреть пример. Лучше конкретный. Просто пришлось на некоторое время перейти на с#, поэтому не особо в нем разбираюсь. Спасибо.
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Уточните пожалуйста - задача стоит создать запрос на отзыв для обработки на КриптоПро УЦ или вызывать метод ICertAdmin::RevokeCertificate на MSCA? |
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 16.04.2015(UTC) Сообщений: 27  Откуда: Ярославль Сказал(а) «Спасибо»: 2 раз
|
Было необходимо приостановить действие сертификата на сервере не используя ICertAdmin. Разобрался с данной проблемой. Вот пример решения: Код:
enum RevokeReasonEnum : int
{
CRL_REASON_UNSPECIFIED = 0, //Причина не определена
CRL_REASON_KEY_COMPROMISE = 1, //Компрометация ключа
CRL_REASON_CA_COMPROMISE = 2, //Компрометация ЦС
CRL_REASON_AFFILIATION_CHANGED = 3, //Изменение принадлежности
CRL_REASON_SUPERSEDED = 4, //Сертификат заменен
CRL_REASON_CESSATION_OF_OPERATION = 5, //Прекращение действия
CRL_REASON_CERTIFICATE_HOLD = 6, //Приостановка действия
UNHOLD_CERT_REASON = -1 //Восстановление действия сертификата
}
private bool VerifyRequestSign(byte[] encodedSignedCms)
{
// Создаем SignedCms для декодирования и проверки.
SignedCms signedCms = new SignedCms();
// Декодируем сообщение
signedCms.Decode(encodedSignedCms);
// Перехватываем криптографические исключения, для
// возврата о false значения при некорректности подписи.
try
{
// Проверяем подпись. В данном примере не
// проверяется корректность сертификата подписавшего.
signedCms.CheckSignature(true);
}
catch (System.Security.Cryptography.CryptographicException ex)
{
return Logger.LoggerCA(ex);
}
return true;
}
//Подпись запроса
private string SignData(string request, X509Certificate2 certificate)
{
//Данные заявки в формате UTF-8
var data = Encoding.Unicode.GetBytes(request);
// Создаем объект ContentInfo по сообщению.
// Это необходимо для создания объекта SignedCms.
var content = new ContentInfo(data);
// Создаем объект SignedCms по только что созданному
// объекту ContentInfo.
var signedCms = new SignedCms(content);
// Определяем подписывающего, объектом CmsSigner.
var signer = new CmsSigner(certificate);
// Подписываем CMS/PKCS #7 сообщение.
signedCms.ComputeSignature(signer);
// Кодируем CMS/PKCS #7 подпись сообщения.
var signedbytes = signedCms.Encode();
VerifyRequestSign(signedbytes);
//Кодируем в base64
return Convert.ToBase64String(signedbytes);
}
public bool HoldCertificate(string certificate_serial)
{
string request = request = "SN=" + certificate_serial + ", RR=" + (int)RevokeReasonEnum.CRL_REASON_CERTIFICATE_HOLD + ", RC=Тестовый запрос, HD=0-0-0-0-2-0";
string RequestID = "";
string SignedRequestOperator = SignData(request, cert_operator);
if (SignedRequestOperator == String.Empty)
Logger.LoggerCA("CAConnection::HoldCertificate::Отсутствует подписанный запрос от оператора");
RequestID = port_user.SubmitHoldRequest(SignedRequestOperator);
string SignedRequestAdmin = SignData(SignedRequestOperator, cert_admin);
if (SignedRequestAdmin == String.Empty)
Logger.LoggerCA("CAConnection::HoldCertificate::Отсутствует подписанный запрос от администратора");
port_admin.AcceptRequest(RequestID, SignedRequestAdmin);
return true;
}
public bool UnholdCertificate(string certificate_serial)
{
string request = request = "SN=" + certificate_serial + ", RR=" + (int)RevokeReasonEnum.UNHOLD_CERT_REASON + ", RC=Тестовый запрос";
string RequestID = "";
string SignedRequestOperator = SignData(request, cert_operator);
if (SignedRequestOperator == String.Empty)
Logger.LoggerCA("CAConnection::HoldCertificate::Отсутствует подписанный запрос от оператора");
RequestID = port_user.SubmitUnholdRequest(SignedRequestOperator).ToString();
string SignedRequestAdmin = SignData(SignedRequestOperator, cert_admin);
if (SignedRequestAdmin == String.Empty)
Logger.LoggerCA("CAConnection::HoldCertificate::Отсутствует подписанный запрос от администратора");
port_admin.AcceptRequest(RequestID, SignedRequestAdmin);
return true;
}
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 16.04.2015(UTC) Сообщений: 27  Откуда: Ярославль Сказал(а) «Спасибо»: 2 раз
|
А на самом деле было бы неплохо увидеть наконец документацию для разработчиков на С#, да и на С++. Т.к. на данный момент все примеры в документации на Basic, что очень напрягает
|
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close