podpisywanie XADES-BES (e-Deklaracje)

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/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?

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!

0

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

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/documents/766655/1196432/UBD_Specyfikacja_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ć?

0

Witam

Pytanko, gdzie znajdę Microsoft.Xades?

Pozdrawiam

0

http://www.microsoft.com/france/openness/open-source/interoperabilite_xades.aspx

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

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

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.

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;

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.

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

0

Prawdopodobnie dane zostały zmienione.
Spotkałem ten problem, problemem było złe kodowanie polskich znaków w nazwach plików, postaraj się usunąć polskie znaki z zipa, lub zmień nazwę zip, jeśli posiada też polskie znaki w nazwie

0

DuzyBenek, podawaj dodatkowo numery błędów.

Wygląda na to że Twój komunikat ma źle policzone sumy kontrolne - być może biblioteka dokonuje transformacji przed wyliczeniem sumy kontrolnej.

0

Witam,
Też dołączę się do tematu.
Mam poprawnie sformatowany plik XML z deklaracją, który podpisuję XAdES-BES. Podpisany plik wygląda identycznie jak w specyfikacji systemu e-deklaracje. Następnie koduję go do base64 i wysyłam do bramki. Niestety cały czas dostaję zwrotkę 403 - Dokument z niepoprawnym podpisem.
Ma ktoś jakiś pomysł czemu?
Dodam, że robię to przez PHP, a format dokumentu XML na pewno jest dobry, bo przechodzi on z powodzeniem weryfikację jeśli wysyłam go z danymi autoryzującymi do bramki.

0

Wysyłasz przez PHP? To go nie koduj base64.
PHP wspiera MTOM.

Do testów ustaw sobie przy tworzeniu klienta w PHP

'trace'=>true

a potem zrzuć swojego requesta poprzez

$client->__getLastRequest()
0

Jak nie koduję go base64, to w ogóle nie chce przejść weryfikacji i dostaję błąd 408.
Wydaje mi się, że błędem nie jest sam sposób wysyłania deklaracji, tylko jego podpis. Chociaż dokument wygląda identycznie jak w specyfikacji.

0

I bardzo dobrze, jak masz 408 to już przebiłeś się przez 403 :-)
408 mówi że masz źle podpisany dokument.

Jak masz wątpliwości to zrób testy jak pisałem, użyj __getLastRequest().

Napisz jak podpisujesz, które biblioteki, funkcje, itd.

0

Dziwna sprawa, bo nagle wszystko zaczęło działać :) Nic nie zmieniałem.
A podpis robię zewnętrznym programem od Certum

0

Cześć, również się męczę z podpisywaniem xml e-deklaracji nie mogę przejść przez błąd 403. Mimo, że xml wygląda jak tez przykładowy z dokumentacji. Czy znacie może jakiś free działający soft do generowania podpisywania e-deklaracji abym mógł porównać z swoimi plikami?

0

mentyl, ja ostatecznie wygenerowałem przykładową deklarację w programie e-Deklaracje. Na samym końcu jest możliwość zapisu do XML'a. Na jego podstawie udało mi się wygenerować własnego XML'a i wszystko śmiga

0

Potrzebujesz tego podpisu do komercyjnej aplikacji? Mam napisaną dll-kę w .net która podpisuje e-deklaracje podpisem Xades. Potrzebował bym więcej informacji dotyczących zastosowania podpisu. Napisz na priv jak coś.

0

"Czarny Terrorysta" tak właśnie robię, ale na razie nie mam podpisu kwalifikowanego ważnego do testów. Więc doszedłem do błędu że cert nie ważny :). XML Podpisałem aplikacją proCertum SmartSign, wygląda inaczej jak ten przykładowy z dokumentacji mf.gov.pl ale po wysłaniu jest OK. Więc podążam twoją ścieżką, cel coraz bliższy :)

"moneusz" tak komercyjna, specyfikacja tu XML-a tam

0

Cert nie ważny to już dobry objaw ale wydaje mi się, że "ręcznie" ciężko będzie wygenerować ten podpis.

0

Witam
Przebrnąłem przez podpis XaDes korzystając z biblioteki Microsoft.Xades , którą troszeczkę zmodyfikowałem . Próbuję podpisanego XML wysłać do bramki testowej , lecz ciągle dostaje błąd 403 pomimo wzięcia pliku podpisanego kwalifikowanym podpisem i który już przeszedł przez bramkę produkcyjną . Wysyłam z kodowaniem do Base64 lub bez tego kodowania i dostaję
cały czas ten sam błąd 403 . Program do wysyłki i podpisywania napisałem w C#

0

Podbijam temat podpisu xades do systemu e-deklaracje. XML podpisany w formularzu interaktywnym (PDF ze strony ministerstwa) posłany na bramkę testową daje status 200. Podobnie xml-ka podpisana aplikacją PPUS.

Dokumenty wysyłam własną aplikacją.

Natomiast próba podpisania pliku Szafirem dostarczonym razem z podpisem za każdym razem kończy kończy się statusem 403 - niepoprawny podpis. Komuś się udało wysłać dokument podpisany Szafirem?
Może ktoś ma doświadczenia z podpisaniem w Delphi/Lazarusie?

Włosów nie rwę bo ich już nie mam ;)

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