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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Vadim42  
#1 Оставлено : 26 мая 2020 г. 15:11:21(UTC)
Vadim42

Статус: Новичок

Группы: Участники
Зарегистрирован: 26.05.2020(UTC)
Сообщений: 1
Российская Федерация

Добрый день!

Возникло несколько общих вопросов по процессу подписания pdf файла сертификатом, установленным в хранилище КриптоПро.
1. Я установил и запустил пример (проект Simple35.40), метод Pdf.Sign. Ссылка на CryptoPro.Sharpei используется только в блоке кода, который вызывается, если при запуске метода передан пароль - опциональный параметр.
Код:

            if (args.Length > 2)
            {
                //set password.
                Gost3410CryptoServiceProvider cert_key = certificate.PrivateKey as Gost3410CryptoServiceProvider;
                if (null != cert_key)
                {
                    var cspParameters = new CspParameters();
                    //копируем параметры csp из исходного контекста сертификата
                    cspParameters.KeyContainerName = cert_key.CspKeyContainerInfo.KeyContainerName;
                    cspParameters.ProviderType = cert_key.CspKeyContainerInfo.ProviderType;
                    cspParameters.ProviderName = cert_key.CspKeyContainerInfo.ProviderName;
                    cspParameters.Flags = cert_key.CspKeyContainerInfo.MachineKeyStore
                                      ? (CspProviderFlags.UseExistingKey|CspProviderFlags.UseMachineKeyStore)
                                      : (CspProviderFlags.UseExistingKey);
                    cspParameters.KeyPassword = new SecureString();
                    foreach (var c in args[2])
                    {
                        cspParameters.KeyPassword.AppendChar(c);
                    }
                    //создаем новый контекст сертификат, поскольку исходный открыт readonly
                    certificate = new X509Certificate2(certificate.RawData);
                    //задаем криптопровайдер с установленным паролем
                    certificate.PrivateKey = new Gost3410CryptoServiceProvider(cspParameters);
                }
            }


При этом, запускаю из командной строки с паролем или без - интерфейс КриптоПро всё равно открывает и спрашивает пароль. В чем разница, непонятно.

2. Поскольку, как говорилось выше, ссылка на Sharpei используется только в одном блоке кода, где тогда задается алгоритм хэширования гост2012 в коде?

3. Насколько я понимаю, iTextSharp, использованный в примере, умеет работать с КриптоПро подписями. Умеет ли работать с ними iText7? Есть ли примеры? Найденные мною в сети примеры оперирует с внешней подписью, например так:
Код:

        public void CreateSignature(String src, String dest, String fieldName,
            ICipherParameters pk, X509Certificate[] chain)
        {
            PdfReader reader = new PdfReader(src);
            using (FileStream os = new FileStream(dest, FileMode.Create))
            {
                PdfSigner signer = new PdfSigner(reader, os, new StampingProperties());
 
                IExternalSignatureContainer external = new MyExternalSignatureContainer(pk, chain);
 
                // Signs a PDF where space was already reserved. The field must cover the whole document.
                PdfSigner.SignDeferred(signer.GetDocument(), fieldName, os, external);
            }
        }
 
        class MyExternalSignatureContainer : IExternalSignatureContainer
        {
            protected ICipherParameters pk;
            protected X509Certificate[] chain;
 
            public MyExternalSignatureContainer(ICipherParameters pk, X509Certificate[] chain)
            {
                this.pk = pk;
                this.chain = chain;
            }
 
            public byte[] Sign(Stream inputStream)
            {
                try
                {
                    PrivateKeySignature signature = new PrivateKeySignature(pk, "SHA256");
                    String hashAlgorithm = signature.GetHashAlgorithm();
 
                    PdfPKCS7 sgn = new PdfPKCS7(null, chain, hashAlgorithm, false);
                    byte[] hash = DigestAlgorithms.Digest(inputStream, hashAlgorithm);
                    byte[] sh = sgn.GetAuthenticatedAttributeBytes(hash, PdfSigner.CryptoStandard.CMS,
                        null, null);
                    byte[] extSignature = signature.Sign(sh);
                    sgn.SetExternalDigest(extSignature, null, signature.GetEncryptionAlgorithm());
 
                    return sgn.GetEncodedPKCS7(hash, PdfSigner.CryptoStandard.CMS, null,
                        null, null);
                }
                catch (IOException ioe)
                {
                    throw new Exception(ioe.Message);
                }
            }


4. Имеются следующие (и знакомые многим требования).

Цитата:
Файлы ЭП предоставляются в формате PKCS#7 (RFC-2315) и DER кодировке.
На формат подписи накладываются следующие ограничения:
- Для корневого элемента ContentInfo единственный допустимый contentType - SignedData
- Для всех типов файлов, кроме PDF, подпись должна быть только detached (т.е. для элемента Signed Data/contentInfo/contentType единственное допустимое значение - 1.2.840.113549.1.7.1, а элемент SignedData/contentInfo/content должен отсутствовать). Для PDF файлов допускается как detached, так и attached подпись.
- Для вычисления message digest разрешены алгоритмы ГОСТ Р 34.11-94 и ГОСТ Р 34.11-2012
- Для генерации ЭП разрешены алгоритмы ГОСТ Р 34.10-2001 и ГОСТ Р 34.10-2012
- Разрешено применять только X-509 сертификаты. Сертификаты PKCS#6 запрещены
- Запрещено размещать более одной ЭП в PKCS#7-криптосообщении
- В элементе SignerInfo должны присутствовать следующие authenticated attributes:
contentType (1.2.840.113549.1.9.3), всегда имеет значение 1.2.840.113549.1.7.1
messageDigest (1.2.840.113549.1.9.4), содержит ГОСТ-digest подписываемого файла


Как эти требования задаются в коде в процессе подписания? В объектах ContentInfo, SignedCms, CmsSigner есть соответствующие атрибуты, но они доступны только для чтения.

Спасибо

Отредактировано пользователем 26 мая 2020 г. 15:58:33(UTC)  | Причина: Не указана

Offline Андрей *  
#2 Оставлено : 26 мая 2020 г. 15:32:09(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,630
Мужчина
Российская Федерация

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
Здравствуйте.

Цитата:
3. Имеются следующие (и знакомые многим требования).

Файлы ЭП предоставляются в формате PKCS#7 (RFC-2315) и DER кодировке.
На формат подписи накладываются следующие ограничения:
- Для корневого элемента ContentInfo единственный допустимый contentType - SignedData
- Для всех типов файлов, кроме PDF, подпись должна быть только detached (т.е. для элемента Signed Data/contentInfo/contentType единственное допустимое значение - 1.2.840.113549.1.7.1, а элемент SignedData/contentInfo/content должен отсутствовать). Для PDF файлов допускается как detached, так и attached подпись.
- Для вычисления message digest разрешены алгоритмы ГОСТ Р 34.11-94 и ГОСТ Р 34.11-2012
- Для генерации ЭП разрешены алгоритмы ГОСТ Р 34.10-2001 и ГОСТ Р 34.10-2012
- Разрешено применять только X-509 сертификаты. Сертификаты PKCS#6 запрещены
- Запрещено размещать более одной ЭП в PKCS#7-криптосообщении
- В элементе SignerInfo должны присутствовать следующие authenticated attributes:
contentType (1.2.840.113549.1.9.3), всегда имеет значение 1.2.840.113549.1.7.1
messageDigest (1.2.840.113549.1.9.4), содержит ГОСТ-digest подписываемого файла



Каким образом встроенная подпись в PDF относится к теме?

Или так и attached подпись. - авторы требований подразумевают встроенную подпись в PDF?


Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#3 Оставлено : 26 мая 2020 г. 15:35:32(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,630
Мужчина
Российская Федерация

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
Исходя из требований - должны подписывать файл PDF (как и любой другой тип файлов) и работать с SignedCms, а не с PdfSigner.
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.