здесь, в Италии, нам потребуется цифровая подпись всех счетов с января 2019 года.
Я нашел код, который хорошо работает с sha-1, но мне нужно использовать sha256 в качестве стандарта.Приведенный ниже код, после успешного определения USB-ключа и запроса сертификата для использования, попробуйте подписать файл «NomeFile» После и вывести в «NomeFile» .p7m, когда строка
signatureCms.ComputeSignature (signer,false);
выполняется, это происходит: 1 - если использовать sha-1, он запрашивает PIN-код и документ успешно создан.2 - если использовать sha-256, не спрашивайте PIN-код и выдает мне неизвестную ошибку -1073741275
Я прочитал много старых постов (2011-2014).У других людей такая же проблема, и кажется, что у Microsoft есть какая-то ошибка с использованием sha256.
Сейчас мы находимся в конце 2018 года, и я пробовал этот код в .net 4, 4.6.1 и 4.7.2, но ошибкато же самое.
Кто-нибудь может сказать мне, если Microsoft исправит проблему с sha256 и что это может быть за странная ошибка?(-1073741275) стек ошибок
public String FirmaFile(String NomeFile, DateTime DataFirma, X509Certificate2 cert, out string RisFirma)
{
String NomeFirma = NomeFile + ".p7m";
RisFirma = "";
try
{
// content contiene il file da firmare
ContentInfo content = new ContentInfo((File.ReadAllBytes(NomeFile)));
// assegniamo content ad un oggetto di tipo SignedCms
SignedCms signedCms = new SignedCms(SubjectIdentifierType.IssuerAndSerialNumber, content, false);
// si instanzia un oggetto CmsSigner che espone i metodi di firma.
CmsSigner signer = new CmsSigner(cert);
signer.IncludeOption = X509IncludeOption.EndCertOnly;
//signer.DigestAlgorithm = new Oid("2.16.840.1.101.3.4.2.1");
signer.DigestAlgorithm = new Oid("SHA256");
signer.SignedAttributes.Add(new Pkcs9SigningTime(DataFirma));
try
{
// Viene calcolata la firma del file (in formato PKCS7)
signedCms.ComputeSignature(signer,false);
}
catch (CryptographicException CEx)
{
RisFirma = "Errore: " + CEx.Message + " Stack: " + CEx.StackTrace;
return RisFirma;
}
// si pone il file firmato in un array.
byte[] signature = signedCms.Encode();
File.WriteAllBytes(NomeFirma, signature);
RisFirma = "true";
}
catch (Exception Ex)
{
RisFirma = "Errore in FirmaFile: " + Ex.Message + " Stack: " + Ex.StackTrace;
}
return RisFirma;
}
Примечание: я пробовал 2 версии OID signer.DigestAlgorithm = new Oid ("2.16.840.1.101.3.4.2.1");signer.DigestAlgorithm = new Oid ("SHA256");
Все 2 выдают одинаковую ошибку.
Я ИСПОЛЬЗУЮ USB-КЛЮЧ INFOCERT с драйвером bit4id (https://www.bit4id.com/it/4identity/), который содержитсяв USB-накопителе.