Статус: Новичок
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|