在意大利,我们需要对自2019年1月以来的所有发票进行数字签名。
我找到了与sha-1一起使用的代码,但是我需要使用sha256作为标准代码。 下面的代码,在成功检测到USB密钥并要求我使用证书后,请尝试对“ NomeFile”文件进行签名,然后在“ NomeFile” .p7m中输出,当行
signedCms.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) 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;
}
NB:我尝试了2个版本的OID signer.DigestAlgorithm =新的Oid(“ 2.16.840.1.101.3.4.2.1”); signer.DigestAlgorithm =新的Oid(“ SHA256”);
所有2个都给出相同的错误。
我使用了USB驱动器中包含的具有驱动程序bit4id(https://www.bit4id.com/it/4identity/)的INFOCERT USB密钥。
答案 0 :(得分:0)
使用此:
is_colorful_number?
答案 1 :(得分:0)
我在Internet上找到了它,我尝试了一下,结果非常成功! 无论如何,解决方案都比较复杂。
您必须使用BouncyCastle(https://www.bouncycastle.org/)库。 但是没有可用的版本,而是由用户在另一个论坛上修改的版本。
修改后的充气城堡库的链接是: http://www.mediafire.com/download/uc63d1hepqyuhee/bccrypto-net-1.7-src-ext_with_CADES-BES.zip
您必须使用bin \ release中找到的crypto.dll库,并在您的项目中引用它。
这些人现在都在用我的东西,在这种情况下可能不需要全部:
set.seed;df<-data.frame(A=runif(1:10),B=sample(0:50,10),C=rnorm(1:10,5));
A<-lapply(df, shapiro.test);B<-data.frame(unlist(A))
这是功能:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Security.Cryptography;
using System.Security.Cryptography.Xml;
using System.Security.Cryptography.Pkcs;
using System.Security.Cryptography.X509Certificates;
using System.Xml;
using System.IO;
using System.Collections;
using CryptoUpgNet.NonExportablePK;
using Org.BouncyCastle.Asn1;
using Org.BouncyCastle.Asn1.Ess;
using Org.BouncyCastle.Cms;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Pkcs;
using Org.BouncyCastle.Security;
编辑:重复使用具有相同证书的证书,仅在第一次询问PIN。因此,在激活安全标准的情况下一次使多个文件变好。
答案 2 :(得分:0)
致Grzegorz:
源文件为5k 正确的签名文件(IT01234567890_FPA01_2.xml.p7m为8k 用例行程序保存的文件中添加
File.WriteAllBytes("c:\\temp\\IT01234567890_FPA01.xml.p7m", wynBin);
之后
byte[] wynBin = csp.SignHash(hash, CryptoConfig.MapNameToOID("SHA256"));
仅1kb,Dike无法识别。 Sign not reckognized
答案 3 :(得分:0)
该错误和症状似乎表明正在执行签名操作的CSP(加密服务提供程序)不支持SHA-2。如果在BouncyCastle中工作,那么他们似乎正在导出私钥,然后将其重新导入到其软件提供程序中。
在.NET 4.7.2中,您可以尝试以下操作:
...
try
{
// Viene calcolata la firma del file (in formato PKCS7)
signedCms.ComputeSignature(signer,false);
}
catch (CryptographicException CEx)
{
try
{
// Try re-importing the private key into a better CSP:
using (RSA tmpRsa = RSA.Create())
{
tmpRsa.ImportParameters(cert.GetRSAPrivateKey().ExportParameters(true));
using (X509Certificate2 tmpCertNoKey = new X509Certificate2(cert.RawData))
using (X509Certificate2 tmpCert = tmpCertNoKey.CopyWithPrivateKey(tmpRsa))
{
signer.Certificate = tmpCert;
signedCms.ComputeSignature(signer,false);
}
}
}
catch (CryptographicException)
{
// This is the original exception, not the inner one.
RisFirma = "Errore: " + CEx.Message + " Stack: " + CEx.StackTrace;
return RisFirma;
}
}
如果实际上是从USB设备上的PFX文件加载证书,则问题在于PFX指定使用SHA-2之前的较旧软件CSP。重新生成PFX以使用最新的RSA CSP也可以解决该问题。