java SSL та cert keystore


165

Як моя програма Java знає, де знаходиться мій сховище ключів, що містить сертифікат? Або, як я можу сказати своїй програмі java, де шукати брелок для зберігання ключів?

Після того, як певним чином вказано сховище ключів, як вказати сертифікат, який слід використовувати для автентифікації сервера до клієнта?


краще уникати використання налаштування System.setProperty (підходи нижче), див.: docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/… , як побудувати KeyManagerFactory для SSLContext
Marek- A-

Відповіді:


111
System.setProperty("javax.net.ssl.trustStore", path_to_your_jks_file);

4
Хтось знає, як посилатися на це на вікні Windows? System.setProperty ("javax.net.ssl.trustStore", "C: \\ програмні файли (x86) \\ Java \\ jdk1.7.0_21 \\ jre \\ lib \\ безпека \\ cacerts"); не працює для мене :(
simgineer

4
У Windows вказане ім'я шляху має використовувати нахилені косої риски, /, замість косої косий лінії, \.
Droidman

Це спрацювало? Я використовував той самий код, де мій файл 'jks' містить сертифікат CA. Але я все одно отримую javax.xml.ws.WebServiceException: org.apache.axis2.AxisFault: Транспортна помилка: 403 Помилка: Заборонена помилка, коли я викликаю код клієнта через створені SOAP заглушки. Будь-які ідеї?
james2611nov

1
Існує також властивість системи паролів (javax.net.ssl.trustStorePassword). Можна також передавати як аргументи JVM -Djavax.net.ssl.trustStore = clientTrustStore.key -Djavax.net.ssl.trustStorePassword = customPassword Refer docs.oracle.com/javadb/10.8.3.0/adminguide/cadminsslclient.html
Kingsly

@ james2611nov: Якщо ви отримуєте помилку HTTP 403 (або будь-яку іншу відповідь HTTP) при виклику кінцевої точки HTTPS, це означає, що ви успішно пройшли через налаштування TLS: взаємодія HTTP відбувається лише після налаштування каналу TLS ( інакше їх не вдалося захистити). Отже - так, ця відповідь, мабуть, спрацювала для вас. :-)
ruakh

295

Властивості SSL встановлюються на рівні JVM за допомогою системних властивостей. Це означає, що ви можете встановити їх під час запуску програми (java -D ....) Або ви можете встановити їх у коді, виконавши System.setProperty.

Конкретні ключі, які ви повинні встановити, наведені нижче:

javax.net.ssl.keyStore - Розташування файлу зберігання ключів Java, що містить власний сертифікат і приватний ключ процесу заявки. У Windows вказане ім'я шляху повинно використовувати нахилені косої риски, /, замість рисових косих.

javax.net.ssl.keyStorePassword - пароль для доступу до приватного ключа з файлу магазину ключів, визначеного javax.net.ssl.keyStore. Цей пароль використовується двічі: для розблокування файлу зберігання ключів (зберігання пароля) та для розшифровки приватного ключа, що зберігається у сховищі ключів (пароль ключа).

javax.net.ssl.trustStore - Розташування файлу зберігання ключів Java, що містить колекцію сертифікатів CA, яким довіряє цей процес подання заявки (довірений магазин). У Windows, зазначений шлях до файлу повинен використовувати слеш, /замість зворотних косих рис, \.

Якщо місце розташування довіреного магазину не вказане за допомогою цього властивості, реалізація SunJSSE здійснює пошук та використання файлу зберігання ключів у таких місцях (по порядку):

  1. $JAVA_HOME/lib/security/jssecacerts
  2. $JAVA_HOME/lib/security/cacerts

javax.net.ssl.trustStorePassword - Пароль для розблокування файлу зберігання ключів (збереження пароля), вказаного користувачем javax.net.ssl.trustStore.

javax.net.ssl.trustStoreType - (Необов’язково) Для формату файлу зберігання ключів Java ця властивість має значення jks (або JKS). Зазвичай ви не вказуєте це властивість, оскільки його значення за замовчуванням вже jks.

javax.net.debug - Щоб увімкнути журнал для шару SSL / TLS, встановіть цю властивість на ssl.


17
Більш доцільним було б посилання на документ, з якого це цитується. Я здогадуюсь, що це: fusesource.com/docs/broker/5.3/security/SSL-SysProps.html
Бруно

4
Офіційним документом має бути довідник JSSE
алеун

4
JDK7 docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/… зараз є більш підходящим.
Рік-777

11
Для всіх, хто, можливо, захоче відредагувати системний довірений магазин, пароль за замовчуванням - "changeit": community.oracle.com/thread/1540678?start=0&tstart=0
cwc

+1 для опори javax.net.ssl.trustStorePassword. Я деякий час оглядався, і це було перше, що згадувало про це.
jgreen

22

Просто слово обережності. Якщо ви намагаєтесь відкрити існуючий сховище ключів JKS в Java 9 і далі, вам потрібно переконатися, що ви також згадуєте такі властивості зі значенням як "JKS":

javax.net.ssl.keyStoreType
javax.net.ssl.trustStoreType

Причина полягає в тому, що тип зберігання ключів за замовчуванням, як це визначено у файлі java.security, було змінено на pkcs12 з jks від Java 9.


11

Перш за все, існує два види магазинів брелоків.

Індивідуальний та загальний

Додаток буде використовувати той, який вказаний у запуску або за замовчуванням системи.

Це буде інша папка, якщо працює JRE або JDK, або якщо ви перевірите особисту чи "глобальну".

Вони теж зашифровані

Коротше кажучи, шлях буде таким:

$JAVA_HOME/lib/security/cacerts для "загального", який має всі КА для органів влади і є досить важливим.


Типи - "зберігання ключів" і "довіра". Будь ласка, не вигадуйте зайву термінологію.
Маркіз Лорн

9

Ви також можете згадати шлях під час виконання, використовуючи -Dвластивості, як показано нижче

-Djavax.net.ssl.trustStore=/home/user/SSL/my-cacerts 
-Djavax.net.ssl.keyStore=/home/user/SSL/server_keystore.jks

У своєму застосуванні apache spark я використовував для надання шляху до certs і зберігання клавіш, використовуючи --confопцію та extraJavaoptionsв іскровому поданні, як показано нижче

--conf 'spark.driver.extraJavaOptions= 
-Djavax.net.ssl.trustStore=/home/user/SSL/my-cacerts 
-Djavax.net.ssl.keyStore=/home/user/SSL/server_keystore.jks' 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.