【发布时间】:2020-08-13 00:17:57
【问题描述】:
在意大利,我们需要对自 2019 年 1 月以来的所有发票进行数字签名。
我找到了一个与 sha-1 配合得很好的代码,但我需要使用 sha256 作为标准。 下面的代码,在成功检测到USB密钥后,向我询问要使用的证书尝试签署“NomeFile”文件后并在“NomeFile”.p7m中输出,当行
signedCms.ComputeSignature(signer,false);
运行,它发生了: 1-如果使用 sha-1,它会要求我输入 PIN 并且文档已成功创建。 2-如果使用 sha-256,请不要询问 PIN 并给我未知错误 -1073741275
我阅读了很多旧帖子(2011-2014)。其他人也有同样的问题,似乎微软使用 sha256 有一些错误。
现在我们在 2018 年底,我在 .net 4、4.6.1 和 4.7.2 中尝试了此代码,但错误是相同的。
有人可以告诉我微软是否纠正了 sha256 的问题,这个奇怪的错误可能是什么? (-1073741275) Error Stack
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 签名者.DigestAlgorithm = new Oid("2.16.840.1.101.3.4.2.1"); signer.DigestAlgorithm = new Oid("SHA256");
所有 2 都给出相同的错误。
我使用带有驱动程序 bit4id (https://www.bit4id.com/it/4identity/) 的 INFOCERT USB KEY,该驱动程序包含在 USB 驱动器中。
【问题讨论】:
-
该代码看起来像 Java。如果这不正确,请自行编辑您的标签。
-
@Someprogrammerdude 感谢您的更正。
-
@MagoMaverick 你解决过这个问题吗?使用
SignedCms和 ncipher HSM 时遇到非常相似的错误。