Wyniki wyszukiwania dla frazy:

Wy艣wietl wyniki dla:

Wyniki: 672

Sortowanie:

Poczenia do usugi sieciowej SIO-KReM

Data ostatniej aktualizacji: 23.05.2023 Instrukcja poczenia do usugi sieciowej SIO-KReM na rodowisku produkcyjnym Spis treci 1. System SIO-Krem 4 2. Wykorzystane technologie i standardy przy tworzeniu serwera usug sieciowych 6 3. Dodanie klienta usugi sieciowej w aplikacji SIO-KReM 7 4. Uwierzytelnianie: 12 5. Podpis elektroniczny: 13 5.1 Algorytm podpisywania wiadomoci 14 6. Interfejsy: 16 6.1 GetStudentResultSet 16 7. Dodatkowe uwagi do zapyta SOAP 19 8. Przykadowa klasa JAVA do obsugi kluczy RSA SHA512: 19 9. Przykadowa klasa JAVA do obsugi kluczy OpenPGP: 22 System SIO-Krem Aplikacja SIO-KREM jest czci SIO (Systemu Informacji Owiatowej) i jest przeznaczona do wsparcia procesu rekrutacji kandydatw na uczelnie wysze poprzez udostpnienie wynikw egzaminw maturalnych oraz innych zwizanych z tym informacji uczelniom, ktre posiadaj aktywny dostp do SIO i podadz PESEL kandydata. Podstaw prawn dziaania aplikacji SIO-KREM jest art. 62 ustawy o SIO (pozyskiwanie danych przez uczelnie). Do bazy danych SIO-KREM maj dostp uczelnie publiczne, niepubliczne i kocielne zarejestrowane w bazie danych SIO z typem podmiotu S001 id = 142, 145, 162, ktre posiadaj aktywny dostp do SIO. W bazie danych SIO-KREM znajduj si informacje o wynikach zdanego egzaminu maturalnego poszczeglnych osb (w przyszoci rwnie wyniki egzaminu zawodowego lub egzaminu potwierdzajcego kwalifikacje w zawodzie). Wyniki egzaminw przekazywane s przez OKE do SIO-KREM na podstawie art. 20 ustawy o SIO. Na informacje o kandydacie skadaj si dane o: procentowych wynikach z poszczeglnych egzaminw maturalnych wskazanie centyla, w ktrym dany wynik si znajduje lista numerw dokumentw wydanych danemu kandydatw informacj o ukoczonej szkole Zalogowana uczelnia ma moliwo zarejestrowania PESEL kandydata - wpisanego rcznie lub zaimportowanego z pliku. Aplikacja przyjmuje jedynie PESELe o poprawnej strukturze oraz informuje jakie PESELe z zaczonego pliku s bdne (tj. maj nieprawidow struktur). Po zarejestrowaniu danych na licie kandydatw danej uczelni uczelnia ma moliwo pobrania plikw csv z danymi: wynikw numerw dokumentw centyli szk Pliki podzielone s na pliki z: nowymi danymi - czyli takie dane, ktre nigdy nie byy pobrane przez dany podmiot z danego zakresu aktualizacjami danych - czyli takie dane, ktre ju byy pobrane a w midzyczasie do bazy danych SIO-KReM wpyna aktualizacja danych wszystkimi danymi - czyli peen komplet danych z danego zakresu plik z brakami - czyli lista PESELi, dla ktrych nie ma danych Do bazy danych SIO-KREM zostaj przesane dane maturzystw, ktrzy w deklaracji przystpienia do matury wyrazili zgod na przekazywanie danych do KReM. W przypadku, gdy kandydat wycofa zgod na przekazywanie danych do SIO-KREM w aplikacji zostan usunite dane o wynikach ucznia oraz zostaje zaktualizowany plik z wycofanymi zgodami. Uczelnie mog przeglda list kandydatw i zakada filtry na wyszukiwanie danych oraz pobiera pliki z danymi dla wyszukanej grupy kandydatw. Aplikacja SIO-KREM prowadzi rwnie rejestr/histori wysanych i pobranych z SIO-KReM plikw. Dane w SIO-KREM s przechowywane w bazie danych bezterminowo. Z SIO-KREM mona rwnie pobra sownik arkuszy egzaminacyjnych, sownik szk oraz sownik olimpiad. Wykorzystane technologie i standardy przy tworzeniu serwera usug sieciowych System SIO-KReM udostpnia usugi sieciowe pod adresem https://krem1.sio.gov.pl/ws. Adres pliku WSDL specyfikujcego interfejs usug sieciowych to https://krem1.sio.gov.pl/ws?wsdl. Serwer usug sieciowych zosta napisany zgodnie ze standardami SOAP (Simple Object Access Protocol). Obsuguje wersje protokou SOAP 1.1 [SOAP] i SOAP 1.2 [SOAP1.2]. Do opisu interfejsu zosta wykorzystany standard WSDL (Web Services Description Language) [WSDL]. Caa komunikacja z serwerem usug sieciowych jest szyfrowana za pomoc TLS/SSL (jest jednostronna adres https://krem1.sio.gov.pl/ws podpisany jest zaufanym certyfikatem) [RFC2246] Uwierzytelnianie klienta jest przeprowadzane poprzez identyfikator i haso (ustawiane poprzez interfejs systemu SIO-KReM) zgodnie ze standardem WS-Security [UTP]. Do podpisywania komunikatw uyty zosta standard RSA-SHA512 [RFC8332] i OpenPGP [RFC2440] Dodanie klienta usugi sieciowej w aplikacji SIO-KReM Aby skonfigurowa poczenie systemu uczelni do usugi SIO-KReM naley zalogowa si do aplikacji SIO-KReM dostpnej pod adresem https://krem.sio.gov.pl   Uytkownik po zalogowaniu wybiera Ustawienia Systemowe w menu bocznym. Po klikniciu pojawi si okno do konfiguracji poczenia: Rysunek 1 Okno Konfiguracji poczenia Uytkownik w module Dane systemu wypenia dane wymagane do poczenia midzy usug SIO-KreM a systemem uczelni (wszystkie pola s wymagane) tj. : Imi; Nazwisko; Adres e-mail; Numer telefonu; Identyfikator/Login adres IP - adres serwera z ktrego bdzie wysyane zapytanie do usugi SIO-KReM. Haso; Powtrzenie hasa; Klucz publiczny systemu uczelni - wymagany format PEM (zawierajcy header 'BEGIN PGP PUBLIC KEY BLOCK' lub 'BEGIN PUBLIC KEY' w zalenoci od wybranego rodzaju klucza). Preferujemy klucz RSA od PGP. Rysunek 2 Dane systemu Po uzupenieniu wszystkich pl, uytkownik zatwierdza konfiguracj przyciskiem Zapisz. System poinformuje o pomylnej konfiguracji. W oknie po prawej stronie klucza publicznego systemu uczelni wywietli si wygenerowany klucz publiczny usugi SIO-KReM oraz daty wanoci obydwu kluczy. Widok konfiguracji klucza RSA: Rysunek 3 Konfiguracja poczenia z kluczem RSA W przypadku klucza PGP dodatkowo wywietl si pola zawierajce odciski palca obydwu kluczy. Widok konfiguracji klucza PGP: Rysunek 4 Konfiguracja poczenia z kluczem PGP Dostp do usugi SIO-KReM (https://krem1.sio.gov.pl/ws ) bdzie aktywny maksymalnie po 5 minutach. Jeeli uytkownik chce edytowa dane poczenia, wybiera Modyfikuj umieszczony w prawym grnym rogu. Rysunek 5 Modyfikacja poczenia Uwierzytelnianie: Uwierzytelnianie klientw usug sieciowych odbywa si podobnie, jak w przypadku stron internetowych, czyli poprzez identyfikator i haso. Informacje te umieszczane s wewntrz nagwka wiadomoci SOAP, czyli <Header>, w elemencie <Security>. Identyfikator i haso s opakowane w element <UsernameToken>, ktry posiada dwa podelementy: <Username> zawierajcy identyfikator klienta oraz <Password> zawierajcy haso. Dodatkowo element <Password> moe zawiera atrybut Type, ktry okrela typ przesyanego hasa. S dwie moliwoci: PasswordText haso przesyane jest zwykym tekstem, PasswordDigest haso przesyane jest w postaci skrtu (ang. digest). Jeli aden atrybut nie zosta podany, to domylnie obowizuje typ PasswordText. Usuga SIO-KReM akceptuje obie te moliwoci, cho zalecane jest przesyanie hasa w postaci skrtu (w przypadku usugi SIO-KReM musi on zosta wykonany funkcj MD5). Wszystkie elementy musz by w przestrzeni nazw WS-Security [UTP]. Oto przykad poprawnego nagwka zawierajcego identyfikator user i skrt hasa password wykonany funkcj MD5: <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss- wssecurity-secext-1.0.xsd"> <wsse:UsernameToken> <wsse:Username> user </wsse:Username> <wsse:Password Type="#PasswordDigest"> c62d929e7b7e7b6165923a5dfc60cb56 </wsse:Password> </wsse:UsernameToken>   Podpis elektroniczny: W kadej poprawnej wiadomoci SOAP przesyanej od klienta do serwera lub w odwrotn stron, musi si znale podpis elektroniczny caego elementu <Body>. Musi by on umieszczony, wewntrz nagwka <Security>, w specjalnym elemencie <Signature> (w przypadku uycia prostego klucza RSA) lub <PGPSignature> (w przypadku uycia klucza OpenPGP). Aby utworzy poprawny podpis elektroniczny zaakceptowany przez system SIO-KReM naley uy dwch standardw: Exclusive XML Canonicalization [xml-exc-c14n] oraz jeden ze standardw: RSA-SHA512 [RFC8332] lub OpenPGP [RFC2440]. Pierwszy suy do sprowadzenia dokumentu XML do postaci kanonicznej, natomiast drugi jest uywany do wygenerowania podpisu (odczonego, ang. detached) na postaci kanonicznej odpowiedniej struktury XML (w naszym przypadku elementu <Body>). Konieczno uycia algorytmu sprowadzania do postaci kanonicznej wynika z faktu, e dwa logicznie takie same dokumenty XML mog si troch rni tekstowo (np. inn kolejnoci atrybutw, niewypisywaniem atrybutw domylnych, nadmiarowymi spacjami, sposobem umieszczania informacji o przestrzeniach nazw, rnym traktowaniem znaku koca wiersza itp.) i wtedy mogoby doj do niezamierzonej, niepoprawnej weryfikacji podpisu. Dlatego by by pewnym, e do podpisu i weryfikacji bdziemy uywali tego samego dokumentu, konieczne jest przed wykonaniem tych operacji, przeksztacenie dokumentu XML do postaci kanonicznej. Algorytm ten jest elementem standardu XML Signature [XMLDSig] Algorytm podpisywania wiadomoci Poniej zosta przedstawiony dokadny algorytm podpisywania wiadomoci wymienianych z serwerem usug sieciowych systemu SIO-KReM: Identyfikacja elementu <Body> w dokumencie, Wykonanie algorytmu kanonizacji na elemencie <Body> wraz zawartoci, Stworzenie podpisu odczonego na wyniku kanonizacji (z uyciem RSA SHA512), Zakodowanie wartoci podpisu w postaci Base64 [RFC2045], Stworzenie wewntrz nagwka <Security> (zgodnego ze standardem WS-Security) pod-elementu <Signature> (lub <PGPSignature> w przypadku OpenPGP), ktry bdzie zawiera warto podpisu (w postaci Base64), Umieszczenie wewntrz elementu <Signature> (lub <PGPSignature> w przypadku OpenPGP) wartoci wczeniej wygenerowanego podpisu. Proces weryfikacji wyglda nastpujco: Identyfikacja nagwka <Security> wraz z podelementem <Signature> (lub <PGPSignature> w przypadku OpenPGP), Identyfikacja elementu <Body> w dokumencie, Wykonanie algorytmu kanonizacji na elemencie <Body> wraz zawartoci, Odkodowanie wartoci podpisu umieszczonego wewntrz elementu <Signature> z postaci Base64 do binarnej, Weryfikacja czy warto podpisu (w formacie binarnym) odpowiada podpisowi skanonizowanej postaci elementu <Body> stworzonego przez nadawc. Kade zapytanie wysyane do serwera usug sieciowych systemu SIO-KReM musi zosta podpisane kluczem prywatnym administratora (Uczelni), ktry jest zarejestrowany w systemie SIO-KREM. Kada odpowied odsyana przez usug SIO-KReM jest podpisywana kluczem prywatnym systemu (klucz publiczny usugi do weryfikacji wiadomoci udostpniony jest w systemie SIO-KREM w zakadce administracyjnej systemu uczelni). Podany kod jest przykadem poprawnie podpisanego pliku. Jest to zapytanie dla funkcji GetStudentResultSet podpisane omwionym algorytmem (odpowiednio sformatowane by bye bardziej czytelne). Zapytanie zawiera take nagwek autoryzacyjny, w ktrym identyfikatorem administratora jest user, a hasem password. <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Header> <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401- wss-wssecurity-secext-1.0.xsd"> <wsse:UsernameToken> <wsse:Username>user</wsse:Username> <wsse:Password>password</wsse:Password> </wsse:UsernameToken> <siokrem:Signature xmlns:siokrem="https://krem1.sio.gov.pl"> iEYEABE...hsv7y </siokrem:Signature> </wsse:Security> </S:Header> <S:Body> <GetStudentResultSet xmlns="https://krem1.sio.gov.pl "> <pesel>86091172941</pesel> </GetStudentResultSet> </S:Body> </S:Envelope> Interfejsy: GetStudentResultSet Pobranie wynikw wielu maturzystw. Parametry lista struktura zawierajcych numery PESEL maturzystw. Wynik oglny kod zakoczenia funkcji (kod sukcesu lub informacja o bdzie) i lista struktur (dokadnie tyle ile numerw PESEL byo w zapytaniu) zawierajca wynik wykonania funkcji (kod sukcesu lub bdu) i oceny maturzysty (w przypadku gdy ocen nie ma w bazie lub zapytanie dla tego maturzysty zakoczyo si innym bdem, zbir ocen jest pusty). Przykadowe zapytanie: <?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="https://krem1.sio.gov.pl"> <SOAP-ENV:Header> <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401- wss-wssecurity-secext-1.0.xsd"> <wsse:UsernameToken> <wsse:Username>user_uni</wsse:Username> <wsse:Password Type="#PasswordDigest"> 5f4dcc3b5aa765d61d8327deb882cf99 </wsse:Password> </wsse:UsernameToken> <ns1:Signature> iD8DBQBG...HVMhBkJ8xI= </ns1:Signature> </wsse:Security> </SOAP-ENV:Header> <SOAP-ENV:Body> <ns1:GetStudentResultSet> <ns1:pesel>11111111111</ns1:pesel> <ns1:pesel>88121212124</ns1:pesel> <ns1:pesel>88122408083</ns1:pesel> </ns1:GetStudentResultSet> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Przykadowa odpowied: <?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="https://krem.uw.edu.pl"> <SOAP-ENV:Header> <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401- wss-wssecurity-secext-1.0.xsd" SOAP-ENV:mustUnderstand="1"> <ns1:PGPSignature> iD8DBQBG...JxsOT8= </ns1:PGPSignature> </wsse:Security> </SOAP-ENV:Header> <SOAP-ENV:Body> <ns1:GetStudentResultSetResponse> <ns1:responseCode>0</ns1:responseCode> <ns1:response> <ns1:errorCode>12</ns1:errorCode> <ns1:studentResult> <ns1:pesel>11111111111</ns1:pesel> <ns1:results/> </ns1:studentResult> </ns1:response> <ns1:response> <ns1:errorCode>11</ns1:errorCode> <ns1:studentResult> <ns1:pesel>88121212124</ns1:pesel> <ns1:results/> </ns1:studentResult> </ns1:response> <ns1:response> <ns1:errorCode>0</ns1:errorCode> <ns1:studentResult> <ns1:pesel>88122408083</ns1:pesel> <ns1:results> <ns1:exam> <ns1:code>PO_u_N_p_082</ns1:code> <ns1:points>30</ns1:points> </ns1:exam> <ns1:exam> <ns1:code>PO_p_P_p_082</ns1:code> <ns1:points>40</ns1:points> </ns1:exam> <ns1:exam> <ns1:code>PO_p_R_p_082</ns1:code> <ns1:points>30</ns1:points> </ns1:exam> </ns1:results> </ns1:studentResult> </ns1:response> </ns1:GetStudentResultSetResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Kody bdu (errorCode): ('RESULT_OK',0) ('RESULT_ERROR_WRONG_PESEL_NO',12) ('RESULT_ERROR_NO_DATA',11) ('RESULT_ERROR_WRONG_MARK',25) ('RESULT_PESEL_WITHDRAWN',41) ('RESULT_UNKNOWN_PESEL',43) Dodatkowe uwagi do zapyta SOAP Ze wzgldw wydajnociowych, w usudze SIO-KReM bdzie ustalony limit okrelajcy ile danych rnych maturzystw moe znajdowa si w jednym zapytaniu (i odpowiedzi SOAP). Obecnie limit wynosi 1000, czyli np. zapytanie dodajce 800 wynikw maturzystw wykona s prawidowo, natomiast proba o pobranie 2000 maturzystw zakoczy si bdem. Gdy klient chce wykona operacje dla wikszej iloci danych, to musi wykona kilka razy t sam funkcj, w kadym wywoaniu podajc inne parametry. Przykadowa klasa JAVA do obsugi kluczy RSA SHA512: package pl.men.utils.common; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.StringWriter; import java.security.InvalidKeyException; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Signature; import java.security.SignatureException; import java.security.interfaces.RSAPrivateKey; import java.security.spec.EncodedKeySpec; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.Base64;   import org.bouncycastle.openssl.jcajce.JcaPEMWriter;   import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec;   public class Cryptography { private static final String PUBLIC_KEY_PATH = "sciezka_do_pliku.pub"; private static final String PRIVATE_KEY_PATH = "sciezka_do_pliku.key"; private static final String SIG_ALG = "SHA512withRSA"; private static final String KEY_ALG = "HmacSHA512";   public static byte[] generateSignature (String content) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, InvalidKeySpecException, IOException { Signature sign = Signature.getInstance(SIG_ALG); PrivateKey privateKey = readPrivateKeyFromFile(); sign.initSign(privateKey); byte[] bytes = content.getBytes(); sign.update(bytes);   return sign.sign(); } public static boolean verifySignature (String publicKey, String content, byte[] signature) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, InvalidKeySpecException, IOException { Signature sign = Signature.getInstance(SIG_ALG); sign.initVerify(readPublicKeyFromString(publicKey)); sign.update(content.getBytes()); return sign.verify(signature); }   public static void generateKeyPair() throws NoSuchAlgorithmException, IOException { KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); keyPairGen.initialize(2048); KeyPair pair = keyPairGen.generateKeyPair(); saveKeyPairToFiles(pair); }   private static PublicKey readPublicKeyFromString(String publicKey) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException { publicKey = publicKey.replace("-----BEGIN PUBLIC KEY-----", "").replace("-----END PUBLIC KEY-----", "").replaceAll(System.lineSeparator(), "").replaceAll(" ", "").replaceAll("\\s+",""); byte[] publicKeyBytes = Base64.getDecoder().decode(publicKey); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicKeyBytes); return keyFactory.generatePublic(publicKeySpec); } private static PublicKey readPublicKeyFromFile() throws IOException, NoSuchAlgorithmException, InvalidKeySpecException { File file = new File(PUBLIC_KEY_PATH); DataInputStream dis = new DataInputStream(new FileInputStream(file)); byte[] pubKeyBytes = new byte[(int) file.length()]; dis.read(pubKeyBytes); dis.close();   KeyFactory factory = KeyFactory.getInstance("RSA"); EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(pubKeyBytes); return factory.generatePublic(publicKeySpec); }   private static PrivateKey readPrivateKeyFromFile() throws IOException, NoSuchAlgorithmException, InvalidKeySpecException { File file = new File(PRIVATE_KEY_PATH); DataInputStream dis = new DataInputStream(new FileInputStream(file)); byte[] privKeyBytes = new byte[(int) file.length()]; dis.read(privKeyBytes); dis.close();   KeyFactory factory = KeyFactory.getInstance("RSA"); PKCS8EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(privKeyBytes); return (RSAPrivateKey) factory.generatePrivate(privKeySpec); } private static void saveKeyPairToFiles(KeyPair pair) throws IOException { FileOutputStream fos = new FileOutputStream(PUBLIC_KEY_PATH); fos.write(pair.getPublic().getEncoded()); fos.close();   FileOutputStream out = new FileOutputStream(PRIVATE_KEY_PATH); out.write(pair.getPrivate().getEncoded()); out.close(); } public static String mapPublicKeyToString(PublicKey key) { StringWriter sw = new StringWriter(); JcaPEMWriter writer = new JcaPEMWriter(sw); try { writer.writeObject(key); writer.close(); } catch (IOException e) { e.printStackTrace(); } return sw.getBuffer().toString(); }   public static String getStringHash(String message, String secret) throws InvalidKeyException, NoSuchAlgorithmException { Mac hmacSHA512 = Mac.getInstance(KEY_ALG); SecretKeySpec secretKey = new SecretKeySpec(secret.getBytes(), KEY_ALG); hmacSHA512.init(secretKey); return org.apache.commons.codec.binary.Base64.encodeBase64String(hmacSHA512.doFinal(message.getBytes())); } } Przykadowa klasa JAVA do obsugi kluczy OpenPGP: package pl.men.utils.common; import org.bouncycastle.bcpg.BCPGOutputStream; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.openpgp.*; import org.bouncycastle.util.encoders.Hex; import java.io.*; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.Security; import java.security.SignatureException; import java.util.Iterator; public class Cryptography { private static final String PGP_SECRET_KEY_RING_PATH = "keys/secring.gpg"; private static final String PGP_PROVIDER = "BC"; private static final int PGP_BUFFER_SIZE = 1024; public static PGPSecretKey readPGPSecretKey(InputStream privateKeyRingInputStream, String publicKeyFingerprint) throws IOException, PGPException { Security.addProvider(new BouncyCastleProvider()); PGPUtil.setDefaultProvider(PGP_PROVIDER); privateKeyRingInputStream = PGPUtil.getDecoderStream(privateKeyRingInputStream); PGPSecretKeyRingCollection secretRingCollection = new PGPSecretKeyRingCollection(privateKeyRingInputStream); PGPSecretKey secretKey = null; Iterator<PGPSecretKeyRing> secretKeyRingCollectionIterator = secretRingCollection.getKeyRings(); while (secretKey == null && secretKeyRingCollectionIterator.hasNext()) { PGPSecretKeyRing secretKeyRing = secretKeyRingCollectionIterator.next(); Iterator<PGPSecretKey> secretKeyRingIterator = secretKeyRing.getSecretKeys(); while (secretKey == null && secretKeyRingIterator.hasNext()) { PGPSecretKey currentSecretKey = secretKeyRingIterator.next(); PGPPublicKey currentPublicKey = currentSecretKey.getPublicKey(); String keyFingerprint = new String(Hex.encode(currentPublicKey.getFingerprint())); if (currentSecretKey.isSigningKey() && keyFingerprint.equalsIgnoreCase(publicKeyFingerprint)) { secretKey = currentSecretKey; } } } if (secretKey == null) { throw new IllegalArgumentException("Can't find signing key with fingerprint: (" + publicKeyFingerprint + ") in key ring."); } return secretKey; } public static PGPPublicKey readPGPPublicKey(InputStream publicKeyRingInputStream, String publicKeyFingerprint) throws IOException, PGPException { Security.addProvider(new BouncyCastleProvider()); PGPUtil.setDefaultProvider(PGP_PROVIDER); PGPPublicKey publicKey = null; PGPPublicKeyRingCollection publicKeyRingCollection = new PGPPublicKeyRingCollection(PGPUtil.getDecoderStream(publicKeyRingInputStream)); Iterator<PGPPublicKeyRing> publicKeyRingIterator = publicKeyRingCollection.getKeyRings(); while (publicKey == null && publicKeyRingIterator.hasNext()) { PGPPublicKeyRing publicKeyRing = publicKeyRingIterator.next(); Iterator<PGPPublicKey> publicKeyIterator = publicKeyRing.getPublicKeys(); while (publicKey == null && publicKeyIterator.hasNext()) { PGPPublicKey currentPublicKey = publicKeyIterator.next(); String keyFingerprint = new String(Hex.encode(currentPublicKey.getFingerprint())); if (keyFingerprint.equalsIgnoreCase(publicKeyFingerprint)) { publicKey = currentPublicKey; } } } if (publicKey == null) { throw new IllegalArgumentException("Can't find signing key with fingerprint: (" + publicKeyFingerprint + ") in public key ring."); } return publicKey; } public static PGPPublicKey readPGPPublicKey(String armoredKeyString, String publicKeyFingerprint) throws IOException, PGPException { Security.addProvider(new BouncyCastleProvider()); PGPUtil.setDefaultProvider(PGP_PROVIDER); PGPPublicKey publicKey = null; PGPPublicKeyRingCollection publicKeyRingCollection; try (InputStream publicKeyRingInputStream = new ByteArrayInputStream(armoredKeyString.getBytes())) { publicKeyRingCollection = new PGPPublicKeyRingCollection(PGPUtil.getDecoderStream(publicKeyRingInputStream)); } Iterator<PGPPublicKeyRing> publicKeyRingIterator = publicKeyRingCollection.getKeyRings(); while (publicKey == null && publicKeyRingIterator.hasNext()) { PGPPublicKeyRing publicKeyRing = publicKeyRingIterator.next(); Iterator<PGPPublicKey> publicKeyIterator = publicKeyRing.getPublicKeys(); while (publicKey == null && publicKeyIterator.hasNext()) { PGPPublicKey currentPublicKey = publicKeyIterator.next(); String keyFingerprint = new String(Hex.encode(currentPublicKey.getFingerprint())); if (keyFingerprint.equalsIgnoreCase(publicKeyFingerprint)) { publicKey = currentPublicKey; } } } return publicKey; } public static byte[] generatePGPSignature(String content, String publicKeyFingerprint, String secretKeyPassword) throws IOException, NoSuchAlgorithmException, NoSuchProviderException, PGPException, SignatureException { String propPath = System.getenv("environment.MulePropPath"); FileInputStream secretKeyRingInputStream= new FileInputStream(propPath + PGP_SECRET_KEY_RING_PATH); ByteArrayInputStream dataInputStream = new ByteArrayInputStream(content.getBytes()); ByteArrayOutputStream signatureOutputStream = new ByteArrayOutputStream(); PGPSecretKey mySecretKey = readPGPSecretKey(secretKeyRingInputStream, publicKeyFingerprint); PGPPrivateKey myPrivateKey = mySecretKey.extractPrivateKey(secretKeyPassword.toCharArray(), PGP_PROVIDER); PGPSignatureGenerator signatureGenerator = new PGPSignatureGenerator(mySecretKey.getPublicKey().getAlgorithm(), PGPUtil.SHA1, PGP_PROVIDER); signatureGenerator.initSign(PGPSignature.BINARY_DOCUMENT, myPrivateKey); BCPGOutputStream bcpgOutputStream = new BCPGOutputStream(signatureOutputStream); int bufferSize = PGP_BUFFER_SIZE; byte[] bytes = new byte[bufferSize]; int length; while ((length = dataInputStream.read(bytes,0,bufferSize)) > 0) { signatureGenerator.update(bytes,0,length); } signatureGenerator.generate().encode(bcpgOutputStream); signatureOutputStream.close(); return signatureOutputStream.toByteArray(); } public static boolean verifyPGPSignature(String publicKeyString, String publicKeyFingerprint, String content, byte[] signatureByteArray) throws Exception { ByteArrayInputStream dataInputStream = new ByteArrayInputStream(content.getBytes()); ByteArrayInputStream signatureInputStream = new ByteArrayInputStream(signatureByteArray); PGPObjectFactory factory = new PGPObjectFactory(PGPUtil.getDecoderStream(signatureInputStream)); PGPSignatureList signatureList; Object object = factory.nextObject(); if (object instanceof PGPCompressedData) { PGPCompressedData compressedData = (PGPCompressedData) object; factory = new PGPObjectFactory(compressedData.getDataStream()); signatureList = (PGPSignatureList) factory.nextObject(); } else { signatureList = (PGPSignatureList) object; PGPSignature signature = signatureList.get(0); PGPPublicKey publicKey = readPGPPublicKey(publicKeyString, publicKeyFingerprint); signature.initVerify(publicKey, PGP_PROVIDER); int bufferSize = PGP_BUFFER_SIZE; byte[] bytes = new byte[bufferSize]; int length; while ((length = dataInputStream.read(bytes,0,bufferSize)) > 0) { signature.update(bytes,0,length); } return signature.verify(); } }

Obsuga menu aplikacji SIO-KReM

Data ostatniej aktualizacji: 26.04.2023 Gwne menu znajduje si po lewej stronie ekranu i zawiera moduy odpowiednie dla danego typu jednostki: UCZELNIA: Start wywietlana strona gwna systemu SIO-KReM z podziaem na poszczeglne kafle. Mj Podmiot wywietlenie danych szczegowych uczeni, do ktrej jest zalogowany uytkownik. Kandydaci wywietlanie listy kandydatw z moliwoci wyszukiwania i filtrowania danych oraz pogld szczegw kandydata. Pliki lista pobranych i wysanych plikw oraz lista s