X.509 autentifikácia na jar
1. Prehľad
V tomto článku sa zameriame na hlavné prípady použitia overovania pomocou certifikátu X.509 - overenie identity komunikačného partnera pri použití protokolu HTTPS (HTTP over SSL).
Jednoducho povedané - počas vytvorenia zabezpečeného pripojenia klient overí server podľa jeho certifikátu (vydaného dôveryhodnou certifikačnou autoritou).
Ale okrem toho sa dá na X.509 vo Spring Security zvyknúť overiť totožnosť klienta serverom pri pripájaní. Toto sa volá „Vzájomné overovanie“, a pozrieme sa aj na to, ako sa to tu robí.
Nakoniec sa dotkneme keď má zmysel použiť tento druh autentifikácie.
Na demonštráciu overenia servera vytvoríme jednoduchú webovú aplikáciu a do prehliadača nainštalujeme vlastnú certifikačnú autoritu.
Navyše pre vzájomné overovanie, vytvoríme certifikát klienta a upravíme náš server tak, aby umožňoval iba overeným klientom.
Dôrazne sa odporúča postupovať podľa pokynov krok za krokom a vytvoriť certifikáty, ako aj obchod s kľúčmi a úložisko dôvery, sami, podľa pokynov uvedených v nasledujúcich častiach. Všetky súbory pripravené na použitie však nájdete v našom úložisku GitHub.
2. Samo podpísaný koreňový CA
Aby sme mohli podpísať naše certifikáty na strane servera a na strane klienta, musíme si najskôr vytvoriť náš vlastný koreňový certifikát CA s vlastným podpisom. Tadiaľto budeme konať ako naša vlastná certifikačná autorita.
Na tento účel použijeme knižnicu openssl, takže ju musíme mať nainštalovanú pred vykonaním nasledujúceho kroku.
Vytvorme teraz certifikát CA:
openssl req -x509 -sha256 -dni 3650 -newkey rsa: 4096 -keyout rootCA.key -out rootCA.crt
Keď vykonáme vyššie uvedený príkaz, musíme zadať heslo pre náš súkromný kľúč. Na účely tohto tutoriálu používame Zmeň to ako prístupová fráza.
Navyše, musíme zadať informácie, ktoré tvoria takzvaný rozlišujúci názov. Tu poskytujeme iba CN (bežný názov) - Baeldung.com - a ostatné časti nechávame prázdne.
3. Obchod s kľúčmi
Nepovinná požiadavka: Aby sme mohli používať kryptograficky silné kľúče spolu s funkciami šifrovania a dešifrovania, budeme potrebovať „Java Cryptography Extension (JCE) Súbory s politikou neobmedzenej sily”Nainštalované v našom JVM.
Môžu byť stiahnuté napríklad z Oracle (postupujte podľa inštalačných pokynov obsiahnutých v sťahovaní). Niektoré distribúcie systému Linux tiež poskytujú inštalovateľný balík prostredníctvom svojich správcov balíkov.
Úložisko kľúčov je úložisko, ktoré naša aplikácia Spring Boot použije na uchovanie súkromného kľúča a certifikátu nášho servera. Inými slovami, naša aplikácia použije úložisko kľúčov na doručenie certifikátu klientom počas overenia totožnosti SSL.
V tomto výučbe používame Formát Java Key-Store (JKS) a nástroj príkazového riadku keytool.
3.1. Certifikát na strane servera
Aby sme implementovali autentifikáciu X.509 na strane servera v našej aplikácii Spring Boot, sme najskôr je potrebné vytvoriť certifikát na strane servera. Začnime vytvorením takzvanej žiadosti o podpis certifikátu (CSR): Podobne ako v prípade certifikátu CA musíme poskytnúť heslo pre súkromný kľúč. Dodatočne použijeme localhost ako bežný názov (KN). Predtým, ako budeme pokračovať, musíme vytvoriť konfiguračný súbor - localhost.ext. Uloží niektoré ďalšie parametre potrebné počas podpisovania certifikátu. Tu je tiež k dispozícii súbor pripravený na použitie. Teraz je čas podpíšte žiadosť našim rootCA.crt certifikát a jeho súkromný kľúč: Upozorňujeme, že musíme poskytnúť rovnaké heslo, aké sme použili pri vytváraní nášho certifikátu CA. V tomto štádiu, konečne sme pripravení na použitie localhost.crt certifikát podpísaný našou vlastnou certifikačnou autoritou. Ak chcete vytlačiť podrobnosti nášho certifikátu v podobe čitateľnej pre človeka, môžeme použiť nasledujúci príkaz: V tejto časti uvidíme, ako na to importujte podpísaný certifikát a zodpovedajúci súkromný kľúč do keystore.jks spis. Použijeme archív PKCS 12 na zabalenie súkromného kľúča nášho servera spolu s podpísaným certifikátom. Potom ho importujeme do novo vytvoreného keystore.jks. Pomocou nasledujúceho príkazu môžeme vytvoriť a .p12 spis: Takže teraz máme localhost.key a localhost.crt zviazané v singli localhost.p12 spis. Poďme teraz použiť keytool na Vytvor keystore.jks úložisko a importovať localhost.p12 súbor jediným príkazom: V tejto fáze máme všetko pripravené pre časť autentifikácie servera. Pokračujme v konfigurácii aplikácie Spring Boot. Náš projekt zabezpečeného servera SSL pozostáva z @SpringBootApplication komentovaná trieda aplikácie (čo je druh @Configuration), an application.properties konfiguračný súbor a veľmi jednoduché klientske rozhranie v štýle MVC. Aplikácia musí iba predložiť stránku HTML s a „Dobrý deň, {User}!“ správa. Týmto spôsobom môžeme skontrolovať certifikát servera v prehliadači a uistiť sa, že je pripojenie overené a zabezpečené. Najskôr vytvoríme nový projekt Maven s tromi zahrnutými tromi zväzkami Spring Boot Starter: Pre referenciu: zväzky nájdeme na serveri Maven Central (zabezpečenie, web, štít). Ako ďalší krok vytvoríme hlavnú triedu aplikácií a používateľský radič: Teraz povieme aplikácii, kde nájde našu keystore.jks a ako sa k nim dostať. Nastavíme SSL na „povolený“ stav a zmeníme štandardný port na počúvanie označte zabezpečené pripojenie. Dodatočne niektoré nakonfigurujeme podrobnosti používateľa pre prístup k nášmu serveru prostredníctvom základného overenia: Toto bude šablóna HTML umiestnená na zdroje / šablóny priečinok: Než dokončíme túto časť a pozrieme sa na stránku, potrebujeme nainštalovať našu vygenerovanú koreňovú certifikačnú autoritu ako dôveryhodný certifikát do prehliadača. Príkladná inštalácia našej certifikačnej autority pre Mozilla Firefox by vyzeralo takto: Poznámka: Ak nechcete pridať našu certifikačná autorita do zoznamu dôveryhodné orgány, budete mať neskôr možnosť vytvoriť výnimkou a ukážte webovú stránku tvrdú, aj keď je označená ako neistá. Potom sa však v paneli s adresou zobrazí symbol „žltého výkričníka“, ktorý označuje nezabezpečené pripojenie! Potom prejdeme k spring-security-x509-basic-auth modul a spustiť: Nakoniec sme udreli // localhost: 8443 / používateľ, zadajte naše používateľské poverenia z application.properties a mali by vidieť „Ahoj, správca!“ správa. Teraz môžeme skontrolovať stav pripojenia kliknutím na symbol „zeleného zámku“ v paneli s adresou a malo by ísť o zabezpečené pripojenie. V predchádzajúcej časti sme si predstavili, ako implementovať najbežnejšiu schému autentifikácie SSL - autentifikáciu na strane servera. To znamená, že klientom sa overil iba server. V tejto časti, popíšeme, ako pridať ďalšiu časť autentifikácie - autentifikáciu na strane klienta. Týmto spôsobom majú prístup na zabezpečenú webovú stránku iba klienti s platnými certifikátmi podpísanými orgánom, ktorému náš server dôveruje. Než však pokračujeme, pozrime sa, aké sú výhody a nevýhody používania vzájomnej autentifikácie SSL. Klady: Zápory: Trustsore je určitým spôsobom opakom skladu kľúčov. Je držiteľom certifikátov externých subjektov, ktorým dôverujeme. V našom prípade stačí ponechať koreňový certifikát CA v úložisku dôvery. Pozrime sa, ako vytvoriť a truststore.jks súbor a importovať rootCA.crt pomocou keytool: Upozorňujeme, že je potrebné poskytnúť heslo pre novovytvorené trusstore.jks. Tu sme opäť použili Zmeň to prístupová fráza. A je to, importovali sme vlastný certifikát CA a úložisko dôvery je pripravené na použitie. Aby sme mohli pokračovať, upravujeme naše X509AuthenticationServer predĺžiť z WebSecurityConfigurerAdapter a prepísať jednu z poskytnutých metód konfigurácie. Tu nakonfigurujeme mechanizmus x.509 na analýzu súboru Bežný názov (KN) pole certifikátu na extrahovanie používateľských mien. S týmto extrahovaným menom používateľa vyhľadáva Spring Security zadané údaje UserDetailsService pre zodpovedajúcich používateľov. Takže implementujeme aj toto servisné rozhranie, ktoré obsahuje jedného demo používateľa. Tip: V produkčnom prostredí to UserDetailsService môže načítať svojich používateľov napríklad zo zdroja údajov JDBC. Musíte si všimnúť, že našu triedu anotujeme @EnableWebSecurity a @EnableGlobalMethodSecurity s povolenou predbežnou / následnou autorizáciou. Pomocou toho druhého môžeme anotovať naše zdroje @PreAuthorize a @PostAuthorize pre jemnozrnnú kontrolu prístupu: Ako už bolo povedané, teraz môžeme používať Kontrola prístupu založená na výrazoch v našom kontrolóri. Konkrétnejšie sú naše autorizačné anotácie rešpektované z dôvodu @EnableGlobalMethodSecurity anotácia v našom @ Konfigurácia: Prehľad všetkých možných možností autorizácie nájdete v úradná dokumentácia. Ako posledný krok úpravy musíme aplikácii povedať, kde je naša truststore sa nachádza a to SSL autentifikácia klienta je nevyhnutné (server.ssl.client-auth = potreba). Takže do toho sme vložili nasledujúce application.properties: Teraz, ak spustíme aplikáciu a ukážeme náš prehliadač // localhost: 8443 / používateľ, dostali sme informáciu, že partnerský server nie je možné overiť, a ten popiera otvorenie našej webovej stránky. Teraz je čas vytvoriť certifikát na strane klienta. Kroky, ktoré musíme podniknúť, sú v podstate rovnaké ako v prípade certifikátu na strane servera, ktorý sme už vytvorili. Najskôr musíme vytvoriť žiadosť o podpis certifikátu: Budeme musieť poskytnúť informácie, ktoré budú zakomponované do certifikátu. Pre toto cvičenie zadajme iba bežný názov (CN) - Bob. Je to dôležité, pretože tento záznam používame počas autorizácie a naša vzorová aplikácia rozpoznáva iba Boba. Ďalej musíme žiadosť podpísať pomocou našej CA: Posledným krokom, ktorý musíme urobiť, je zabaliť podpísaný certifikát a súkromný kľúč do súboru PKCS: Nakoniec sme pripravení nainštalovať certifikát klienta do prehliadača. Opäť použijeme Firefox: Keď teraz obnovíme našu webovú stránku, zobrazí sa výzva na výber certifikátu klienta, ktorý by sme chceli použiť: Ak uvidíme uvítaciu správu ako "Ahoj Bob!", to znamená, že všetko funguje podľa očakávaní! Pridanie autentifikácie klienta X.509 do http bezpečnostná konfigurácia v systéme Windows XML je tiež možné: Ak chcete nakonfigurovať podkladový Tomcat, musíme dať náš sklad kľúčov a náš truststore do jeho konf priečinok a upravte priečinok server.xml: Tip: S clientAuth nastavený na „Chcieť“, SSL je stále povolená, aj keď klient neposkytne platný certifikát. Ale v tomto prípade musíme na prístup k zabezpečeným prostriedkom použiť druhý autentifikačný mechanizmus, napríklad prihlasovací formulár. Súhrnne sme sa dozvedeli ako vytvoriť certifikát CA s vlastným podpisom a ako sa ním podpisujú ďalšie certifikáty. Ďalej sme vytvorili certifikáty na strane servera aj na strane klienta. Potom sme predstavili, ako ich podľa toho importovať do skladu kľúčov a do úložiska dôvery. Ďalej by ste mali byť schopní zabaliť certifikát spolu s jeho súkromným kľúčom do formátu PKCS12. Diskutovali sme tiež o tom, kedy má zmysel používať autentifikáciu klienta Spring Security X.509, takže je len na vás, či sa rozhodnete implementovať ju do svojej webovej aplikácie. A nakoniec, nájdite zdrojový kód tohto článku na Githube.openssl req -new -newkey rsa: 4096 -keyout localhost.key –out localhost.csr
AuthorityKeyIdentifier = keyid, emitent basicConstraints = CA: FALSE subjectAltName = @alt_names [alt_names] DNS.1 = localhost
openssl x509 -req -CA rootCA.crt -CAkey rootCA.key -in localhost.csr -out localhost.crt -dni 365 -CAcreateserial -extfile localhost.ext
openssl x509 -v localhost.crt -text
3.2. Import do obchodu s kľúčmi
openssl pkcs12 -export -out localhost.p12 -name "localhost" -inkey localhost.key -in localhost.crt
keytool -importkeystore -srckeystore localhost.p12 -srcstoretype PKCS12 -destkeystore keystore.jks -deststoretype JKS
4. Ukážka aplikácie
4.1. Maven závislosti
org.springframework.boot spring-boot-starter-security org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-thymeleaf
4.2. Aplikácia Spring Boot
@SpringBootApplication verejná trieda X509AuthenticationServer {public static void main (String [] args) {SpringApplication.run (X509AuthenticationServer.class, args); }} @Controller public class UserController {@RequestMapping (value = "/ user") public String user (Model model, Principal principal) {UserDetails currentUser = (UserDetails) ((Authentication) principal) .getPrincipal (); model.addAttribute ("používateľské meno", currentUser.getUsername ()); vrátiť "užívateľ"; }}
server.ssl.key-store = .. / store / keystore.jks server.ssl.key-store-password = $ {HESLO} server.ssl.key-alias = localhost server.ssl.key-heslo = $ {HESLO } server.ssl.enabled = skutočný server.port = 8443 spring.security.user.name = Správca spring.security.user.password = admin
Ukážka overenia X.509
Ahoj !
4.3. Inštalácia koreňovej CA.
mvn spring-boot: spustiť
5. Vzájomné overovanie
5.1. Truststore
keytool -import -trustcacerts -noprompt -alias ca -ext san = dns: localhost, ip: 127.0.0.1 -file rootCA.crt -keystore truststore.jks
5.2. Jarná konfigurácia zabezpečenia
@SpringBootApplication @EnableWebSecurity @EnableGlobalMethodSecurity (prePostEnabled = true) verejná trieda X509AuthenticationServer rozširuje WebSecurityConfigurerAdapter {... @Override protected void configure (HttpSecurity http) users {return new UserDetailsService () {@Override public UserDetails loadUserByUsername (String username) {if (username.equals ("Bob")) {return new User (username, "", AuthorityUtils .commaSeparatedStringToAuthorityList ("ROLE_USER"))}} new UsernameNotFoundException ("User not found!");}};}}
@Controller verejná trieda UserController {@PreAuthorize ("hasAuthority ('ROLE_USER')") @RequestMapping (value = "/ user") verejný používateľ reťazca (model, hlavný zodpovedný) {...}}
server.ssl.trust-store = store / truststore.jks server.ssl.trust-store-password = $ {HESLO} server.ssl.client-auth = potreba
5.3. Certifikát na strane klienta
openssl req -new -newkey rsa: 4096 -nodes -keyout clientBob.key –out clientBob.csr
openssl x509 -req -CA rootCA.crt -CAkey rootCA.key -v clientBob.csr -out clientBob.crt -dni 365 -CAcreateserial
openssl pkcs12 -export -out clientBob.p12 -name "clientBob" -inkey clientBob.key -in clientBob.crt
6. Vzájomné overovanie pomocou XML
... ...
7. Záver