X.509 Hitelesítés a tavaszi biztonságban
1. Áttekintés
Ebben a cikkben az X.509 tanúsítvány hitelesítésének főbb eseteire fogunk összpontosítani - a kommunikációs társ identitásának ellenőrzése amikor a HTTPS (HTTP over SSL) protokollt használja.
Egyszerűen fogalmazva - amíg létrejön egy biztonságos kapcsolat, az ügyfél igazolja a szervert a tanúsítványának megfelelően (amelyet egy megbízható tanúsító hatóság ad ki).
De ezen túl az X.509 a Spring Security-ben is használható ellenőrizze az ügyfél személyazonosságát a szerver csatlakozás közben. Ezt úgy hívják „Kölcsönös hitelesítés”, és megnézzük itt is, hogy ez hogyan történik.
Végül érintjük amikor van értelme használni ezt a fajta hitelesítést.
A szerverellenőrzés bemutatásához létrehozunk egy egyszerű webalkalmazást, és egy egyéni tanúsító hatóságot telepítünk egy böngészőbe.
Sőt, azért kölcsönös hitelesítés, létrehozunk egy ügyféltanúsítványt és módosítjuk a szerverünket, hogy csak ellenőrzött ügyfeleket engedélyezzünk.
Nagyon ajánlott, hogy kövesse az oktatóanyagot lépésről lépésre, és saját maga hozza létre a tanúsítványokat, valamint a kulcstárat és a truststore-ot a következő szakaszokban bemutatott utasításoknak megfelelően. Azonban az összes használatra kész fájl megtalálható a GitHub adattárunkban.
2. Saját aláírású gyökér CA
A kiszolgálói és kliens oldali tanúsítványaink aláírásához először létre kell hoznunk saját, saját aláírású gyökér CA tanúsítványt. Ily módon a saját tanúsító hatóságunkként fogunk eljárni.
Erre a célra az openssl könyvtárat fogjuk használni, ezért a következő lépés végrehajtása előtt telepítenünk kell.
Most hozzuk létre a CA tanúsítványt:
openssl req -x509 -sha256 -days 3650 -newkey rsa: 4096 -keyout rootCA.key -out rootCA.crt
A fenti parancs végrehajtásakor meg kell adnunk a privát kulcsunk jelszavát. A bemutató céljára a következőket használjuk: változtasd meg jelszóként.
Ezenkívül olyan információkat kell megadnunk, amelyek úgynevezett megkülönböztető nevet alkotnak. Itt csak a CN-t (közönséges név) - Baeldung.com - adjuk meg, a többi részt pedig üresen hagyjuk.
3. Kulcstár
Opcionális követelmény: A kriptográfiailag erős kulcsok, valamint a titkosítási és visszafejtési funkciók használatához szükségünk lesz a “Java kriptográfiai kiterjesztés (JCE) korlátlan erősségű joghatósági házirend-fájlok”Telepítve a JVM-be.
Ezek például letölthetők az Oracle-ről (kövesse a letöltéshez mellékelt telepítési utasításokat). Néhány Linux disztribúció telepíthető csomagot is biztosít a csomagkezelőkön keresztül.
A kulcstár olyan adattár, amelyet a Spring Boot alkalmazásunk a szerverünk magánkulcsának és tanúsítványának tárolására fog használni. Más szavakkal, alkalmazásunk a kulcstárolóval fogja kiszolgálni a tanúsítványt az ügyfelek számára az SSL kézfogás során.
Ebben az oktatóanyagban a Java Key-Store (JKS) formátum és egy kulcseszköz parancssori eszköz.
3.1. Kiszolgálóoldali tanúsítvány
A szerveroldali X.509 hitelesítésnek a Spring Boot alkalmazásban történő megvalósításához először létre kell hozni egy szerveroldali tanúsítványt. Kezdjük egy úgynevezett tanúsítvány-aláírási kérelem (CSR) létrehozásával: Hasonlóképpen, mint a CA tanúsítvány esetében, meg kell adnunk a privát kulcs jelszavát. Ezenkívül használjuk helyi kiszolgáló mint közönséges név (CN). Mielőtt továbblépnénk, létre kell hoznunk egy konfigurációs fájlt - localhost.ext. A tanúsítvány aláírásakor tárol néhány további paramétert. Használatra kész fájl itt is elérhető. Itt az ideje írja alá a kérést a mi rootCA.crt tanúsítvány és annak magánkulcsa: Ne feledje, hogy ugyanazt a jelszót kell megadnunk, amelyet a CA tanúsítvány létrehozásakor használtunk. Ezen a ponton, végre készen állunk a használatra localhost.crt a saját tanúsító hatóságunk által aláírt tanúsítvány. A tanúsítvány adatainak ember által olvasható formában történő kinyomtatásához a következő parancsot használhatjuk: Ebben a szakaszban megtudjuk, hogyan kell importálja az aláírt tanúsítványt és a hozzá tartozó magánkulcsot a kulcstár.jks fájl. A PKCS 12 archívum segítségével csomagoljuk szerverünk magánkulcsát az aláírt tanúsítvánnyal együtt. Ezután importáljuk az újonnan létrehozottba kulcstár.jks. A következő paranccsal létrehozhatjuk a .p12 fájl: Tehát most megvan a localhost.key és a localhost.crt a kislemezbe csomagolva localhost.p12 fájl. Most használjuk a kulcseszközt hozzon létre egy kulcstár.jks adattárat és importálja a localhost.p12 fájl egyetlen paranccsal: Ebben a szakaszban minden a helyén van a szerver hitelesítési részhez. Folytassuk a Spring Boot alkalmazás konfigurációjával. Az SSL biztonságos szerver projektünk a @SpringBootApplication kommentált alkalmazásosztály (ami egyfajta @ Konfiguráció), an alkalmazás.tulajdonságok konfigurációs fájl és egy nagyon egyszerű MVC stílusú kezelőfelület. Az alkalmazásnak csak annyit kell tennie, hogy bemutat egy HTML oldalt a-val "Helló {User}!" üzenet. Így ellenőrizhetjük a szerver tanúsítványt egy böngészőben, hogy megbizonyosodhassunk arról, hogy a kapcsolat igazolt és biztonságos. Először egy új Maven projektet hozunk létre, amely három Spring Boot Starter csomagot tartalmaz: Referenciaként: a kötegeket megtalálhatjuk a Maven Central-on (biztonsági, webes, thymeleaf). Következő lépésként létrehozzuk a fő alkalmazásosztályt és a felhasználói vezérlőt: Most elmondjuk az alkalmazásnak, hogy hol találjuk meg a sajátunkat kulcstár.jks és hogyan lehet elérni. Az SSL-t „engedélyezett” állapotra állítjuk, és a szokásos hallgatási portot megváltoztatjuk jelezzen biztonságos kapcsolatot. Ezenkívül konfigurálunk néhányat felhasználói adatok szerverünkhöz az alap hitelesítéssel történő eléréshez: Ez lesz a HTML sablon, amely a források / sablonok mappa: Mielőtt befejeznénk ezt a részt és megnéznénk a webhelyet, telepítenünk kell a létrehozott gyökértanúsítvány-jogosultságot megbízható tanúsítványként egy böngészőbe. A. Tanúsító hatóságunk példamutató telepítése Mozilla Firefox a következőképpen nézne ki: Jegyzet: Ha nem akarja hozzáadni a tanúsító hatóság listájára megbízható hatóságok, később lehetősége lesz egy kivétel és keménynek mutassa a weboldalt, még akkor is, ha bizonytalanként említik. De ekkor a címsávban megjelenik egy „sárga felkiáltójel” szimbólum, amely a bizonytalan kapcsolatot jelzi! Utána navigálunk a spring-security-x509-basic-auth modul és futtassa: Végül eltaláltuk // localhost: 8443 / user, adja meg felhasználói hitelesítő adatainkat a alkalmazás.tulajdonságok és látnia kell a - Helló Admin! üzenet. Most ellenőrizhetjük a kapcsolat állapotát a címsávban található „zöld zár” szimbólumra kattintva, és biztonságos kapcsolatnak kell lennie. Az előző részben bemutattuk a leggyakoribb SSL-hitelesítési séma - a szerveroldali hitelesítés - megvalósítását. Ez azt jelenti, hogy csak egy szerver hitelesítette magát az ügyfelek számára. Ebben a részben, leírjuk, hogyan adható hozzá a hitelesítés másik része - az ügyféloldali hitelesítés. Így csak azok az ügyfelek férhetnek hozzá biztonságos webhelyünkhöz, akiknek a szerverünkben megbízott hatóság által aláírt érvényes tanúsítványai vannak. De mielőtt folytatnánk, nézzük meg, milyen előnyei és hátrányai vannak a kölcsönös SSL-hitelesítés használatának. Előnyök: Hátrányok: A trustsore valamilyen módon ellentétes a kulcstárral. Tartalmazza a megbízható külső entitások tanúsítványait. Esetünkben elég, ha a gyökér CA tanúsítványt a truststore-ban tároljuk. Nézzük meg, hogyan lehet létrehozni egy truststore.jks fájlt, és importálja a rootCA.crt a kulcseszköz használatával: Megjegyzés: meg kell adnunk az újonnan létrehozott jelszót trusstore.jks. Itt megint a változtasd meg jelszó. Ennyi, importáltuk saját CA tanúsítványunkat, és a truststore használatra kész. A folytatáshoz módosítjuk a sajátunkat X509AuthenticationServer -tól meghosszabbítani WebSecurityConfigurerAdapter és felülírja a megadott konfigurációs módszerek egyikét. Itt konfiguráljuk az x.509 mechanizmust a Közönséges név (KN) a tanúsítvány mezője a felhasználónevek kibontására. Ezzel a kibontott felhasználónévvel a Spring Security egy feltöltött helyen keres UserDetailsService a felhasználók megfeleltetéséhez. Tehát megvalósítjuk ezt az egy demo felhasználót tartalmazó szolgáltatási felületet is. Tipp: Termelési környezetekben ez UserDetailsService például a JDBC adatforrásból töltheti be a felhasználóit. Észre kell vennie, hogy az osztályunkat feljegyezzük @EnableWebSecurity és @EnableGlobalMethodSecurity engedélyezett előzetes / utáni engedélyezéssel. Ez utóbbival feljegyezhetjük erőforrásainkat @PreAuthorize és @PostAuthorize finomszemcsés beléptető ellenőrzéshez: Mint korábban említettük, most már képesek vagyunk használni Kifejezés-alapú hozzáférés-vezérlés vezérlőnkben. Pontosabban, az engedélyezési jegyzeteinket a @EnableGlobalMethodSecurity annotáció a mi @ Konfiguráció: Az összes lehetséges engedélyezési lehetőség áttekintése megtalálható a hivatalos dokumentáció. Utolsó módosítási lépésként meg kell mondanunk az alkalmazásnak, hogy hol vagyonkezelő található és az SSL kliens hitelesítés szükséges (server.ssl.client-auth = szükség). Tehát a következőket tettük bele alkalmazás.tulajdonságok: Most, ha futtatjuk az alkalmazást, és a böngészőnkre mutatunk // localhost: 8443 / user, értesülünk arról, hogy a társ nem ellenőrizhető, és tagadja a weboldalunk megnyitását. Itt az ideje az ügyféloldali tanúsítvány létrehozásának. A szükséges lépések nagyjából megegyeznek a már létrehozott szerveroldali tanúsítvánnyal. Először létre kell hoznunk egy tanúsítvány-aláírási kérelmet: Olyan információkat kell megadnunk, amelyeket beépítenek a tanúsítványba. Ehhez a gyakorlathoz csak a köznevet (CN) írjuk be - Bob. Fontos, mivel ezt a bejegyzést az engedélyezés során használjuk, és csak Bobot ismeri fel a minta alkalmazásunk. Ezután alá kell írnunk a kérelmet a CA-val: Az utolsó lépés, amelyet meg kell tennünk, az az aláírt tanúsítvány és a magánkulcs becsomagolása a PKCS fájlba: Végül, készen állunk az ügyféltanúsítvány telepítésére a böngészőbe. Ismét a Firefoxot fogjuk használni: Most, amikor frissítjük a weboldalunkat, a rendszer arra kéri, hogy válassza ki a használni kívánt ügyféltanúsítványt: Ha olyan üdvözlő üzenetet látunk, mint - Hello Bob!, ez azt jelenti, hogy minden a várt módon működik! X.509 kliens hitelesítés hozzáadása egy http biztonsági konfiguráció XML is lehetséges: Az alapul szolgáló Tomcat konfigurálásához fel kell tennünk a sajátunkat kulcstár és a mi vagyonkezelő bele konf mappát, és szerkessze a server.xml: Tipp: Val vel clientAuth állítva "akar", SSL még mindig engedélyezve van, még akkor is, ha az ügyfél nem ad meg érvényes tanúsítványt. De ebben az esetben egy második hitelesítési mechanizmust kell használnunk, például egy bejelentkezési űrlapot a biztonságos erőforrások eléréséhez. Összefoglalva: megtanultuk hogyan hozhat létre saját aláírással ellátott CA tanúsítványt, és hogyan használhatja más tanúsítványok aláírásához. Ezenkívül létrehoztunk mind szerveroldali, mind kliensoldali tanúsítványokat. Ezután bemutattuk, hogyan importálhatjuk őket kulcstárba és ennek megfelelően egy megbízható áruházba. Továbbá most már képesnek kell lennie arra csomagoljon egy tanúsítványt a magánkulcsával együtt a PKCS12 formátumba. Megbeszéltük azt is, hogy mikor van értelme használni a Spring Security X.509 ügyfél-hitelesítést, ezért Önön múlik, hogy eldönti-e a webalkalmazásba, vagy sem. És összefoglalva, keresse meg a cikk forráskódját a Githubon.openssl req -new -newkey rsa: 4096 -keyout localhost.key –out localhost.csr
AuthorityKeyIdentifier = kulcsazonosító, kibocsátó 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 -days 365 -CAcreateserial -extfile localhost.ext
openssl x509 -in localhost.crt -text
3.2. Importálás a kulcstárba
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. Példa alkalmazásra
4.1. Maven-függőségek
org.springframework.boot spring-boot-starter-security org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-thymeleaf
4.2. Tavaszi csomagtartó alkalmazás
@SpringBootApplication public class 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) basic) .getPrincipal (); model.addAttribute ("felhasználónév", currentUser.getUsername ()); return "felhasználó"; }}
server.ssl.key-store = .. / store / keystore.jks server.ssl.key-store-password = $ {PASSWORD} server.ssl.key-alias = localhost server.ssl.key-password = $ {PASSWORD } server.ssl.enabled = true server.port = 8443 spring.security.user.name = Rendszergazda spring.security.user.password = admin
X.509 hitelesítési bemutató
Helló !
4.3. Root CA telepítés
mvn spring-boot: fut
5. Kölcsönös hitelesítés
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. Tavaszi biztonsági konfiguráció
@SpringBootApplication @EnableWebSecurity @EnableGlobalMethodSecurity (prePostEnabled = true) X509AuthenticationServer kiterjeszti a WebSecurityConfigurerAdapter {... {return new UserDetailsService () {@Orride public UserDetails loadUserByUsername (String username) {if (username.equals ("Bob")) {return new User (felhasználónév, "", AuthorityUtils .commaSeparatedStringToAuthorityList ("ROLE_USER")); új UsernameNotFoundException ("A felhasználó nem található!");}};}}
@Controller public class UserController {@PreAuthorize ("hasAuthority ('ROLE_USER')") @RequestMapping (value = "/ user") public String user (Model model, Principal principal) {...}}
server.ssl.trust-store = store / truststore.jks server.ssl.trust-store-password = $ {JELSZÓ} server.ssl.client-auth = szükség
5.3. Ügyféloldali tanúsítvány
openssl req -new -newkey rsa: 4096 -node -keyout clientBob.key –out clientBob.csr
openssl x509 -req -CA rootCA.crt -CAkey rootCA.key -in clientBob.csr -out clientBob.crt -days 365 -CAcreateserial
openssl pkcs12 -export -out clientBob.p12 -name "clientBob" -inkey clientBob.key -in clientBob.crt
6. Kölcsönös hitelesítés XML-mel
... ...
7. Következtetés