N
N
noname_shaman2015-01-20 19:33:05
Information Security
noname_shaman, 2015-01-20 19:33:05

Is it possible to extract certificate owner information from a .sig file?

Good afternoon, there is SOS, there are xml files signed and having the .sig extension, what mechanism is there for pulling information about the owner of the certificate from this signed file and verifying it against SOS? CryptoARM is not suitable because there will be a lot of files and it is difficult to pull it all out manually.

Answer the question

In order to leave comments, you need to log in

2 answer(s)
V
Vyacheslav Smirnov, 2015-01-20
@noname_shaman

Раз говорите о КриптоАРМ, то полагаю, речь об алгоритме ГОСТ. Если будете использовать OpenSSL, как советуют выше, то ищите OpenSSL с поддержкой ГОСТ. Вот соответствующая сборка: www.cryptocom.ru/opensource
Те файлы sig, с которыми сталкивался, использовались при сдаче отчётности в электронном виде. Пара счёт-фактура + подпись, также в комплекте шел набор CRL-файлов со списками отзыва на момент подписания. Сама же подпись шла в формате, близком к формату CAdES-C (Electronic Signature with Complete Data References). Отсоединённая подпись.
В такой подписи есть:
You can check the correctness of the signature, check the status of the certificate according to the revocation list at the current moment, and get the chain of certificates using a simple C# code:

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 вернут состояние сертификатов на текущий момент времени. И сертификаты из исторических подписей, которые сегодня отозваны, но были действительны два года назад, сломают цепочку, проверка завершится неудачно.
Before calling check (signedCms.CheckSignature(false)), make sure that the program will be able to work with the Internet. Since if there is no possibility of working with the Internet (for example, the proxy is not configured), then the recall lists will not be loaded. And checking without up-to-date OCSP response revocation lists will always succeed. Even if some certificates have already been revoked.
OCSP responses and revocation lists are cached. So don't be surprised if they suddenly stop loading. Checking for them works. You can clear the cache with the commands:
Happy debugging.

K
Kenshir007, 2015-01-20
@Kenshir007

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

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question