Раз говорите о КриптоАРМ, то полагаю, речь об алгоритме ГОСТ. Если будете использовать 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
Удачной отладки.