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):

openssl req -new -newkey rsa: 4096 -keyout localhost.key –out localhost.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.

AuthorityKeyIdentifier = keyid, emitent basicConstraints = CA: FALSE subjectAltName = @alt_names [alt_names] DNS.1 = localhost

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ľúč:

openssl x509 -req -CA rootCA.crt -CAkey rootCA.key -in localhost.csr -out localhost.crt -dni 365 -CAcreateserial -extfile localhost.ext

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:

openssl x509 -v localhost.crt -text

3.2. Import do obchodu s kľúčmi

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:

openssl pkcs12 -export -out localhost.p12 -name "localhost" -inkey localhost.key -in localhost.crt

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:

keytool -importkeystore -srckeystore localhost.p12 -srcstoretype PKCS12 -destkeystore keystore.jks -deststoretype JKS

V tejto fáze máme všetko pripravené pre časť autentifikácie servera. Pokračujme v konfigurácii aplikácie Spring Boot.

4. Ukážka aplikácie

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

4.1. Maven závislosti

Najskôr vytvoríme nový projekt Maven s tromi zahrnutými tromi zväzkami Spring Boot Starter:

 org.springframework.boot spring-boot-starter-security org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-thymeleaf 

Pre referenciu: zväzky nájdeme na serveri Maven Central (zabezpečenie, web, štít).

4.2. Aplikácia Spring Boot

Ako ďalší krok vytvoríme hlavnú triedu aplikácií a používateľský radič:

@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ľ"; }}

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:

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

Toto bude šablóna HTML umiestnená na zdroje / šablóny priečinok:

   Ukážka overenia X.509 

Ahoj !

4.3. Inštalácia koreňovej CA.

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:

  1. Typ o: preferenciách v paneli s adresou
  2. Otvorené Pokročilé -> Certifikáty -> Zobraziť certifikáty -> Autority
  3. Kliknite na Import
  4. Nájdite Baeldung návody priečinok a jeho podpriečinok pružina-zabezpečenie-x509 / sklad kľúčov
  5. Vyberte ikonu rootCA.crt súbor a kliknite na Ok
  6. Zvoľte „Dôverujte tejto CA pri identifikácii webových stránok “ a kliknite Ok

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ť:

mvn spring-boot: 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.

5. Vzájomné overovanie

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:

  • Súkromný kľúč X.509 certifikát klienta je silnejší ako akékoľvek používateľom definované heslo. Musí sa to však tajiť!
  • S certifikátom totožnosť klienta je dobre známa a dá sa ľahko overiť.
  • Už žiadne zabudnuté heslá!

Zápory:

  • Musíme vytvoriť certifikát pre každého nového klienta.
  • Certifikát klienta musí byť nainštalovaný v klientskej aplikácii. V skutočnosti: Autentifikácia klienta X.509 závisí od zariadenia, čo znemožňuje použitie tohto druhu autentifikácie na verejných priestranstvách, napríklad v internetovej kaviarni.
  • Musí existovať mechanizmus na odvolanie napadnutých certifikátov klientov.
  • Musíme udržiavať certifikáty klientov. To môže byť ľahko nákladné.

5.1. Truststore

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:

keytool -import -trustcacerts -noprompt -alias ca -ext san = dns: localhost, ip: 127.0.0.1 -file rootCA.crt -keystore truststore.jks

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.

5.2. Jarná konfigurácia zabezpečenia

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:

@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!");}};}}

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:

@Controller verejná trieda UserController {@PreAuthorize ("hasAuthority ('ROLE_USER')") @RequestMapping (value = "/ user") verejný používateľ reťazca (model, hlavný zodpovedný) {...}}

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:

server.ssl.trust-store = store / truststore.jks server.ssl.trust-store-password = $ {HESLO} server.ssl.client-auth = potreba

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.

5.3. Certifikát na strane klienta

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:

openssl req -new -newkey rsa: 4096 -nodes -keyout clientBob.key –out clientBob.csr

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:

openssl x509 -req -CA rootCA.crt -CAkey rootCA.key -v clientBob.csr -out clientBob.crt -dni 365 -CAcreateserial

Posledným krokom, ktorý musíme urobiť, je zabaliť podpísaný certifikát a súkromný kľúč do súboru PKCS:

openssl pkcs12 -export -out clientBob.p12 -name "clientBob" -inkey clientBob.key -in clientBob.crt

Nakoniec sme pripravení nainštalovať certifikát klienta do prehliadača.

Opäť použijeme Firefox:

  1. Typ o: preferenciách v paneli s adresou
  2. Otvorené Pokročilé -> Zobraziť certifikáty -> Vaše certifikáty
  3. Kliknite na Import
  4. Nájdite Baeldung návody priečinok a jeho podpriečinok spring-security-x509 / sklad
  5. Vyberte ikonu clientBob.p12 súbor a kliknite na Ok
  6. Zadajte heslo pre svoj certifikát a kliknite na tlačidlo Ok

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

6. Vzájomné overovanie pomocou XML

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.

7. Záver

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.


$config[zx-auto] not found$config[zx-overlay] not found