podpisywanie XADES-BES (e-Deklaracje)

podpisywanie XADES-BES (e-Deklaracje)
LM
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 9 lat
  • Postów:10
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:

Kopiuj
    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
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!

LM
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 9 lat
  • Postów:10
0

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

NP
  • Rejestracja:około 10 lat
  • Ostatnio:około 10 lat
  • Postów:1
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

LM
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 9 lat
  • Postów:10
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.

I6
Czy komuś udało się zaimplementować podpis używając tej biblioteki ?
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

LM
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 9 lat
  • Postów:10
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.

I6
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.
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

A2
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 10 lat
  • Postów:6
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

LM
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 9 lat
  • Postów:10
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.

L7
  • Rejestracja:około 10 lat
  • Ostatnio:około 10 lat
  • Postów:3
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.

LM
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 9 lat
  • Postów:10
0

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

Do testów ustaw sobie przy tworzeniu klienta w PHP

Kopiuj
'trace'=>true

a potem zrzuć swojego requesta poprzez

Kopiuj
$client->__getLastRequest()
L7
  • Rejestracja:około 10 lat
  • Ostatnio:około 10 lat
  • Postów:3
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.

LM
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 9 lat
  • Postów:10
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.

L7
  • Rejestracja:około 10 lat
  • Ostatnio:około 10 lat
  • Postów:3
0

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

ME
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 9 lat
  • Postów:3
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

MO
  • Rejestracja:ponad 15 lat
  • Ostatnio:16 dni
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ś.

ME
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 9 lat
  • Postów:3
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

MO
  • Rejestracja:ponad 15 lat
  • Ostatnio:16 dni
0

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

HE
  • Rejestracja:około 9 lat
  • Ostatnio:prawie 9 lat
  • Postów:1
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 ;)

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)