@noname_shaman

Есть ли возможность вытащить информацию о владельце сертификата из файла с расширением.sig?

Добрый день, есть СОС, есть xml файлы подписанные и имеющие расширение .sig, какой механизм есть для вытягивая информации о владельце сертификата из этого подписанного файла и сверки его по СОС? КриптоАРМ не подходит так как файлов будет очень много и в ручную все это вытаскивать сложно.
  • Вопрос задан
  • 6492 просмотра
Решения вопроса 1
@polarnik
Тестировщик
Раз говорите о КриптоАРМ, то полагаю, речь об алгоритме ГОСТ. Если будете использовать OpenSSL, как советуют выше, то ищите OpenSSL с поддержкой ГОСТ. Вот соответствующая сборка: www.cryptocom.ru/opensource

Те файлы sig, с которыми сталкивался, использовались при сдаче отчётности в электронном виде. Пара счёт-фактура + подпись, также в комплекте шел набор CRL-файлов со списками отзыва на момент подписания. Сама же подпись шла в формате, близком к формату CAdES-C (Electronic Signature with Complete Data References). Отсоединённая подпись.

В такой подписи есть:
  • сертификат подписанта
  • сама подпись
  • штамп времени
  • цепочка сертификатов (от сертификата подписанта до сертификата головного УЦ)

Проверить корректность подписи, проверить состояние сертификата по списку отзыва на текущий момент и получить цепочку сертификатов можно нехитрым кодом на C#:
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.Pkcs;
public class SignChecker
{
    public X509Certificate2Collection CheckDetachedSignatureAndGetChain
        (byte[] data, byte[] sign)
    {
        var contentInfo = new ContentInfo(data);
        //    true => DetachedSignature
        var signedCms = new SignedCms(contentInfo, true);
        signedCms.Decode(sign);
        //http://msdn.microsoft.com/ru-ru/library/aedbc064%28v=vs.110%29.aspx
        //    false => verifySignature + verifyChain
        signedCms.CheckSignature(false);
        return signedCms.Certificates;
    }
}

Метод проверит подпись и отозванность сертификатов и вернёт сертификаты вам для дальнейшей проверки.

При правильной проверке следует помнить о штампе времени в подписи. Даже если сертификат отозван (был отозван вчера, например), а штамп времени говорит, что подпись была поставлена два года назад и штамп достоверен. То следует проверять состояние сертификата по списку отзыва на момент двухлетней давности.

КриптоАРМ так и проверяет. Если же будете делать свой механизм проверки, проверяя сертификаты отдельно от подписи и штампа времени в ней, то методы CryptoAPI вернут состояние сертификатов на текущий момент времени. И сертификаты из исторических подписей, которые сегодня отозваны, но были действительны два года назад, сломают цепочку, проверка завершится неудачно.

Перед вызовом проверки (signedCms.CheckSignature(false)), убедитесь, что у программы будет возможность работы с Интернет. Так как если возможности работы с Интернет нет (прокси, например, не настроен), то списки отзыва не загрузятся. И проверка без актуальных списков отзыва о OCSP-ответов будет всегда завершаться успешно. Даже если некоторые сертификаты уже отозваны.

OCSP-ответы и списки отзыва кешируются. Поэтому не удивляйтесь, если они вдруг перестанут загружаться. Проверка по ним работает. Очистить кеш можно командами:
  • certutil urlcache crl delete
  • certutil urlcache ocsp delete


Удачной отладки.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Kenshir007
Файл sig можно переименовать в .p7b. Тогда он откроется как контейнер и в нем будет личный сертификат и скорее всего корневой сертификат уц. Вытащить можно OpenSSL
Update:
Утилита CertMgr позволяет вытащить ключ из p7b без танцев с бубном certmgr.exe -path2your.p7b -put path2output -c
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы