Skillnad mellan en Java Keystore och en Truststore

Java Top

Jag tillkännagav just den nya Learn Spring- kursen, med fokus på grunderna i Spring 5 och Spring Boot 2:

>> KONTROLLERA KURSET

1. Översikt

I den här snabba artikeln ger vi en översikt över skillnaderna mellan en Java-keystore och en Java-truststore.

2. Begrepp

I de flesta fall använder vi en keystore och en truststore när vår applikation behöver kommunicera via SSL / TLS .

Vanligtvis är det lösenordsskyddade filer som sitter på samma filsystem som vår applikation. Standardformatet som används för dessa filer är JKS fram till Java 8 .

Men sedan Java 9 är standardnyckellagerformatet PKCS12 . Den största skillnaden mellan JKS och PKCS12 är att JKS är ett format som är specifikt för Java, medan PKCS12 är ett standardiserat och språkneutralt sätt att lagra krypterade privata nycklar och certifikat.

3. Java KeyStore

En Java-nyckellager lagrar privata nyckelposter, certifikat med offentliga nycklar eller bara hemliga nycklar som vi kan använda för olika kryptografiska ändamål. Den lagrar var och en med ett alias för att enkelt leta upp.

Generellt sett har keystores nycklar som vår applikation äger och som vi kan använda för att bevisa ett meddelandes integritet och avsändarens äkthet, t.ex. genom att signera nyttolast.

Vanligtvis använder vi en keystore när vi är en server och vill använda HTTPS . Under ett SSL-handskakning letar servern upp den privata nyckeln från nyckellagret och presenterar sin motsvarande offentliga nyckel och certifikat för klienten.

På motsvarande sätt, om klienten också behöver autentisera sig själv - en situation som kallas ömsesidig autentisering - har klienten också en nyckellager och presenterar också sin offentliga nyckel och certifikat.

Det finns ingen standardnyckellager, så om vi vill använda en krypterad kanal måste vi ställa in javax.net.ssl.keyStore och javax.net.ssl.keyStorePassword. Om vårt keystore-format är annorlunda än standard, kan vi använda javax.net.ssl.keyStoreType för att anpassa det.

Naturligtvis kan vi också använda dessa nycklar för att tillgodose andra behov. Privata nycklar kan signera eller dekryptera data och offentliga nycklar kan verifiera eller kryptera data. Hemliga nycklar kan också utföra dessa funktioner. En keystore är en plats som vi kan hålla fast vid dessa nycklar.

Vi kan också interagera med keystore programmatiskt.

4. Java TrustStore

En truststore är motsatt - medan en keystore vanligtvis håller på certifikat som identifierar oss, en truststore håller på certifikat som identifierar andra.

I Java använder vi det för att lita på den tredje part vi ska kommunicera med.

Ta vårt tidigare exempel. Om en klient pratar med en Java-baserad server via HTTPS, ser servern upp den associerade nyckeln från sin nyckellager och presenterar den offentliga nyckeln och certifikatet för klienten.

Vi, klienten, letar sedan upp tillhörande certifikat i vår truststore. Om certifikatet eller certifikatutfärdaren som presenteras av den externa servern inte finns i vår förtroendebutik får vi ett SSLHandshakeException och anslutningen kommer inte att upprättas.

Java har samlat en truststore som heter cacerts och finns i katalogen $ JAVA_HOME / jre / lib / security .

Den innehåller standardbetrodda certifikatutfärdare:

$ keytool -list -keystore cacerts Enter keystore password: Keystore type: JKS Keystore provider: SUN Your keystore contains 92 entries verisignclass2g2ca [jdk], 2018-06-13, trustedCertEntry, Certificate fingerprint (SHA1): B3:EA:C4:47:76:C9:C8:1C:EA:F2:9D:95:B6:CC:A0:08:1B:67:EC:9D

Vi ser här att truststore innehåller 92 betrodda certifikatposter och en av posterna är verisignclass2gca- posten . Detta innebär att JVM automatiskt litar på certifikat som signeras av verisignclass2g2ca .

Här kan vi åsidosätta standardplatsen för truststore via egenskapen javax.net.ssl.trustStore . På samma sätt kan vi ställa in javax.net.ssl.trustStorePassword och javax.net.ssl.trustStoreType för att ange truststores lösenord och typ.

5. Sammanfattning

I denna handledning diskuterade vi de viktigaste skillnaderna mellan Java keystore och Java truststore och dess syfte.

Vi visade också hur standardvärdena kan åsidosättas med systemegenskaper.

Därefter kan vi ta en titt på följande SSL-guide eller JSSE Reference Guide för att lära oss mer information om krypterad kommunikation i Java.

Java-botten

Jag tillkännagav just den nya Learn Spring- kursen, med fokus på grunderna i Spring 5 och Spring Boot 2:

>> KONTROLLERA KURSET