Thursday, March 25, 2021

Węzeł krajowy dla .NET - zakończenie zasadniczych prac części klienckiej i serwerowej

Moja implementacja biblioteki integracyjnej dla .NET do Węzła Krajowego, OldMusicBox.EIH.Client, o której wspominałem w poprzednich wpisach otrzymała właśnie sporą aktualizację dodającą do już wcześniej istniejącej demonstracji części klienckiej (czyli przykładowej aplikacji która pokazuje jak implementować klienta węzła krajowego), implementację części serwerowej.
Zwracam uwagę na ten element - istnieje demonstracyjnej wersji serwera oznacza bowiem, że prace integracyjne we własnej aplikacji można rozpocząć od prób integracji z tą przykładową implementacją serwera. Mój serwer, podobnie jak Symulator Węzła Krajowego, nie wymaga posiadania kont, nie wymaga w szczególności wpisywania haseł - użytkownik sam wybiera jakimi atrybutami chce się zalogować. Następnie symuluje część serwerową protokołu SAML2 w takiej wersji w jakiej implementuje go Węzeł Krajowy, zachowując dialekt SAML2 (Artifact Binding) oraz sposób szyfrowania asercji.
Jest to szczególnie użytecznie w sytuacji, w której implementacja klienta nie ma związku z załączoną tu częścią kliencką - na przykład wtedy kiedy klient powstaje w Javie, node.js czy PHP. Dla takich aplikacji klienckich pierwszą możliwością przeprowadzenia testu integracyjnego był do tej pory Symulator Węzła Krajowego. Teraz natomiast można użyć załączonej aplikacji i zasymulować część serwerową mając ją pod całkowitą kontrolą - w szczególności można ją w pełni debugować i dzięki temu prześledzić w którym miejscu aplikacja kliencka popełnia błąd.
Dla zainteresowanych - to było całkiem nietrywialne. Implementacja części klienckiej była wzorowana na przykładowym Javowym kodzie części klienckiej, jaka jest dołączana do dokumentacji WK. Ale symulowanie serwera wymagało zrozumienia algorytmu Key Agreement w wersji dla krzywych eliptycznych a potem całego mnóstwa prób i błędów. Istniejąca implementacja wymaga od klienta posiadania klucza prywatnego (bo klucz publiczny serwera jest częścią informacji zwracanej w zaszyfrowanej asercji), a serwer potrzebuje, oprócz swojego certyfikatu i klucza prywatnego, również klucza publicznego klienta.

Friday, December 18, 2020

Węzeł Krajowy w .NET/C# na github

Na github powstało repozytorium, w którym znajdzie się implementacja klienta .NET dla Węzła Krajowego, OldMusicBox.EIH.Client (EIH jest tu skrótem od Electronic Identification Hub, ten termin wygląda na zamiennie używany z Electronic Identification Node).

Monday, December 14, 2020

Węzeł Krajowy w .NET - kamień milowy

Od ostatniego posta na temat Węzła Krajowego minęło sporo czasu, niestety, było tysiąc i jeden rzeczy do zrobienia i temat musiał czekać na swoją kolej.
Udało się wygospodarować trochę czasu w piątek 11.12 i dziś i z przyjemnością puszczam w eter wiadomość, że kod działa od początku do końca i odzyskuje dane logowania użytkownika w .NET. Pozostaje całość posprzątać, zrefaktoryzować i pozostawić tu i ówdzie furtki na zachowania nieprzewidziane - na tę chwilę działa to tylko z witryną symulatora.
Po raz kolejny wypada pozazdrościć Koleżeństwu programującemu w Javie, ponieważ tam wygląda to na dużo prostsze, w szczególności w ostatnim kroku dekodowania zaszyfrowanej asercji można się wzorować na załączonym przykładowym kodzie w Javie. Niestety, programując w .NET trzeba umieć całość przenieść na odpowiadające elementy biblioteki standardowej i Bouncy Castle. I to niestety, nie jest najłatwiejsze.
Stosowny kod zostanie w niedługim czasie opublikowany na github.

Tuesday, October 27, 2020

Materiały edukacyjne - funkcje w Javascript

Czwarty wykład z Wybranych elementów praktyki projektowania oprogramowania, o programowaniu funkcyjnym w Javascript, to jeden z moich ulubionych, łącznie z kolejnym o obiektowości prototypowej. Tu opowiadam o tym jak w Javascript zobaczyć język funkcyjny, z takimi elementami funkcyjnymi jak funkcje wyższych rzędów, rekursja, domknięcia, kontynuacje. Zrozumienie tych elementów języka znacznie ułatwia swobodne poruszanie się w bibliotekach UI, takich jak React (komponenty funkcyjne).
Zapraszam do oglądania.

Friday, September 11, 2020

Węzeł Krajowy w .NET - rozpoczęcie pracy

Rozpocząłem prace zmierzające do wsparcia Węzła Krajowego w bibliotece klienckiej SAML2/ePUAP. Podstawą pracy jest dokument Instrukcja integratora DU opublikowany przez COI.
Po rozwiązaniu problemów z SAML2 przy integracji z ePUAP, integracja z WK wnosi kolejny poziom wyzwania. W szczególności:
  • Węzeł Krajowy wymusza kryptografię opartą na certyfikatach eliptycznych (ECDSA). Problem jest taki że o ile biblioteka standardowa .NET obsługuje szyfrowanie/deszyfrowanie na takich certyfikatach, SignedXml już nie - w metodzie ComputeSignature można wprost podejrzeć if-a, który sprawdza typ certyfikatu i jeśli to nie jest RSA, wyrzuca wyjątek. Jest to poważne zaniedbanie!, z którym niełatwo sobie poradzić (kto ma ochotę na napisanie samodzielnie implementacji podpisywania XMLi, która obsługuje wszystkie niuanse, transformaty, itd. i przy okazji dodaje obsługę certyfikatów eliptycznych?)
  • Węzeł Krajowy upraszcza komunikację bo nie wymaga dodatkowego kroku z wołaniem usługi, ale za to - asercje o użytkowniku zwraca w postaci zaszyfrowanej. Problem w tym że na tę chwilę nie mam pojęcia jak to chwycić w C#
  • Na dzień dzisiejszy jest kawałeczek sukcesu, taki pierwszy set z trzech. Mianowicie, potrafię wygenerować sygnaturę tak żeby AuthnRequest był poprawnie obsłużony. Jeśli to komuś pomoże, to używam Bouncy Castle i uwaga - wbrew intuicji nie można używać signera SHA256WITHECDSA tylko SHA-256withPLAIN-ECDSA - straciłem na tym kilka godzin.
    W kolejnych dniach dalsza część pojedynku...

    Monday, August 24, 2020

    OldMusicBox.ePUAP.Client 0.64

    Biblioteka kliencka dla ePUAP, OldMusicBox.ePUAP.Client w aktualnej wersji domyka zagadnienie komunikacji za pomocą usługi Skrzynek Podawczych. Konkretnie - usługa WS-Doręczyciel::dorecz umożliwiająca wysyłanie powiadomień na skrzynki użytkowników z Urzędowym Potwierdzeniem Doręczenia (UPD) otrzymała wsparcie w generowaniu takich powiadomień.
    Konkretnie, WS-Doręczyciel::Dorecz wymaga aby przekazywany dokument był podpisany podpisem kwalifikowanym w standardzie XAdES. Jako że C# nie posiada natywnego wsparcia dla sygnatur XAdES, trzeba popracować na poziomie niżej, na poziomie SignedXml i wymagane przez XAdES węzły złożyć sobie samodzielnie. ePUAP zadowala się najprostszym wariantem sygnatury.
    Drugi element wsparcia dotyczy szablonu pisma ogólnego, które umożliwia przesłanie dowolnej treści z załącznikami binarnymi (np. PDF) i wizualizuje się na witrynie ePUAP dzięki istniejącej tam transformacie. Załączony przykład pokazuje jak wygenerować dokument w tej składni.
    Połączenie obu mechanizmów pozwala zbudować infrastrukturę dla przesyłania podpisanych dokumentów do użytkowników końcowych ePUAP (osób fizycznych).