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

    @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


    Удачной отладки.
    Ответ написан