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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Алекей  
#1 Оставлено : 11 августа 2015 г. 16:00:59(UTC)
Алекей

Статус: Участник

Группы: Участники
Зарегистрирован: 16.04.2015(UTC)
Сообщений: 27
Российская Федерация
Откуда: Ярославль

Сказал(а) «Спасибо»: 2 раз
Есть ли возможность средствами Криптопро.NET создать запрос на отзыв сертификата? ( не используя библиотеки enroll от windows (certadm.dll и т.д. ))?
Если да, то где посмотреть пример. Лучше конкретный. Просто пришлось на некоторое время перейти на с#, поэтому не особо в нем разбираюсь. Спасибо.
Offline Kirill Sobolev  
#2 Оставлено : 11 августа 2015 г. 20:41:58(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Уточните пожалуйста - задача стоит создать запрос на отзыв для обработки на КриптоПро УЦ или вызывать метод ICertAdmin::RevokeCertificate на MSCA?
Техническую поддержку оказываем тут
Наша база знаний
Offline Алекей  
#3 Оставлено : 14 августа 2015 г. 15:47:52(UTC)
Алекей

Статус: Участник

Группы: Участники
Зарегистрирован: 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;
        }
 
Offline Алекей  
#4 Оставлено : 14 августа 2015 г. 15:49:36(UTC)
Алекей

Статус: Участник

Группы: Участники
Зарегистрирован: 16.04.2015(UTC)
Сообщений: 27
Российская Федерация
Откуда: Ярославль

Сказал(а) «Спасибо»: 2 раз
А на самом деле было бы неплохо увидеть наконец документацию для разработчиков на С#, да и на С++. Т.к. на данный момент все примеры в документации на Basic, что очень напрягает
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.