Cześć, potrzebuje pomocy przy podpisywaniu dokumentu wysyłanego na bramkę e-Deklaracji.
Męczę się z problemem kilka dni, na bramce testowej cały czas ma błąd 403 - Dokument z niepoprawnym podpisem.
Dokumentacja http://www.finanse.mf.gov.pl/documents/766655/1196432/eDek_Specyfikacja_We-Wy_2.0.pdf
Do podpisywania używam klasy XadesSignedXml z biblioteki "Microsoft.Xades" (to jest biblioteka poza standardowym "System.Security.Cryptography"). To chyba jedyna biblioteka w C# która tworzy wymagane przez specyfikację prefixy "ds" i "xades".
Kod podpisujący XML wygląda tak:
void sign(string FileName, string SignedFileName, X509Certificate2 x509)
{
// Wczytaj.
XmlDocument doc = new XmlDocument();
doc.PreserveWhitespace = true;
doc.Load(new XmlTextReader(FileName));
// SignedXml object
XadesSignedXml signedXml = new XadesSignedXml(doc);
signedXml.Signature.Id = "ID-1234";
signedXml.SigningKey = x509.PrivateKey;
signedXml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigCanonicalizationUrl;
signedXml.SignedInfo.SignatureMethod = SignedXml.XmlDsigRSASHA1Url;
// dodaj referencję na dokument
Reference reference = new Reference("#Dokument");
reference.AddTransform(new XmlDsigEnvelopedSignatureTransform());
signedXml.AddReference(reference);
// dodaj KeyInfo
KeyInfo keyInfo = new KeyInfo();
keyInfo.AddClause(new KeyInfoX509Data(x509)); // ??? WholeChain ???
signedXml.KeyInfo = keyInfo;
//
XadesObject xo = new XadesObject();
{
Cert cert = new Cert();
cert.IssuerSerial.X509IssuerName = x509.IssuerName.Name;
cert.IssuerSerial.X509SerialNumber = x509.SerialNumber;
{
SHA1 cryptoServiceProvider = new SHA1CryptoServiceProvider();
cert.CertDigest.DigestValue = cryptoServiceProvider.ComputeHash(x509.RawData);
cert.CertDigest.DigestMethod.Algorithm = SignedXml.XmlDsigSHA1Url;
}
xo.QualifyingProperties.Target = "#" + signedXml.Signature.Id;
xo.QualifyingProperties.SignedProperties.SignedSignatureProperties.SigningTime = DateTime.Now;
xo.QualifyingProperties.SignedProperties.SignedSignatureProperties.SignaturePolicyIdentifier.SignaturePolicyImplied = true;
xo.QualifyingProperties.SignedProperties.SignedSignatureProperties.SigningCertificate.CertCollection.Add(cert);
DataObjectFormat dof = new DataObjectFormat();
dof.ObjectReferenceAttribute = "#Dokument";
dof.Description = "Dokument w formacie xml [XML]";
dof.Encoding = SignedXml.XmlDsigBase64TransformUrl; // ...xmldsig/#base64
dof.MimeType = "text/plain";
xo.QualifyingProperties.SignedProperties.SignedDataObjectProperties.DataObjectFormatCollection.Add(dof);
}
signedXml.AddXadesObject(xo);
// W dokumentacji 2.9.9.a, Id dla <ds:Object> ma mieć wartość "Dokument", ale nie ma tego w przykładach
var data = new DataObject("Dokument", "text/xml", "", doc.DocumentElement);
signedXml.AddObject(data);
// Podpisz
signedXml.ComputeSignature();
#if true
XadesCheckSignatureMasks composedMask = XadesCheckSignatureMasks.AllChecks;
bool x = signedXml.XadesCheckSignature(composedMask);
Console.WriteLine("XadesCheckSignature: " + x);
#endif
// Zapisz do pliku
File.WriteAllText(SignedFileName, signedXml.GetXml().OuterXml);
}
Wyrwałem już sobie prawie wszystkie włosy, a nie mogę dojść o co chodzi.
Ma może ktoś pomysł co robię źle?