Нарешті вдалося вирішити всі питання, тому я відповім на власне запитання. Це налаштування / файли, якими я керував, щоб вирішити свою конкретну проблему;
У сховищі ключів клієнта є формат PKCS # 12 файл , який містить
- Публічний сертифікат клієнта (у цьому випадку підписаний власноруч підписаним ЦЗ)
- Особистий ключ клієнта
Для його генерування я використав pkcs12
, наприклад, команду OpenSSL ;
openssl pkcs12 -export -in client.crt -inkey client.key -out client.p12 -name "Whatever"
Порада: переконайтеся, що ви отримуєте останню версію OpenSSL, а не версію 0.9.8h, оскільки, здається, страждає від помилки, яка не дозволяє правильно генерувати файли PKCS # 12.
Цей файл PKCS # 12 клієнт Java буде використовувати для представлення серверного сертифіката клієнта, коли сервер явно попросив клієнта пройти автентифікацію. Дивіться статтю Вікіпедії на TLS для огляду того, як насправді працює протокол для автентифікації клієнтських сертифікатів (також пояснюється, для чого нам потрібен приватний ключ клієнта).
У довіреному сховище клієнта є прямим JKS формат файл , який містить корінь або проміжного ЦСА сертифікатів . Ці сертифікати CA визначають, з якими кінцевими точками вам буде дозволено спілкуватися; в цьому випадку це дозволить вашому клієнту підключитися до того сервера, який представляє сертифікат, який був підписаний одним із ЦА довірених організацій.
Для його генерування ви можете використовувати, наприклад, стандартний Java-клавішний інструмент;
keytool -genkey -dname "cn=CLIENT" -alias truststorekey -keyalg RSA -keystore ./client-truststore.jks -keypass whatever -storepass whatever
keytool -import -keystore ./client-truststore.jks -file myca.crt -alias myca
Використовуючи цей довірений магазин, ваш клієнт спробує зробити повне рукостискання SSL з усіма серверами, які представляють сертифікат, підписаний ЦА, ідентифікований myca.crt
.
Файли, наведені вище, призначені виключно для клієнта. Коли ви також хочете налаштувати сервер, він потребує власних файлів із зберіганням ключів та довіри. На цьому веб-сайті ви знайдете чудовий посібник для налаштування повноправного прикладу як для клієнта Java, так і для сервера (за допомогою Tomcat) .
Питання / Зауваження / Поради
- Аутентифікацію клієнтських сертифікатів може бути застосовано лише сервером.
- ( Важливо! ) Коли сервер запитує сертифікат клієнта (як частина рукостискання TLS), він також надасть список довірених ЦА як частина запиту на сертифікат. Якщо клієнтський сертифікат, який ви хочете подати для аутентифікації, не підписується одним із цих ЦА, він взагалі не буде представлений (на мою думку, це дивна поведінка, але я впевнений, що в цьому є причина). Це було основною причиною моїх проблем, оскільки інша сторона не налаштувала свій сервер належним чином, щоб прийняти мій самопідписаний клієнтський сертифікат, і ми припустили, що проблема в моєму кінці не належним чином надала клієнтський сертифікат у запиті.
- Отримайте Wireshark. Він має чудовий аналіз пакетів SSL / HTTPS і стане неабиякою допомогою для налагодження та пошуку проблеми. Це схоже на,
-Djavax.net.debug=ssl
але більш структурований і (можливо) простіше інтерпретувати, якщо вам незручно виводити налагодження Java SSL.
Цілком можливо використовувати бібліотеку Apache httpclient. Якщо ви хочете використовувати httpclient, просто замініть цільову URL-адресу на еквівалент HTTPS та додайте наступні аргументи JVM (які однакові для будь-якого іншого клієнта, незалежно від бібліотеки, яку ви хочете використовувати для надсилання / отримання даних через HTTP / HTTPS) :
-Djavax.net.debug=ssl
-Djavax.net.ssl.keyStoreType=pkcs12
-Djavax.net.ssl.keyStore=client.p12
-Djavax.net.ssl.keyStorePassword=whatever
-Djavax.net.ssl.trustStoreType=jks
-Djavax.net.ssl.trustStore=client-truststore.jks
-Djavax.net.ssl.trustStorePassword=whatever