podpisywanie XADES-BES (e-Deklaracje)

Odpowiedz Nowy wątek
2015-01-16 22:04
0

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/[...]ek_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?

edytowany 1x, ostatnio: lmarek, 2015-01-20 10:15

Pozostało 580 znaków

2015-01-19 10:57
Krwawy Szczur
0

Hello,

since you are using XaDesSignedXml and not signedXml, try using:

// ---- Check XaDesSignedXml:
XadesCheckSignatureMasks composedMask = default(XadesCheckSignatureMasks);
bool x = false;
x = SignedXml.XadesCheckSignature(composedMask);
Console.WriteLine("CheckSignature: " + x);
//------

instead of:

bool x = signedXml.CheckSignature();
Console.WriteLine("CheckSignature: " + x);

It should be True!

Pozostało 580 znaków

2015-01-20 10:24
0

You're right. Now I have used a XadesSignedXml.XadesCheckSignature().
However inside the appropriate test is performed by SignedXml.CheckSignature().

Pozostało 580 znaków

2015-01-22 08:02
0

Cześć,

Odnośnie podpisywania formularzy XML, przez Xades-BES, mam pytanie, więc postanowiłem się podpiąć pod ten wątek. Mianowicie podobnie jak kolega Imarek, muszę podpisać formularz i wysłać go do urzędu. Z tą różnicą że muszę skorzystać z nowej uniwersalnej bramki do formularzy zbiorczych. I tu mam problem. Według dokumentacji http://www.mf.gov.pl/document[...]yfikacja_We-Wy_0.1.1_Test.pdf, taki formularz XML należy umieścić w Zip a następnie zakodować Base64, wszystko spoko, tylko czy aby Xades-BES nie służy do podpisywania XML, czyli skrót i szyfrowanie kluczem prywatnym ma się odbywać na dokumencie XML, a nie archiwum Zip. Co np. z wymaganą postacią kanoniczną XML? W dokumentacji jest takie sformułowanie:
„W tym przypadku, podpisywany jest plik archiwum ZIP, przyjmujący w podpisie XAdES-BES formę zakodowaną base64. „
Szczerze mówiąc nie widzę biblioteki która by potrafiła podpisać Xades-BES, przyjmując na wejściu postać Base64. Zakładam że czegoś nie rozumiem, stąd zwracam się o pomoc, czy ktoś robił taki przypadek i mógłby się podzielić wiedzą jak należy to zrobić?

Pozostało 580 znaków

2015-02-19 15:49
DuzyBenek
0

Witam

Pytanko, gdzie znajdę Microsoft.Xades?

Pozdrawiam

Pozostało 580 znaków

2015-02-19 17:58
0

http://www.microsoft.com/fran[...]e/interoperabilite_xades.aspx

O ile dobrze pamiętam to są też wersje na GitHubie z kilkoma poprawkami.

Czy komuś udało się zaimplementować podpis używając tej biblioteki ? - irol67 2016-02-23 15:16

Pozostało 580 znaków

2015-02-20 09:08
DuzyBenek
0

lmarek'u masz działający kod może?
Teraz ja rwę włosy, idę Twoimi śladami i cały czas ten sam błąd:(

Pozdrawiam

Pozostało 580 znaków

2015-02-20 11:58
0

Raczej nie uda Ci sie utworzyć poprawnego komunikatu przy użyciu tych bibliotek.

Finalnie sam skomponowalem podpisanego XML'a.
Do podpisania użylem funkcji z WinApi.

Wieczorem usuądę do komutera i coś więcej napiszę.

Napisz jaki masz kod błędu, no 403 to najczęściej nadmiarowe kodowanie do base64.

Pozostało 580 znaków

2015-02-20 14:50
DuzyBenek
0

A wiesz co walczę już od wczoraj...

Ogólnie plik wygląda identycznie jak ten z dokumentacji.
Weryfikacja jest ok, wysyłam i du.... Kodowanie UTF-8, usunięte wszystkie zbędne znaki \n\r itd.

Już naprawdę nie wiem, co jeszcze może być.. Zaczynam podejrzewać WebService :D;

Pozostało 580 znaków

2015-02-23 23:11
Czarny Kaczor
0
DuzyBenek napisał(a):

A wiesz co walczę już od wczoraj...

Ogólnie plik wygląda identycznie jak ten z dokumentacji.
Weryfikacja jest ok, wysyłam i du.... Kodowanie UTF-8, usunięte wszystkie zbędne znaki \n\r itd.

Już naprawdę nie wiem, co jeszcze może być.. Zaczynam podejrzewać WebService :D;

Webserwis jest OK. Zasadniczo to mi dokumenty zbiorcze nowa bramka testowa łyka. Rzeczywiście podpisuje się dokument zip potraktowany base64. Użyłem bibliotek xmlsec Aleksejewa. Szczególnie wykorzystałem bibliotekę z podpisem wg template (złączyłem przykład sign1 i sign3) i działa.

Jednak - jak słusznie kolega wyżej stwierdził - nie jest to dokument XML i xades nie powinien być niby stosowany. Jednak sama struktura podpisu jest XML-owa - tylko zawartość nie (podpis jest typu otaczający).

Mój problem polega na tym, że szefowa ma program PWPW Sigillum Sign 4 i tam po wybraniu profilu podpisu E-dokumenty program krzyczy, że to nie jest XML (to prawda: był zipowany i base64-owany) nie mniej nic by mu nie przeszkadzało, gdyby po prostu podpisał (tak jak robi xadesem profil podpisu użytkownik - jednak o innej strukturze podpisu.

Czy komuś udało się podpisać programem "PWPW Sigillum Sign 4" plik zbiorczy deklaracji?

Dodam, że pojedyńcze na starą bramkę testową (sendDocument) są podpisywane OK i idą bez problemu.

Witam, Jakiej biblioteki używałeś do tworzenia podpisanego dokumentu i wysłania go do sendDocument ? Męczę się z tematem i cały czas mam 403 .... Pozdr. - irol67 2016-02-24 15:33

Pozostało 580 znaków

2015-02-24 15:14
DuzyBenek
0

Kolejny dzień walki :(
Znalazłem programik do podpisywania i weryfikacji i podpowiada mi :

Walidacja (reference) nie udała się (sygnatura: SignatureId; referencja: NumerReferencji). Prawdopodobnie dane zostały zmienione.

Taki sam komunikat jest jak w podpisanym pliku przez ten program przerobię cokolwiek w dołączonym obiekcie w którym znajduje się xml.

Wnioskuje, że,albo mam sekwencje źle napisaną, albo sama biblioteka coś bruździ.

Ma ktoś pomysł ?
Pozdrawiam

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0