Разлика между Java Keystore и Truststore

Java Top

Току що обявих новия курс Learn Spring , фокусиран върху основите на Spring 5 и Spring Boot 2:

>> ПРЕГЛЕД НА КУРСА

1. Общ преглед

В тази кратка статия ще предоставим общ преглед на разликите между хранилището на ключове на Java и хранилището на Java.

2. Понятия

В повечето случаи използваме хранилище на ключове и магазин за доверие, когато нашето приложение трябва да комуникира през SSL / TLS .

Обикновено това са защитени с парола файлове, които се намират в същата файлова система като нашето работещо приложение. Форматът по подразбиране, използван за тези файлове, е JKS до Java 8 .

От Java 9 обаче форматът на хранилището на ключове по подразбиране е PKCS12 . Най-голямата разлика между JKS и PKCS12 е, че JKS е формат, специфичен за Java, докато PKCS12 е стандартизиран и езиково неутрален начин за съхранение на криптирани частни ключове и сертификати.

3. Java KeyStore

Магазин за ключове на Java съхранява записи на частни ключове, сертификати с публични ключове или просто секретни ключове, които можем да използваме за различни криптографски цели. Той съхранява всеки по псевдоним за по-лесно търсене.

Най-общо казано, хранилищата на ключове държат ключове, притежавани от нашето приложение, които можем да използваме, за да докажем целостта на съобщението и автентичността на подателя, да речем чрез подписване на полезни товари.

Обикновено ще използваме хранилище на ключове, когато сме сървър и искаме да използваме HTTPS . По време на SSL ръкостискане сървърът търси частния ключ от хранилището на ключове и представя съответния публичен ключ и сертификат на клиента.

Съответно, ако клиентът също трябва да се удостовери - ситуация, наречена взаимно удостоверяване - тогава клиентът също има хранилище на ключове и също така представя своя публичен ключ и сертификат.

Няма хранилище на ключове по подразбиране, така че ако искаме да използваме криптиран канал, ще трябва да зададем javax.net.ssl.keyStore и javax.net.ssl.keyStorePassword. Ако форматът на нашето хранилище на ключове е различен от стандартния, можем да използваме javax.net.ssl.keyStoreType, за да го персонализираме.

Разбира се, можем да използваме тези ключове и за обслужване на други нужди. Частните ключове могат да подписват или дешифрират данни, а публичните ключове могат да проверяват или криптират данни. Тайните ключове могат да изпълняват и тези функции. Магазинът за ключове е място, което можем да задържим върху тези клавиши.

Можем и програмно да взаимодействаме с хранилището на ключове.

4. Java TrustStore

Магазинът за доверие е обратното - докато хранилището на ключове обикновено държи сертификати, които ни идентифицират, хранилището за доверие държи сертификати, които идентифицират други.

В Java го използваме, за да се доверим на третата страна, с която предстои да комуникираме.

Вземете нашия по-ранен пример. Ако клиент разговаря с Java-базиран сървър по HTTPS, сървърът ще търси свързания ключ от своето хранилище на ключове и ще представи публичния ключ и сертификат на клиента.

След това ние, клиентът, търсим свързания сертификат в нашия магазин за доверие. Ако сертификатът или удостоверителните органи, представени от външния сървър, не са в нашето хранилище за доверие, ще получим SSLHandshakeException и връзката няма да бъде настроена успешно.

Java е свързала пакет за доверие, наречен cacerts, и той се намира в директорията $ JAVA_HOME / jre / lib / security .

Той съдържа по подразбиране, доверени сертифициращи органи:

$ 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

Тук виждаме, че магазинът за доверие съдържа 92 записа на доверен сертификат и един от записите е записът verisignclass2gca . Това означава, че JVM автоматично ще се доверява на сертификати, подписани от verisignclass2g2ca .

Тук можем да замени стандартното местоположение truststore чрез javax.net.ssl.trustStore имота . По подобен начин можем да зададем javax.net.ssl.trustStorePassword и javax.net.ssl.trustStoreType, за да зададем паролата и типа на truststore.

5. Заключение

В този урок обсъдихме основните разлики между хранилището на ключове Java и хранилището на Java и неговото предназначение.

Също така показахме как настройките по подразбиране могат да бъдат заменени със системните свойства.

След това бихме могли да разгледаме следващото ръководство за SSL или справочното ръководство на JSSE, за да научим повече подробности за криптирана комуникация в Java.

Дъно на Java

Току що обявих новия курс Learn Spring , фокусиран върху основите на Spring 5 и Spring Boot 2:

>> ПРЕГЛЕД НА КУРСА