Wykonanie funkcjonalności Zaufany Profil w ramach rozbudowy epuap



Podobne dokumenty
elektroniczna Platforma Usług Administracji Publicznej

elektroniczna Platforma Usług Administracji Publicznej

elektroniczna Platforma Usług Administracji Publicznej

elektroniczna Platforma Usług Administracji Publicznej

Modyfikacja systemu w ramach projektu Rozbudowa elektronicznej platformy usług administracji publicznej

Szczegółowy Opis Interfejsu Wymiany Danych. Załącznik nr 1.8.

elektroniczna Platforma Usług Administracji Publicznej

Programowanie komponentowe 5

E-administracja. Korzystanie z Elektronicznej Platformy Usług Administracji Publicznej

Integracja Obieg Dokumentów - GiS Spis treści

Warstwa integracji. wg. D.Alur, J.Crupi, D. Malks, Core J2EE. Wzorce projektowe.

Katedra Architektury Systemów Komputerowych Wydział Elektroniki, Telekomunikacji i Informatyki Politechniki Gdańskiej

Dokumentacja techniczna. Młodzieżowe Pośrednictwo Pracy

Instrukcja integratora - obsługa dużych plików w epuap2

UCHWAŁA NR IX RADY MIEJSKIEJ W BOGUCHWALE. z dnia 28 maja 2015 r.

Instrukcja dla osoby potwierdzającej profil zaufany

Dokumentacja podłączeniowa dla procesu przenoszenia danych osobowych. Czyli opis jak skorzystać z usługi: rodotransferservice

EXSO-CORE - specyfikacja

Dokumentacja techniczna interfejsu komunikacyjnego Cyfrowego Urzędu z systemami EOD

Nowa odsłona wyodrębnienie i kierunki jego rozwoju

Funkcjonowanie profilu zaufanego na elektronicznej Platformie Usług Administracji Publicznej (epuap) Szkolenie informatyczne

Wybrane działy Informatyki Stosowanej

Ministerstwo Finansów

Wzorce logiki dziedziny

elektroniczna Platforma Usług Administracji publicznej Instrukcja użytkowania oraz złożenia wniosku o Profil zaufany

Instrukcja tworzenia, logowania i obsługi kont w portalu:

DOTYCZY KLIENTA PKO BIURO OBSŁUGI LEASING ZAPYTANIE O INFORMACJĘ OTYCZY: DOSTAWY PLATFORMY ELEKTRONICZNE DLA PKO

AKADEMIA GÓRNICZO-HUTNICZA Wydział Elektrotechniki, Automatyki, Elektroniki i Informatyki

1.2 Prawa dostępu - Role

Aplikacje RMI

Dokumentacja techniczna API systemu SimPay.pl

Nowa odsłona wyodrębnienie i kierunki jego rozwoju Łysomice

Nowa odsłona wyodrębnienie i kierunki jego rozwoju Międzyzdroje

Instrukcja logowania i realizacji podstawowych transakcji w systemie bankowości internetowej dla klientów biznesowych BusinessPro.

Dokumentacja API sender sms

Szczegółowa specyfikacja funkcjonalności zamawianego oprogramowania.

Załącznik Nr 1 do Uchwały Nr XX/356/11 Rady Miasta Gdańska z dnia 24 listopada 2011 r.

Aplikacja serwerowa Platformy Prezentacyjnej Opis produktu

1. Cel i zakres dokumentu Słownik pojęć użytych w instrukcji... 3

Platforma epuap. Igor Bednarski kierownik projektu epuap2 CPI MSWiA. Kraków, r.

Programowanie komponentowe. Przykład 1 Bezpieczeństwo wg The Java EE 5 Tutorial Autor: Zofia Kruczkiewicz

MINISTERSTWO FINANSÓW PLAN INTEGRACJI SYSTEMU ZAŁĄCZNIK NR 6 SEAP SPECYFIKACJA KANAŁ DLA PODMIOTÓW ZEWNĘTRZNYCH PL PROJEKT ECIP/SEAP

Wywoływanie metod zdalnych

Płatności CashBill - SOAP

Programowanie w języku Java. Wykład 13: Java Platform, Enterprise Edition (Java EE)

Funkcjonowanie Profilu Zaufanego

Opis przykładowego programu realizującego komunikację z systemem epuap wykorzystując interfejs komunikacyjny "doręczyciel"

Programowanie współbieżne i rozproszone

Rozdział 3. ROZWÓJ APLIKACJI CENTRALNEJ

Zaawansowane aplikacje internetowe

ZAŁOŻENIA TECHNICZNO-TECHNOLOGICZNE SYSTEMU BUDOWANEGO W RAMACH PROJEKTU

Podstawowe informacje o technologii Java Persistence API - przykład

Aplikacja webowa w Javie szybkie programowanie biznesowych aplikacji Spring Boot + Vaadin

Zarządzanie kontem użytkownika Lokalnego Systemu Informatycznego w ramach RPO WSL Katowice, 15 października 2015r

Usługa TimerService

Enterprise JavaBeans (EJB)

Projekt dotyczy stworzenia zintegrowanego, modularnego systemu informatycznego wspomagającego zarządzanie pracownikami i projektami w firmie

Instrukcja składania wniosku w ramach konkursów na finansowanie projektów ze środków Regionalnego Programu Operacyjnego Województwa Śląskiego

Instrukcja użytkownika

Zmiany na. wyodrębnienie i kierunki jego rozwoju Dubiecko

Nowy sposób autoryzacji przelewów w Usłudze Bankowości Elektronicznej

Projekt epuap obecny stan realizacji i plany na przyszłość

Założenia i stan realizacji projektu epuap2

EJB 3.0 (Enterprise JavaBeans 3.0)

OPIS i SPECYFIKACJA TECHNICZNA

Specyfikacja techniczna. mprofi Interfejs API

DZIENNIK URZĘDOWY WOJEWÓDZTWA ŁÓDZKIEGO

Dokumentacja wstępna TIN. Rozproszone repozytorium oparte o WebDAV

Instrukcja zakładania konta w portalu epuap i profilu zaufanego.

Zmiany na. wyodrębnienie i kierunki jego rozwoju Kraków

1 Wprowadzenie do J2EE

Programowanie Urządzeń Mobilnych. Część II: Android. Wykład 2

1. Architektura logiczna Platformy Usługowej

Enterprise JavaBeans

Zarządzanie kontem użytkownika Lokalnego Systemu Informatycznego w ramach RPO WSL

INFRA. System Connector. Opis systemu

Małopolska wobec epuap

Ministerstwo Finansów

Architektury Usług Internetowych. Laboratorium 2. Usługi sieciowe

Programowanie Komponentowe WebAPI

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

Rzeszów, dnia 18 czerwca 2015 r. Poz UCHWAŁA NR IX RADY MIEJSKIEJ W BOGUCHWALE. z dnia 28 maja 2015 r.

Bazy danych 2. Wykład 1

Profil zaufany e-puap

epuap kwiecień 2014r. Izba Skarbowa w Poznaniu ElektronicznaPlatforma UsługAdministracji Publicznej pl. Cyryla Ratajskiego Poznań

REJESTRACJA, LOGOWANIE I USTAWIENIA PROFILU

MINISTERSTWO SPRAW WEWNĘTRZNYCH I ADMINISTRACJI DEPARTAMENT INFORMATYZACJI

Kielce, dnia roku. HB Technology Hubert Szczukiewicz. ul. Kujawska 26 / Kielce

D:\DYDAKTYKA\ZAI_BIS\_Ćwiczenia_wzorce\04\04_poprawiony.doc 2009-lis-23, 17:44

PRACA INŻYNIERSKA IMPLEMENTACJA MOBILNEGO KLIENTA BANKU ZABEZPIECZONEGO TOKENEM

Enterprise JavaBeans. 1. Architektura EJB: komponenty encyjne, komponenty sesyjne, komponenty sterowane komunikatami. 2. Kontenery EJB JBoss.

Wywoływanie metod zdalnych

Typy przetwarzania. Przetwarzanie zcentralizowane. Przetwarzanie rozproszone

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

OnePlace - INSTRUKCJA OFERENTA

Komunikacja i wymiana danych

JPK VAT wysyłka za pośrednictwem profilu zaufanego z systemu epuap

Kraków, 2 kwietnia 2004 r.

E-administracja warunkiem rozwoju Polski. Obecna i potencjalna rola epuap w procesowym zarządzaniu w administracji

Transkrypt:

POWYKONAWCZY PROJEKT TECHNICZNY ZAUFANY PROFIL Wykonanie funkcjonalności Zaufany Profil w ramach rozbudowy epuap Ministerstwo Spraw Wewnętrznych i Administracji ul. Batorego 5, 02-591 Warszawa www.epuap.gov.pl

Autor Zamawiający Wersja dokumentu Liczba stron 54 epuap2 POWYKONAWCZY POWYKONAWCZY PROJEKT TECHNICZNY ZP Radosław Muniowski Ministerstwo Spraw Wewnętrznych i Administracji 02.01 Historia zmian Wersja Data Kto Opis zmian 02.01 05.03.2010 Radosław Muniowski Ostateczna wersja dokumentu 2/54

Spis treści 1 Spis załączników i rysunków... 5 2 Pojęcia... 6 3 Architektura Systemu... 7 3.1 Architektura podsystemów... 7 3.1.1 Technologia wytwarzania... 7 3.1.2 Model projektu technicznego... 7 3.1.3 Komponenty... 9 3.1.4 Implementacja komponentów - klasy logiki... 10 3.1.5 Struktury informacji... 15 3.1.6 Zdarzenia... 18 4 Interfejsy...20 4.1 Interfejs graficzny użytkownika... 20 4.1.1 Obsługa metod autoryzacji... 20 4.1.2 Profil Zaufany... 24 4.1.3 Unieważnienie profilu zaufanego... 27 4.1.4 Listy wniosków i profilów zaufanych... 30 4.1.5 Wniosek o założenie profilu zaufanego... 33 4.2 Interfejsy zewnętrzne... 38 4.2.1 Dostarczanie informacji o posiadaniu profilu ZP... 38 4.2.2 Podpisywanie z użyciem ZP... 38 4.2.3 Weryfikacja podpisu ZP... 38 4.2.4 Definicja WSDL interfejsu... 38 5 Architektura fizyczna...44 5.1 Schemat bazy danych... 44 5.1.1 Tabela ADDITIONALATTRIBUTE... 46 5.1.2 Tabela LEGALPERSONAPPLICATION... 47 5.1.3 Tabela LEGALPERSONAPPLICATION_ADDITIONALATTRIBUTE... 47 5.1.4 Tabela NATURALPERSONAPPLICATION... 48 5.1.5 Tabela NATURALPERSONAPPLICATION_ADDITIONALATTRIBUTE... 48 5.1.6 Tabela ZP_AUTH_METHODS... 49 5.1.7 Tabela ZP_CONFIG... 49 5.1.8 Tabela ZP_CURR_AUTH... 49 3/54

5.1.9 Tabela ZP_PROFILE... 50 5.1.10 Tabela ZP_REMOTE_DOCUMENTS... 50 5.1.11 Tabela ZP_SIGN_LOG... 51 5.1.12 Tabela ZP_STATE_CHANGES... 51 5.2 Schemat rozmieszczenia... 52 4/54

1 Spis załączników i rysunków Rysunki Rysunek 1 Model projektu technicznego... 8 Rysunek 2 Diagram komponentów epuap... 9 Rysunek 3 Diagram komponentów ZP... 9 Rysunek 4 Diagram klas komponentu Wnioski... 10 Rysunek 5 Diagram klas komponentu Autoryzacja... 11 Rysunek 6 Diagram klas komponentu weryfikacji danych... 12 Rysunek 7 Diagram klas komponentu podpisu... 14 Rysunek 8 Diagram klas komponentu Magazyn ZP... 15 Rysunek 9 Schemat bazy danych (część 1)... 45 Rysunek 10 Schemat bazy danych (część 2)... 46 Rysunek 11 Diagram wdrożenia aplikacji ZP... 53 Rysunek 12 Przypisanie komponentów do maszyn w poszczególnych środowiskach... 54 Załączniki 1. zp_javadoc_04032010.rar dokumentacja implementacji JAVADOC 5/54

2 Pojęcia System epuap Podsystem epuap Interfejs Pojęcie Opis Ogół elementów wchodzących w skład platformy epuap. Część systemu epuap wyodrębniony w architekturze. Definicja zbioru operacji, które mogą być wywoływane przez dwa komunikujące się elementy. Komponent Element składowy systemu (podsystemu) realizujący pewien spójny zakres funkcjonalności. Komunikacja między komponentami odbywa się wyłącznie przy użyciu interfejsów. WebSerwis Profil Zaufany Aplikacja ZP (Zaufany Profil) Jedna z form implementacji interfejsu. Cechą interfejsu jest jego dostępność może być wywołany zdalnie przez system zewnętrzny. Potwierdzony podpisem kwalifikowanym zbiór informacji wiążący profil epuap i zweryfikowane dane. Aplikacja dostarczająca funkcjonalności obsługi i zarządzania profilami zaufanymi Podpis ZP (podpis profilem zaufanym) Podpis cyfrowy dokonywany przez epuap zawierający informację o podmiocie zaufanym w imieniu, którego dokonano podpisu. Dodatkowe informacje umieszczone są w elemencie claimedrole struktury podpisu. HSM Hardware Security Module sprzętowy moduł kryptograficzny TSA Time Stamping Authority usługi służące do oznaczania czasem 6/54

SOPEL System Obsługi Podpisu Elektronicznego 3 Architektura Systemu 3.1 Architektura podsystemów Celem tego podrozdziału będzie opracowanie wewnętrznej architektury podsystemów, wyodrębnienie komponentów składowych oraz opracowanie modelu klas implementacji. W punkcie tym zostanie zawarte elementy wymienione poniżej. Prezentacja komponentów wchodzących w skład aplikacji ZP. Diagram i opis klas realizujących poszczególne komponenty. 3.1.1 Technologia wytwarzania Aplikację ZP jest budowana zgodnie z poniższymi wytycznymi. Architektura rozproszona i wielowarstwowa. Komunikacja pomiędzy poszczególnymi warstwami aplikacji realizowana jest przy pomocy technologii EJB. Komunikacja z podsystemami epuap realizowana jest z wykorzystaniem web-serwisów. Nie istnieją powiązania międzysystemowe na poziomie bazy danych. Wykorzystaną platformą programowania jest Java w wersji 1.4(WebSphere Portal) i 1.5 (WAS 6.1). Wykorzystaną bazą danych jest IBM DB2 9.1. Warstwa webowa została stworzona z wykorzystaniem technologii portletów uruchamianych na serwerze IBM WebSphere Portal 6.0 oraz serwerów aplikacyjnych IBM WebSphere Application Server 6.1. Strony aplikacji zachowują zgodność ze specyfikacją XHTML. Kod aplikacji zachowuje niezależność od używanego IDE i może być po wprowadzeniu zmian skompilowany z użyciem skryptów ANT pod warunkiem dostarczenia odpowiedniego zestawu bibliotek. Kod aplikacji utrzymywany jest za pomocą repozytorium CVS, które pozwala kontrolować zmiany do niego wprowadzane. 3.1.2 Model projektu technicznego Poniższy diagram prezentuje model projektu technicznego. 7/54

Rysunek 1 Model projektu technicznego Elementem o najszerszym zasięgu jest podsystem. Podsystem udostępnia zbiór interfejsów, którymi komunikuje się z innymi podsystemami. Podsystem zbudowany jest z komponentów implementowanych przy pomocy zbioru klas. Komponenty również udostępniają interfejsy, które używane są do komunikacji wewnętrznej w podsystemie. 8/54

3.1.3 Komponenty Na poniższych diagramach zaprezentowano budowę komponentową i zależności na poziomie całego systemu epuap i aplikacji ZP. composite structure epuap Komponenty::UB Komponenty::FE Komponenty::ZP Komponenty::PK Rysunek 2 Diagram komponentów epuap Komponent logiczny ZP do poprawnego działania potrzebuje informacji o kontach użytkowników oraz podmiotach z podsystemu bezpieczeństwa UB. Podsystem PK korzysta z interfejsów ZP do weryfikacji dokumentów przechodzących przez skrytki. Skrytki posiadają dodatkową właściwość określającą wymagalność obecności podpisu ZP. Podobne usługi do podpisywania i weryfikacji dokumentów tworzonych przez użytkownika wykorzystuje podsystem FrontEnd. Użytkownik ma możliwości dokonania podpisu kwalifikowanego lub podpisu ZP (w zależności od dostępnego dla danego użytkownika profilu ZP). Weryfikacja podpisu prezentowana użytkownikowi zawiera dodatkowe informacje pozwalające ustalić podmiot i użytkownika w imieniu, którego złożono podpis ZP. composite structure ZP Autoryzacja Magazyn ZP Podpis ZP Wnioski Weryfikacja danych Rysunek 3 Diagram komponentów ZP 9/54

Powyższy diagram prezentuje wewnętrzną strukturę komponentową aplikacji ZP. Komponent Wnioski odpowiada za zarządzanie i obsługę wniosków użytkownika nadanie \ przedłużenie \ unieważnienie profilu zaufanego. Wykorzystuje magazyn ZP, który odpowiada za zarządzanie profilami i ich ochronę. Komponent Weryfikacja danych stanowi mechanizm obsługujący proces weryfikacji danych użytkownika podczas zakładania ZP. Podstawowym testem jest sprawdzenie zgodność Imienia i Nazwiska i numeru PESEL w rejestrze centralnym. Komponent Autoryzacja odpowiedzialny jest za przeprowadzenie autoryzacji użytkownika przed złożeniem podpisu ZP jak również przy unieważnianiu profilu zaufanego. Mechanizm umożliwia definiowanie kanałów autoryzacji poprzez implementację interfejsu WebServices. Kluczowym komponentem jest Podpis ZP. Proces podpisywania wymaga komunikacji z komponentem Magazyn ZP w celu pobrania danych z profilu zaufanego oraz komponentem obsługującym autoryzację (Autoryzacja). 3.1.4 Implementacja komponentów - klasy logiki Poniższe diagramy przedstawiają wewnętrzną budowę poszczególnych komponentów. Wnioski class zp_applications «interface» ApplicationRemote + approveapplication(application, byte[], String) : Application + findlegalpersonapplications(string, String, String, String, String, String, ApplicationStatus, Date, QueryInfo) : List<LegalPersonApplication> + findlegalpersonapplicationscount(string, String, String, String, String, String, ApplicationStatus, Date) : Long + findnaturalpersonapplications(string, String, String, String, String, ApplicationStatus, Date, QueryInfo) : List<NaturalPersonApplication> + findnaturalpersonapplicationscount(string, String, String, String, String, ApplicationStatus, Date) : Long + getfulllegalpersonapplication(long) : LegalPersonApplication + getfullnaturalpersonapplication(long) : NaturalPersonApplication + registernewlegalpersonapplication(legalpersonapplication) : LegalPersonApplication + registernewnaturalpersonapplication(naturalpersonapplication) : NaturalPersonApplication + rejectapplication(application, String, String) : Application IllegalArgumentException VerificationFailureException - serialversionuid: long = 1L {readonly} «interface» ApplicationDaoLocal + findlegalpersonapplications(string, String, String, String, String, String, ApplicationStatus, Date, QueryInfo) : List<LegalPersonApplication> + findlegalpersonapplicationscount(string, String, String, String, String, String, ApplicationStatus, Date) : Long + findnaturalpersonapplications(string, String, String, String, String, ApplicationStatus, Date, QueryInfo) : List<NaturalPersonApplication> + findnaturalpersonapplicationscount(string, String, String, String, String, ApplicationStatus, Date) : Long + getfulllegalpersonapplication(long) : LegalPersonApplication + getfullnaturalpersonapplication(long) : NaturalPersonApplication + save(application) : Application + update(application) : Application -applicationdaolocal ApplicationBean - applicationdaolocal: ApplicationDaoLocal - dataverifierlocal: DataVerifierLocal - log: Logger = Logger.getLogge... - trustedprofilelocal: TrustedProfileLocal + approveapplication(application, byte[], String) : Application + findlegalpersonapplications(string, String, String, String, String, String, ApplicationStatus, Date, QueryInfo) : List<LegalPersonApplication> + findlegalpersonapplicationscount(string, String, String, String, String, String, ApplicationStatus, Date) : Long + findnaturalpersonapplications(string, String, String, String, String, ApplicationStatus, Date, QueryInfo) : List<NaturalPersonApplication> + findnaturalpersonapplicationscount(string, String, String, String, String, ApplicationStatus, Date) : Long + getfulllegalpersonapplication(long) : LegalPersonApplication + getfullnaturalpersonapplication(long) : NaturalPersonApplication + registernewlegalpersonapplication(legalpersonapplication) : LegalPersonApplication + registernewnaturalpersonapplication(naturalpersonapplication) : NaturalPersonApplication + rejectapplication(application, String, String) : Application ApplicationDaoBean - em: EntityManager - log: Log = LogFactory.getL... + findlegalpersonapplications(string, String, String, String, String, String, ApplicationStatus, Date, QueryInfo) : List<LegalPersonApplication> + findlegalpersonapplicationscount(string, String, String, String, String, String, ApplicationStatus, Date) : Long - findlpainternal(string, String, String, String, String, String, ApplicationStatus, Date, QueryInfo, StringBuffer, String) : Query + findnaturalpersonapplications(string, String, String, String, String, ApplicationStatus, Date, QueryInfo) : List<NaturalPersonApplication> + findnaturalpersonapplicationscount(string, String, String, String, String, ApplicationStatus, Date) : Long - findnpainternal(string, String, String, String, String, ApplicationStatus, Date, QueryInfo, StringBuffer, String) : Query + getfulllegalpersonapplication(long) : LegalPersonApplication + getfullnaturalpersonapplication(long) : NaturalPersonApplication + save(application) : Application + update(application) : Application Rysunek 4 Diagram klas komponentu Wnioski Komponent Wnioski odpowiedzialny jest za obsługę wniosków o nadanie zaufanego profilu. Sercem modułu jest bezstanowy komponent EJB ApplicationBean realizujący zadania logiki biznesowej, oferujący swoje usługi przez interfejs zdalny (ApplicationRemote). Do realizacji swoich zadań korzysta z interfejsu lokalnego ApplicationDaoLocal, który definiuje kontrakt utrwalania danych. W ramach projektu stworzono implementację interfejsu ApplicationDaoLocal w postaci bezstanowego komponentu ApplicationDaoBean, który korzysta ze standardowej technologii Java Persistence API. Jako dostawcę usług utrwalania wybrano oprogramowanie OpenJPA dostępne w wykorzystywanym serwerze aplikacyjnym IBM WebSphere Application Server. W celu weryfikacji zgodności danych z kontem użytkownika lub profilem podmiotu ApplicationBean wykorzystuje interfejs DataVerifierLocal, natomiast interfejs SecurityLocal udostępnia informacje na 10/54

temat uprawnień użytkownika, w kontekście, którego system aktualnie realizuje zadanie. Oba interfejsy zostały zaimplementowane w komponencie Weryfikacja danych w postaci bezstanowych komponentów EJB. Realizacja zadań cyklicznych (takich jak odrzucanie nierozpatrzonych wniosków po określonym czasie) wykorzystuje standardowy mechanizm EJB, tj. EJB Timer Service. Komunikacja z modułem magazynu zaufanych profili przebiega za pomocą interfejsu lokalnego TrustedProfileLocal. Do obsługi wysyłki korespondencji (przyjęcie oraz odrzucenie wniosku) wykorzystywany jest interfejs lokalny MailSenderLocal oraz klasy TemplatesStore i XsltConverter, które wspomagają korzystanie z przekształceń XSLT, który wykorzystywane są do tworzenia szablonów wiadomości e-mail. class zp_auth Autoryzacja «interface» IAuth + approveauthmethod(long) : boolean + authorization2finalize(string) : AuthorizationResult + authorization2prepare(trustedprofile, String, String) : String + authorizationfinalize(string, String) : AuthorizationResult + authorizationprepare(trustedprofileperson, String) : String + authorizationprepare(trustedprofileperson, TrustedProfileInstitution, String) : String + createauthmethod(authmethod) : AuthMethod + deleteauthmethod(long) : boolean + deleteauthmethod(authmethod) : boolean + findauthmethods(searchconditions) : ResultSet + getactiveauthmethod(long) : AuthMethod + getauthmethod(long) : AuthMethod + getcurrauthbypasswd(string) : CurrAuth + modifyauthmethod(authmethod) : AuthMethod «interface» CurrAuthDAO + create(currauth) : CurrAuth + getbypasswd(string) : CurrAuth + getcurrauth(long) : CurrAuth + remove(currauth) : void CurrAuthDAOImpl ~ em: EntityManager # logger: Log = LogFactory.getL... {readonly} CurrAuthColumnMap Serializable + EMAIL: String = "email" + EPUAP_ID: String = "epuapid" + ID: String = "id" + PASSWORD: String = "passwd" - serialversionuid: long = 1L {readonly} + START_TIME: String = "starttime" + TRUSTED_PROFILE_ID: String = "trustedprofileid" «interface» AuthRemote «interface» AuthLocal - checkmanager() : void + create(currauth) : CurrAuth + CurrAuthDAOImpl(EntityManager) + getbypasswd(string) : CurrAuth + getcurrauth(long) : CurrAuth + remove(currauth) : void CurrAuth AuthBean ~ em: EntityManager # logger: Log = LogFactory.getL... {readonly} + approveauthmethod(long) : boolean + authorization2finalize(string) : AuthorizationResult + authorization2prepare(trustedprofile, String, String) : String + authorizationfinalize(string, String) : AuthorizationResult + authorizationprepare(trustedprofileperson, String) : String + authorizationprepare(trustedprofileperson, TrustedProfileInstitution, String) : String - authorizeandgetpassword(string, String, String) : String + createauthmethod(authmethod) : AuthMethod + deleteauthmethod(authmethod) : boolean + deleteauthmethod(long) : boolean + findauthmethods(searchconditions) : ResultSet + getactiveauthmethod(long) : AuthMethod + getauthmethod(long) : AuthMethod + getcurrauthbypasswd(string) : CurrAuth - getdao() : AuthDAO + modifyauthmethod(authmethod) : AuthMethod + CURR_AUTH_TYPE_EPUAP: int = 2 + CURR_AUTH_TYPE_KEY_PASSWD: int = 1 - email: String - epuapid: String - id: Long - passwd: String - starttime: Date - trustedprofileinstid: Long - trustedprofilepersonid: Long - type: int + CurrAuth(Long, Long, Long, String, String, Date) + CurrAuth(Long, Long, Long, String, String, Date, String) + CurrAuth() + getemail() : String + getepuapid() : String + getid() : Long + getpasswd() : String + getstarttime() : Date + gettrustedprofileinstid() : Long + gettrustedprofilepersonid() : Long + gettype() : int + setemail(string) : void + setepuapid(string) : void + setid(long) : void + setpasswd(string) : void + setstarttime(date) : void + settrustedprofileinstid(long) : void + settrustedprofilepersonid(long) : void + settype(int) : void - instance: AuthBO AuthBO - AuthBO() + checkauthmethod(authmethod, int) : List<String> + getinstance() : AuthBO -instance AuthServ icelocator + getauth() : IAuth AuthHelper - CHAR_TAB: char ([]) = null ~ i: int = 0 # logger: Log = LogFactory.getL... {readonly} ~ tmp: char ([]) = new char[200] + generatepassword(int) : String + listtostring(list<string>, String) : String + sendmail(string, String, String, String) : void Rysunek 5 Diagram klas komponentu Autoryzacja 11/54

Moduł autoryzacyjny odpowiedzialny za zarządzanie metodami autoryzacji i autoryzację użytkownika. Powyższe funkcjonalności udostępnia na zewnątrz interfejs IAuth, po którym dziedziczą AuthLocal i AuthRemote, implementację dostarcza AuthBean. W ramach zarządzania metodami autoryzacji możliwe jest tworzenie, akceptacja, usuwanie i modyfikacja metod autoryzacji. Trzy ostatnie operacje możliwe są tylko dla metod mających status w trakcie tworzenia. Wszystkie operacje wymagają odpowiednich uprawnień w systemie EPUAP. Komunikację z bazą danych w przypadku metod autoryzacji umożliwia interfejs AuthDAO znajdujący się we wspólnym module zp_commons.jar. Druga z funkcjonalności udostępnianych przez moduł to autoryzacja. Autoryzacja jest dwuetapowa: w pierwszym kroku wysyłany jest użytkownikowi kod autoryzacyjny, służą do tego metody authorizationprepare(). Przy wywołaniu wspomniana metoda zwraca id sesji autoryzacyjnej. Metoda wysyłania kodu autoryzacyjnego zależy od wybranej metody autoryzacji, obecnie obsługiwany kanał to email, ale istnieje możliwość dynamicznego dodania nowej metody autoryzacji np. SMS em. Wymagane będzie przy tym zaimplementowanie WebService u wysyłającego SMS y. Przed wysłaniem kodu do użytkownika jest on zapisywany w bazie danych. Wykorzystywane są to do tego klasy CurrAuthDAO (udostępnia operacje zapisu, odczytu modyfikacji itp. danych na bazie) i CurrAuth (przechowuje informacje o bieżącej autoryzacji, tj. kod, data wysłania, id zaufanego profilu). Ze względów bezpieczeństwa klasy te nie są umieszczone we wspólnym module tak jak to ma miejsce w przypadku innych klas DAO. W kroku drugim weryfikowana jest zgodność id sesji autoryzacyjnej z kodem otrzymanym przez użytkownika (np. drogą mailową). Powyższa para musi być zgodna z danymi przechowanymi w bazie danych. Weryfikacja danych class zp_dataverification ZP DefaultSystemImpl - log: Logger = Logger.getLogge... - ZP_SUBSYSTEM_SHORT_NAME: String = "zp" {readonly} + dajinterfejs(string, String) : Object + dajskrotpodsystemu() : String «interface» DataVerifierLocal «interface» DataVerifierRemote + getorganisationinfo(string) : PodmiotInformacje + getuserinfo(string) : Uzytkownik + verifyapplication(application, boolean) : VerificationSummary + verifylegalpersondata(string, String, String, String, String, boolean) : VerificationSummary + verifynaturalpersondata(string, String, String, String, boolean) : VerificationSummary -system DataVerifierBean - iua: IUwierzytelnianieAutoryzacja - log: Logger = Logger.getLogge... - system: ZP - addlegalpersonverificationresults(string, String, String, String, PodmiotInformacje, List<VerificationResult>, boolean) : void - addnaturalpersonverificationresults(string, String, String, Uzytkownik, List<VerificationResult>, boolean) : void + comparescalar(string, String) : boolean + getorganisationinfo(string) : PodmiotInformacje + getuserinfo(string) : Uzytkownik + postconstruct() : void + predestroy() : void + verifyapplication(application, boolean) : VerificationSummary - verifylegalpersonapplication(legalpersonapplication, boolean) : VerificationSummary + verifylegalpersondata(string, String, String, String, String, boolean) : VerificationSummary - verifynaturalpersonapplication(naturalpersonapplication, boolean) : VerificationSummary + verifynaturalpersondata(string, String, String, String, boolean) : VerificationSummary «enumeration» VerificationSubject USER_OR_ORGANISATION_ID ORGANISATION_NAME USER_FIRST_NAME USER_SURNAME USER_PESEL ORGANISATION_REGON ORGANISATION_NIP ORGANISATION_KRS + getstring() : String VerificationSummary - fullverificationperformed: boolean - serialversionuid: long = 1L {readonly} - verificationresults: List<VerificationResult> Serializable + getverificationresults() : List<VerificationResult> + iseverythingcorrect() : boolean + isfullverificationperformed() : boolean + tostring() : String + VerificationSummary(boolean, Collection<VerificationResult>) Rysunek 6 Diagram klas komponentu weryfikacji danych «enumeration» VerificationStatus POSITIVE NEGATIVE CONNECTION_ERROR + getstring() : String Komponent zdefiniowano oraz zaimplementowano w postaci bezstanowych komponentów EJB dwa interfejsy lokalne: DataVerifierLocal oraz SecurityLocal. DataVerifierLocal odpowiedzialny jest za weryfikację danych zawartych we wniosku lub w zaufanym profilu z danymi zawartymi w koncie użytkownika lub profilu podmiotu epuap oraz za udostępnianie danych z konta użytkownika lub profilu podmiotu na podstawie identyfikatorów epuap-owych. W celu realizacji tych zadań 12/54

implementacja, klasa DataVerifierBean, korzysta z systemu ZP (w sensie epuap-owym, tj. klasy implementującej interfejs ISystem), za pomocą uzyskuje dostęp do interfejsu IUwierzytelnianieAutoryzacja, który udostępnia dane z bazy danych UB (podmioty) lub Draco (użytkownicy). Drugi komponent EJB - SecurityBean realizuje odpowiedzialność zdefiniowaną przez SecurityLocal w sposób podobny do DataVerifierBean, lecz korzysta z interfejsu IZarzadzanieUprawnieniami. SecurityLocal określa funkcje zwracające uprawnienia zalogowanego użytkownika oraz pomocnicze zwracające identyfikator użytkownika i podmiotu na podstawie tokenu bezpieczeństwa TGSID przekazywanego jako "ciasteczko" (ang. cookie) po łączu szyfrowanym. Podpis Komponent umożliwia podpisywanie dokumentów XML przy użyciu zaufanego profilu. Na zewnątrz wystawione są dwa interfejsy SignatureLocal dla wywołań z maszyny lokalnej i SignatureRemote do wywołań zdalnych. Implementacja znajduje się z bean ie SignatureBean. Podpisanie dokumentu zaufanym profilem wymaga autoryzacji użytkownika i z tego powodu jest dwuetapowe. W pierwszym kroku należy wywołać funkcję preparesignwithtrustedprofileorg lub preparesignwithtrustedprofileperson w zależności czy chcemy podpisać zaufanym profilem organizacji czy użytkownika. W parametrach funkcji przekazywane są nazwa użytkownika i nazwa organizacji, dla których istnieją ZP. System wysyła kod autoryzacyjny i zwraca klientowi id sesji. W kroku drugim wywoływana jest funkcja signwithtrustedprofile(), do której przekazywany jest dokument do podpisania i id sesji. Po poprawnej weryfikacji użytkownika dokument jest podpisywany przy użyciu zaufanych profili przekazanych w kroku pierwszym i zwracany do klienta. Poza podpisywaniem moduł umożliwia kontrasygnowanie profilem organizacji podpisu kwalifikowanego i weryfikację podpisu pod dokumentem 13/54

class zp_storage «interface» ITrustedProfile + PROFILE_TYPE_INSTYTUTION: int = 2 {readonly} + PROFILE_TYPE_PERSON: int = 1 {readonly} + VERIFY_DATA_WITH_XML: String = "XMLDATA" {readonly} + VERIFY_PERIOD: String = "PERIOD" {readonly} + VERIFY_SIGNATURE: String = "SIGN" {readonly} + VERIFY_SIGNATURE_EXT: String = "SIGN_EXT" {readonly} + VERIFY_STATE: String = "STATE" {readonly} + VERIFY_WITH_EPUAP: String = "EPUAP" {readonly} + createprofile(byte[]) : Long + createprofile(byte[], ContextInfo) : Long + extendprofile(byte[]) : Long + extendprofile(byte[], ContextInfo) : Long + findprofilefororganization(string, String, String, String) : TrustedProfile + findprofileforperson(string, String, String) : TrustedProfile + findprofilesorg(searchconditions) : ResultSet + findprofilesperson(searchconditions) : ResultSet + getadditionalattr(long) : List + getinvalidatingdata(string) : InvalidatedData + getprofile(long) : TrustedProfile + getprofile(long, boolean) : TrustedProfile + getprofileorgbyepuapaccount(string) : TrustedProfileInstitution + getprofileorgbyepuapaccount(string, boolean) : TrustedProfileInstitution + getprofilepersonbyepuapaccount(string) : TrustedProfilePerson + getprofilepersonbyepuapaccount(string, boolean) : TrustedProfilePerson + invalidate(long, String, String) : boolean + invalidateprofile(string, String, String) : boolean + prepareextendprofile(long) : byte[] + prepareinvalidateprofile(string, String, int) : String + prepareprofilefile(trustedprofile, List<AdditionalAttr>) : byte[] + verifyandgetprofile(long, boolean) : TrustedProfile + verifyandgetprofile(long, boolean, ContextInfo) : TrustedProfile + verifyandgetprofileorgbyepuapaccount(string, ContextInfo) : TrustedProfileInstitution + verifyandgetprofilepersonbyepuapaccount(string, ContextInfo) : TrustedProfilePerson + verifyprofile(long, String[], boolean) : VerificationResult + verifyprofile(long, String[], boolean, ContextInfo) : VerificationResult + verifyprofileext(long, ContextInfo) : VerificationResultExt «interface» TrustedProfileRemote «interface» TrustedProfileLocal TrustedProfileBean ~ auth: AuthLocal = null ~ em: EntityManager # logger: Log = LogFactory.getL... {readonly} ~ verifier: DataVerifierLocal = null + createprofile(byte[]) : Long + createprofile(byte[], ContextInfo) : Long + extendprofile(byte[]) : Long + extendprofile(byte[], ContextInfo) : Long + findprofilefororganization(string, String, String, String) : TrustedProfile + findprofileforperson(string, String, String) : TrustedProfile + findprofilesorg(searchconditions) : ResultSet + findprofilesperson(searchconditions) : ResultSet + getadditionalattr(long) : List - getdao() : TrustedProfileDAO + getinvalidatingdata(string) : InvalidatedData + getprofile(long) : TrustedProfile + getprofile(long, boolean) : TrustedProfile + getprofileorgbyepuapaccount(string) : TrustedProfileInstitution + getprofileorgbyepuapaccount(string, boolean) : TrustedProfileInstitution + getprofilepersonbyepuapaccount(string) : TrustedProfilePerson + getprofilepersonbyepuapaccount(string, boolean) : TrustedProfilePerson + invalidate(long, String, String) : boolean + invalidateprofile(string, String, String) : boolean + prepareextendprofile(long) : byte[] + prepareinvalidateprofile(string, String, int) : String + prepareprofilefile(trustedprofile, List<AdditionalAttr>) : byte[] - validatewithepuap(trustedprofile) : boolean + verifyandgetprofile(long, boolean, ContextInfo) : TrustedProfile + verifyandgetprofile(long, boolean) : TrustedProfile + verifyandgetprofileorgbyepuapaccount(string, ContextInfo) : TrustedProfileInstitution + verifyandgetprofilepersonbyepuapaccount(string, ContextInfo) : TrustedProfilePerson - verifyprofile(trustedprofile, String[], boolean, ContextInfo) : VerificationResult + verifyprofile(long, String[], boolean, ContextInfo) : VerificationResult + verifyprofile(long, String[], boolean) : VerificationResult + verifyprofileext(long, ContextInfo) : VerificationResultExt Constraints + TP_PROFILE_DEFAULT_LIFESPAN: int = 3 + TP_XML_PARAM_ADD_ATTR_NAME: String = "nazwa" + TP_XML_TAG_ADD_ATTR: String = "zp:atrybutdoda... + TP_XML_TAG_AUT_ID: String = "zp:idpolitykia... + TP_XML_TAG_AUT_PARAM: String = "zp:parametrpol... + TP_XML_TAG_CREATION_DATE: String = "zp:datautworzenia" + TP_XML_TAG_EXPIRATION_DATE: String = "zp:datawygasniecia" + TP_XML_TAG_ORG_DATA: String = "zp:potwierdzon... + TP_XML_TAG_ORG_EMAIL: String = "adr:email" + TP_XML_TAG_ORG_EPUAP_ACCOUNT: String = "zp:idkontaorga... + TP_XML_TAG_ORG_KRS: String = "ins:krs" + TP_XML_TAG_ORG_LOCATION: String = "zp:siedziba" + TP_XML_TAG_ORG_NAME: String = "ins:nazwainsty... + TP_XML_TAG_ORG_NIP: String = "ins:nip" + TP_XML_TAG_ORG_REGON: String = "ins:regon" + TP_XML_TAG_PERSON_DATA: String = "zp:potwierdzon... + TP_XML_TAG_PERSON_EMAIL: String = "adr:email" + TP_XML_TAG_PERSON_EPUAP_ACCOUNT: String = "zp:idkontauzyt... + TP_XML_TAG_PERSON_NAME: String = "os:imie" + TP_XML_TAG_PERSON_PESEL: String = "os:pesel" + TP_XML_TAG_PERSON_PHONE: String = "adr:telefon" + TP_XML_TAG_PERSON_SURNAME: String = "os:nazwisko" + TP_XML_TAG_PROPERTIES: String = "zp:wlasciwoscizp" + TP_XML_TAG_ROOT: String = "zp:zaufanyprofil" + TP_XML_TAG_ROOT_ATTR_NS_ADR_NAME: String = "xmlns:adr" + TP_XML_TAG_ROOT_ATTR_NS_ADR_VALUE: String = "http://crd.gov... + TP_XML_TAG_ROOT_ATTR_NS_DS_NAME: String = "xmlns:ds" + TP_XML_TAG_ROOT_ATTR_NS_DS_VALUE: String = "http://www.w3... + TP_XML_TAG_ROOT_ATTR_NS_INS_NAME: String = "xmlns:ins" + TP_XML_TAG_ROOT_ATTR_NS_INS_VALUE: String = "http://crd.gov... + TP_XML_TAG_ROOT_ATTR_NS_PPZP_NAME: String = "xmlns:ppzp" + TP_XML_TAG_ROOT_ATTR_NS_PPZP_VALUE: String = "PPZP" + TP_XML_TAG_ROOT_ATTR_NS_XSI_NAME: String = "xmlns:xsi" + TP_XML_TAG_ROOT_ATTR_NS_XSI_VALUE: String = "http://www.w3... + TP_XML_TAG_ROOT_ATTR_NS_ZP_NAME: String = "xmlns:zp" + TP_XML_TAG_ROOT_ATTR_NS_ZP_VALUE: String = "Zaufany Profil" + TP_XML_TAG_ROOT_ATTR_SCHEMA_LOCATION_NAME: String = "xsi:schemalocation" + TP_XML_TAG_ROOT_ATTR_SCHEMA_LOCATION_VALUE: String = "Zaufany Profil... + TP_XML_TAG_TP_ID: String = "ppzp:idzaufane... + TP_XML_TAG_TRUSTED_DATA: String = "zp:potwierdzon... TrustedProfileHelper - instance: TrustedProfileHelper -instance - logger: Log = LogFactory.getL... {readonly} - profiletemplateorg: byte ([]) - profiletemplateperson: byte ([]) - profilexsd: byte ([]) + getadditionalattributes(byte[]) : List<AdditionalAttr> + getinstance() : TrustedProfileHelper - getprofileschema() : byte[] - getprofiletemplateorg() : byte[] - getprofiletemplateperson() : byte[] + parsetrustedprofile(byte[], Object) : TrustedProfile + preparetrusteprofilefile(trustedprofile, List<AdditionalAttr>) : XmlHelper - TrustedProfileHelper() + validatesignature(trustedprofile, ContextInfo) : boolean + validatesignature(trustedprofile, ContextInfo, boolean) : boolean + verifyprofileext(trustedprofile, ContextInfo) : VerificationResultExt Serializable ZPServ icelocator - serialversionuid: long = 1L {readonly} + gettrustedprofile() : ITrustedProfile Serializable VerificationResult - reason: String - serialversionuid: long = 1L {readonly} - state: String + getreason() : String + getstate() : String + setreason(string) : void + setstate(string) : void + tostring() : String + VerificationResult(String, String) + VerificationResult(String) Serializable VerificationResultExt - OPcertificateValid: boolean - OPname: String - serialversionuid: long = 1L {readonly} - state: String + getstate() : String + isopcertificatevalid() : boolean + setstate(string) : void + tostring() : String + VerificationResultExt(String, String, boolean) + VerificationResultExt() «property get» + getopname() : String «property set» + setopcertificatevalid(boolean) : void + setopname(string) : void Rysunek 7 Diagram klas komponentu podpisu 14/54

Magazyn ZP class zp_signature «interface» ISignature + countersignwithtrustedprofile(byte[], String, String, String, ContextInfo, boolean) : SigningResult + preparesignwithtrustedprofileorg(string, String) : String + preparesignwithtrustedprofileperson(string) : String + signwithtrustedprofile(byte[], String, String, ContextInfo, boolean) : SigningResult + verifysignature(byte[], ContextInfo) : VerifyResult + verifysignaturexml(byte[], ContextInfo) : String SignException TPException - serialversionuid: long = 1L {readonly} + SignException(String) + SignException(String, Throwable) + SignException(Throwable) «interface» SignatureLocal «interface» SignatureRemote ~ authbean: AuthLocal = null # logger: Log = LogFactory.getL... {readonly} ~ profilebean: TrustedProfileLocal = null ~ slog: SLoggerLocal = null SignatureBean + countersignwithtrustedprofile(byte[], String, String, String, ContextInfo, boolean) : SigningResult - log(byte[], Long, String, String) : boolean + preparesignwithtrustedprofileorg(string, String) : String + preparesignwithtrustedprofileperson(string) : String + signwithtrustedprofile(byte[], String, String, ContextInfo, boolean) : SigningResult + verifysignature(byte[], ContextInfo) : VerifyResult + verifysignaturexml(byte[], ContextInfo) : String - logger: Log = LogFactory.getL... {readonly} - signaturetemplateorg: byte ([]) - signaturetemplateorgperson: byte ([]) - signaturetemplateperson: byte ([]) SignatureHelper - getsignaturetemplateorg() : byte[] - getsignaturetemplateorgperson() : byte[] - getsignaturetemplateperson() : byte[] + prepareclaimedrolestructure(trustedprofile, String) : byte[] + prepareclaimedrolestructure(trustedprofileperson, TrustedProfileInstitution, String) : byte[] - settrusteddata(trustedprofile, XmlHelper[]) : void Rysunek 8 Diagram klas komponentu Magazyn ZP Komponent udostępnia API do zarządzania zaufanymi profilami. Główny interfejs wystawiany na zewnątrz to ITrustedProfile, po którym dziedziczą TrustedProfileRemote i TrustedProfileLocal odpowiednio dla wywołań zdalnych i lokalnych. Główne funkcjonalności modułu to tworzenie, usuwanie, przedłużanie, wyszukiwanie i weryfikacja zaufanych profili. Przed utworzeniem zaufanego profilu moduł zewnętrzny może pobrać szablon profilu w formie pliku XML (plik profilu). Po wypełnieniu danych i podpisaniu pliku profilu moduł zewnętrzny wywołuje funkcję createprofile(), która weryfikuje poprawność otrzymanego pliku profilu, zgodność z systemami zewnętrznymi (np. PESEL em, EPUAP em), poprawność podpisu itp. Po pozytywnej weryfikacji profil zostaje zapisany do bazy. O operacjach tworzenia, usuwania, przedłużania użytkownik jest powiadamiany mailem. Moduł wysyła także maile w przypadku, gdy kończy się okres ważności zaufanego profilu 3.1.5 Struktury informacji Struktura profilu zaufanego <?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/xmlschema" xmlns:zp="http://www.comarch.com/zp" xmlns:ins="http://crd.gov.pl/xml/schematy/instytucja/2009/03/06/" xmlns:adr="http://crd.gov.pl/xml/schematy/adres/2009/03/06/" xmlns:os="http://crd.gov.pl/xml/schematy/osoba/2009/03/06/" xmlns:ppzp="http://www.comarch.com/ppzp" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 15/54

targetnamespace="http://www.comarch.com/zp" elementformdefault="qualified" attributeformdefault="unqualified"> <xs:import namespace="http://crd.gov.pl/xml/schematy/instytucja/2009/03/06/" schemalocation="http://crd.gov.pl/xml/schematy/instytucja/2009/03/06/instyt ucja.xsd"/> <xs:import namespace="http://crd.gov.pl/xml/schematy/adres/2009/03/06/" schemalocation="http://crd.gov.pl/xml/schematy/adres/2009/03/06/adres.xsd"/ > <xs:import namespace="http://crd.gov.pl/xml/schematy/osoba/2009/03/06/" schemalocation="http://crd.gov.pl/xml/schematy/osoba/2009/03/06/osoba.xsd"/ > <xs:import namespace="http://www.comarch.com/ppzp" schemalocation="podpiszp.xsd"/> <xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemalocation="http://www.w3.org/tr/2002/rec-xmldsig-core- 20020212/xmldsig-core-schema.xsd"/> <xs:simpletype name="string255"> <xs:restriction base="xs:string"> <xs:maxlength value="255"/> </xs:restriction> </xs:simpletype> <xs:complextype name="atrybutdodatkowytyp"> <xs:simplecontent> <xs:extension base="zp:string255"> <xs:attribute name="nazwa" type="zp:string255"/> </xs:extension> </xs:simplecontent> </xs:complextype> <xs:simpletype name="siedzibatyp"> <xs:restriction base="zp:string255"/> </xs:simpletype> <xs:simpletype name="idkontaepuaptyp"> <xs:restriction base="zp:string255"/> </xs:simpletype> <xs:complextype name="potwierdzonedanezposobyfizycznejtyp"> <xs:sequence> <xs:element ref="os:imie"/> <xs:element ref="os:nazwisko"/> <xs:element ref="os:pesel"/> <xs:element name="idkontauzytkownikaepuap" type="zp:idkontaepuaptyp"/> <xs:element ref="adr:email"/> <xs:element ref="adr:telefon" minoccurs="0"/> <xs:element name="atrybutdodatkowy" type="zp:atrybutdodatkowytyp" minoccurs="0" maxoccurs="unbounded"/> </xs:sequence> </xs:complextype> <xs:complextype name="potwierdzonedanezporganizacjityp"> <xs:sequence> <xs:element ref="ins:nazwainstytucji"/> <xs:element ref="ins:nip"/> <xs:element ref="ins:krs" minoccurs="0"/> <xs:element ref="ins:regon"/> <xs:element name="siedziba" type="zp:siedzibatyp"/> <xs:element name="idkontaorganizacjiepuap" type="zp:idkontaepuaptyp"/> <xs:element ref="adr:email"/> 16/54

<xs:element name="atrybutdodatkowy" type="zp:atrybutdodatkowytyp" minoccurs="0" maxoccurs="unbounded"/> </xs:sequence> </xs:complextype> <xs:complextype name="potwierdzonedanezptyp"> <xs:choice> <xs:element name="potwierdzonedanezposobyfizycznej" type="zp:potwierdzonedanezposobyfizycznejtyp"/> <xs:element name="potwierdzonedanezporganizacji" type="zp:potwierdzonedanezporganizacjityp"/> </xs:choice> </xs:complextype> <xs:complextype name="wlasciwoscizptyp"> <xs:sequence> <xs:element name="datautworzenia" type="xs:date"/> <xs:element name="datawygasniecia" type="xs:date"/> <xs:element ref="ppzp:idzaufanegoprofilu"/> <xs:element name="idpolitykiautoryzacji" type="xs:positiveinteger"/> <xs:element name="parametrpolitykiautoryzacji" type="xs:string"/> </xs:sequence> </xs:complextype> <xs:complextype name="zaufanyprofiltyp"> <xs:sequence> <xs:element name="potwierdzonedanezp" type="zp:potwierdzonedanezptyp"/> <xs:element name="wlasciwoscizp" type="zp:wlasciwoscizptyp"/> <xs:element ref="ds:signature"/> </xs:sequence> </xs:complextype> <xs:element name="zaufanyprofil" type="zp:zaufanyprofiltyp"/> </xs:schema> Struktura podpisu ZP <?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/xmlschema" xmlns:ppzp="http://www.comarch.com/ppzp" xmlns:os="http://crd.gov.pl/xml/schematy/osoba/2009/03/06/" xmlns:ins="http://crd.gov.pl/xml/schematy/instytucja/2009/03/06/" targetnamespace="http://www.comarch.com/ppzp" elementformdefault="qualified" attributeformdefault="unqualified"> <xs:import namespace="http://crd.gov.pl/xml/schematy/instytucja/2009/03/06/" schemalocation="http://crd.gov.pl/xml/schematy/instytucja/2009/03/06/instyt ucja.xsd"/> <xs:import namespace="http://crd.gov.pl/xml/schematy/osoba/2009/03/06/" schemalocation="http://crd.gov.pl/xml/schematy/osoba/2009/03/06/osoba.xsd"/ > <xs:element name="idzaufanegoprofilu" type="xs:positiveinteger"/> <xs:element name="idkontaorganizacjiepuap" type="ppzp:idkontaepuaptyp"/> <xs:element name="idkontauzytkownikaepuap" type="ppzp:idkontaepuaptyp"/> <xs:simpletype name="string255"> <xs:restriction base="xs:string"> 17/54

<xs:maxlength value="255"/> </xs:restriction> </xs:simpletype> <xs:simpletype name="idkontaepuaptyp"> <xs:restriction base="ppzp:string255"/> </xs:simpletype> <xs:complextype name="danezporganizacjityp"> <xs:sequence> <xs:element ref="ins:nazwainstytucji"/> <xs:element ref="ins:nip"/> <xs:element ref="ins:regon"/> <xs:element ref="ppzp:idzaufanegoprofilu"/> <xs:element ref="ppzp:idkontaorganizacjiepuap"/> </xs:sequence> </xs:complextype> <xs:complextype name="danezposobyfizycznejtyp"> <xs:sequence> <xs:element ref="os:nazwisko"/> <xs:element ref="os:imie"/> <xs:element ref="os:pesel"/> <xs:element ref="ppzp:idzaufanegoprofilu"/> <xs:element ref="ppzp:idkontauzytkownikaepuap"/> </xs:sequence> </xs:complextype> <xs:complextype name="danezptyp"> <xs:sequence> <xs:element name="danezporganizacji" type="ppzp:danezporganizacjityp" minoccurs="0"/> <xs:element name="danezposobyfizycznej" type="ppzp:danezposobyfizycznejtyp" minoccurs="0"/> </xs:sequence> </xs:complextype> <xs:simpletype name="idpolitykiautoryzacjityp"> <xs:restriction base="xs:positiveinteger"/> </xs:simpletype> <xs:complextype name="danepodpisutyp"> <xs:sequence> <xs:element ref="ppzp:idkontauzytkownikaepuap"/> <xs:element name="idpolitykiautoryzacji" type="ppzp:idpolitykiautoryzacjityp"/> </xs:sequence> </xs:complextype> <xs:complextype name="podpiszptyp"> <xs:sequence> <xs:element name="danezp" type="ppzp:danezptyp"/> <xs:element name="danepodpisu" type="ppzp:danepodpisutyp"/> </xs:sequence> </xs:complextype> <xs:element name="podpiszp" type="ppzp:podpiszptyp"/> </xs:schema> 3.1.6 Zdarzenia Działanie aplikacji ZP powoduje rejestrowanie w systemie EPUAP poniższych zdarzeń: podpisanie dokumentu przy użyciu ZP, kontrasygnata podpisu przy użyciu ZP, dodawanie metod autoryzacji, 18/54

usuwanie metod autoryzacji, modyfikacja metod autoryzacji, akceptacja metod autoryzacji, tworzenie zaufanego profilu, przedłużanie zaufanego profilu, unieważnianie zaufanego profilu. 19/54

4 Interfejsy 4.1 Interfejs graficzny użytkownika W podpunktach zaprezentowano makiety formatek implementowanych w ramach interfejsu użytkownika. 4.1.1 Obsługa metod autoryzacji 20/54

21/54

22/54

23/54

4.1.2 Profil Zaufany 24/54

25/54

26/54

4.1.3 Unieważnienie profilu zaufanego 27/54

28/54

29/54

4.1.4 Listy wniosków i profilów zaufanych 30/54

31/54

32/54

4.1.5 Wniosek o założenie profilu zaufanego 33/54

34/54

35/54

36/54

37/54

4.2 Interfejsy zewnętrzne 4.2.1 Dostarczanie informacji o posiadaniu profilu ZP Interfejs odpowiada rezultatem logicznym (prawda, fałsz) po wywołaniu operacji hastrustedprofileinstitution oraz hastrustedprofileperson odpowiednio dla ZP podmiotu i ZP użytkownika. 4.2.2 Podpisywanie z użyciem ZP Podpisywanie przez systemy zewnętrzne opisuje poniższy przebieg: 1. System zewnętrzny za pośrednictwem usługi WebServices (WSSecurity) rejestruje zlecenie podpisu dokumentu. W rezultacie otrzymuje URL, pod który ma przekierować użytkownika 2. Użytkownik loguje się do epuap i podpisuje dokument. Jeśli operacja zostanie sukcesem epuap przekierowuje użytkownika na stronę przekazaną w zleceniu w parametrze "successurl, w przeciwnym wypadku epuap przekierowuje użytkownika na stronę określoną w "failureurl". 3. System zewnętrzny za pośrednictwem usługi WebServices (WSSecurity) pobiera podpisany dokument z epuap. Dokument jest usuwany z systemu epuap. 4.2.3 Weryfikacja podpisu ZP Operacja verifysignature umożliwia przekazanie dokumentu, który będzie poddany weryfikacji. Rezultatem weryfikacji jest struktura XML zawierająca wszystkie niezbędne informacje dotyczące podpisu dokumentu. 4.2.4 Definicja WSDL interfejsu Poniżej definicja WSDL interfejsu. Usługi WebServices będą implementowane zgodnie w wymaganiami dla epuap tj. WebServices Security komunikaty podpisywane x.509 w bezpiecznym kanale SSL. <?xml version="1.0" encoding="utf-8"?> <wsdl:definitions targetnamespace="http://signing.ws.comarch.gov" xmlns:impl="http://signing.ws.comarch.gov" xmlns:intf="http://signing.ws.comarch.gov" xmlns:tns2="http://exception.ws.comarch.gov" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsi="http://ws-i.org/profiles/basic/1.1/xsd" xmlns:xsd="http://www.w3.org/2001/xmlschema"> <wsdl:types> <schema targetnamespace="http://signing.ws.comarch.gov" xmlns="http://www.w3.org/2001/xmlschema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/xmlschema"> <element name="tgsid" nillable="true" type="xsd:string"/> <element name="hastrustedprofileinstitutionreturn" type="xsd:boolean"/> <element name="string" nillable="true" type="xsd:string"/> 38/54

<element name="hastrustedprofilepersonreturn" type="xsd:boolean"/> <element name="doc" type="xsd:base64binary"/> <element name="successurl" nillable="true" type="xsd:string"/> <element name="failureurl" nillable="true" type="xsd:string"/> <element name="additionalinfo" nillable="true" type="xsd:string"/> <element name="adddocumenttosigningreturn" nillable="true" type="xsd:string"/> <element name="id" nillable="true" type="xsd:string"/> <element name="getsigneddocumentreturn" type="xsd:base64binary"/> <element name="document" type="xsd:base64binary"/> <element name="verifysigneddocumentreturn" nillable="true" type="xsd:string"/> </schema> <schema targetnamespace="http://exception.ws.comarch.gov" xmlns="http://www.w3.org/2001/xmlschema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/xmlschema"> <complextype name="wssigningexception"> <sequence> <element name="code" nillable="true" type="xsd:string"/> <element name="errmessage" nillable="true" type="xsd:string"/> </sequence> </complextype> <element name="wssigningexception" nillable="true" type="tns2:wssigningexception"/> </schema> </wsdl:types> <wsdl:message name="verifysigneddocumentrequest"> <wsdl:part name="document" type="xsd:base64binary"/> </wsdl:message> <wsdl:message name="adddocumenttosigningresponse"> <wsdl:part name="adddocumenttosigningreturn" type="xsd:string"/> </wsdl:message> <wsdl:message name="getsigneddocumentresponse"> <wsdl:part name="getsigneddocumentreturn" type="xsd:base64binary"/> </wsdl:message> <wsdl:message name="hastrustedprofilepersonrequest"> <wsdl:part name="tgsid" type="xsd:string"/> </wsdl:message> <wsdl:message name="hastrustedprofileinstitutionresponse"> <wsdl:part name="hastrustedprofileinstitutionreturn" type="xsd:boolean"/> </wsdl:message> <wsdl:message name="wssigningexception"> <wsdl:part name="fault" type="tns2:wssigningexception"/> </wsdl:message> <wsdl:message name="hastrustedprofileinstitutionrequest"> 39/54

<wsdl:part name="tgsid" type="xsd:string"/> </wsdl:message> <wsdl:message name="getsigneddocumentrequest"> <wsdl:part name="id" type="xsd:string"/> </wsdl:message> <wsdl:message name="hastrustedprofilepersonresponse"> <wsdl:part name="hastrustedprofilepersonreturn" type="xsd:boolean"/> </wsdl:message> <wsdl:message name="verifysigneddocumentresponse"> <wsdl:part name="verifysigneddocumentreturn" type="xsd:string"/> </wsdl:message> <wsdl:message name="adddocumenttosigningrequest"> <wsdl:part name="doc" type="xsd:base64binary"/> <wsdl:part name="successurl" type="xsd:string"/> <wsdl:part name="failureurl" type="xsd:string"/> <wsdl:part name="additionalinfo" type="xsd:string"/> </wsdl:message> <wsdl:porttype name="tpsigning"> <wsdl:operation name="hastrustedprofileinstitution" parameterorder="tgsid"> <wsdl:input message="intf:hastrustedprofileinstitutionrequest" name="hastrustedprofileinstitutionrequest"/> <wsdl:output message="intf:hastrustedprofileinstitutionresponse" name="hastrustedprofileinstitutionresponse"/> <wsdl:fault message="intf:wssigningexception" name="wssigningexception"/> </wsdl:operation> <wsdl:operation name="hastrustedprofileperson" parameterorder="tgsid"> <wsdl:input message="intf:hastrustedprofilepersonrequest" name="hastrustedprofilepersonrequest"/> <wsdl:output message="intf:hastrustedprofilepersonresponse" name="hastrustedprofilepersonresponse"/> <wsdl:fault message="intf:wssigningexception" name="wssigningexception"/> </wsdl:operation> <wsdl:operation name="adddocumenttosigning" parameterorder="doc successurl failureurl additionalinfo"> <wsdl:input message="intf:adddocumenttosigningrequest" name="adddocumenttosigningrequest"/> 40/54

<wsdl:output message="intf:adddocumenttosigningresponse" name="adddocumenttosigningresponse"/> <wsdl:fault message="intf:wssigningexception" name="wssigningexception"/> </wsdl:operation> <wsdl:operation name="getsigneddocument" parameterorder="id"> <wsdl:input message="intf:getsigneddocumentrequest" name="getsigneddocumentrequest"/> <wsdl:output message="intf:getsigneddocumentresponse" name="getsigneddocumentresponse"/> <wsdl:fault message="intf:wssigningexception" name="wssigningexception"/> </wsdl:operation> <wsdl:operation name="verifysigneddocument" parameterorder="document"> <wsdl:input message="intf:verifysigneddocumentrequest" name="verifysigneddocumentrequest"/> <wsdl:output message="intf:verifysigneddocumentresponse" name="verifysigneddocumentresponse"/> <wsdl:fault message="intf:wssigningexception" name="wssigningexception"/> </wsdl:operation> </wsdl:porttype> <wsdl:binding name="tpsigningsoapbinding" type="intf:tpsigning"> <wsaw:usingaddressing wsdl:required="false" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"/> <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="hastrustedprofileinstitution"> <wsdlsoap:operation soapaction="hastrustedprofileinstitution"/> <wsdl:input name="hastrustedprofileinstitutionrequest"> <wsdlsoap:body namespace="http://signing.ws.comarch.gov" use="literal"/> </wsdl:input> <wsdl:output name="hastrustedprofileinstitutionresponse"> <wsdlsoap:body namespace="http://signing.ws.comarch.gov" use="literal"/> </wsdl:output> <wsdl:fault name="wssigningexception"> <wsdlsoap:fault name="wssigningexception" use="literal"/> 41/54

</wsdl:fault> </wsdl:operation> <wsdl:operation name="hastrustedprofileperson"> <wsdlsoap:operation soapaction="hastrustedprofileperson"/> <wsdl:input name="hastrustedprofilepersonrequest"> <wsdlsoap:body namespace="http://signing.ws.comarch.gov" use="literal"/> </wsdl:input> <wsdl:output name="hastrustedprofilepersonresponse"> <wsdlsoap:body namespace="http://signing.ws.comarch.gov" use="literal"/> </wsdl:output> <wsdl:fault name="wssigningexception"> <wsdlsoap:fault name="wssigningexception" use="literal"/> </wsdl:fault> </wsdl:operation> <wsdl:operation name="adddocumenttosigning"> <wsdlsoap:operation soapaction="adddocumenttosigning"/> <wsdl:input name="adddocumenttosigningrequest"> <wsdlsoap:body namespace="http://signing.ws.comarch.gov" use="literal"/> </wsdl:input> <wsdl:output name="adddocumenttosigningresponse"> <wsdlsoap:body namespace="http://signing.ws.comarch.gov" use="literal"/> </wsdl:output> <wsdl:fault name="wssigningexception"> <wsdlsoap:fault name="wssigningexception" use="literal"/> </wsdl:fault> </wsdl:operation> <wsdl:operation name="getsigneddocument"> <wsdlsoap:operation soapaction="getsigneddocument"/> <wsdl:input name="getsigneddocumentrequest"> <wsdlsoap:body namespace="http://signing.ws.comarch.gov" use="literal"/> </wsdl:input> <wsdl:output name="getsigneddocumentresponse"> <wsdlsoap:body namespace="http://signing.ws.comarch.gov" use="literal"/> 42/54

</wsdl:output> <wsdl:fault name="wssigningexception"> <wsdlsoap:fault name="wssigningexception" use="literal"/> </wsdl:fault> </wsdl:operation> <wsdl:operation name="verifysigneddocument"> <wsdlsoap:operation soapaction="verifysigneddocument"/> <wsdl:input name="verifysigneddocumentrequest"> <wsdlsoap:body namespace="http://signing.ws.comarch.gov" use="literal"/> </wsdl:input> <wsdl:output name="verifysigneddocumentresponse"> <wsdlsoap:body namespace="http://signing.ws.comarch.gov" use="literal"/> </wsdl:output> <wsdl:fault name="wssigningexception"> <wsdlsoap:fault name="wssigningexception" use="literal"/> </wsdl:fault> </wsdl:operation> </wsdl:binding> <wsdl:service name="tpsigningservice"> <wsdl:port binding="intf:tpsigningsoapbinding" name="tpsigning"> <wsdlsoap:address location="http://localhost:9080/zp_signing_external_ws/services/tpsigning"/ > </wsdl:port> </wsdl:service> </wsdl:definitions> 43/54

5 Architektura fizyczna 5.1 Schemat bazy danych Rozdziała zawiera listę tabel aplikacji ZP. 44/54

Rysunek 9 Schemat bazy danych (część 1) 45/54

Rysunek 10 Schemat bazy danych (część 2) 5.1.1 Tabela ADDITIONALATTRIBUTE 46/54