Akhirnya berhasil menyelesaikan semua masalah, jadi saya akan menjawab pertanyaan saya sendiri. Ini adalah pengaturan / file yang saya gunakan untuk mengelola untuk menyelesaikan masalah khusus saya;
The keystore klien adalah PKCS # 12 Format file yang berisi
- Publik klienSertifikat (dalam hal ini ditandatangani oleh CA yang ditandatangani sendiri)
- Kunci pribadi klien
Untuk menghasilkannya saya menggunakan pkcs12
perintah OpenSSL , misalnya;
openssl pkcs12 -export -in client.crt -inkey client.key -out client.p12 -name "Whatever"
Tip: pastikan Anda mendapatkan OpenSSL terbaru, bukan versi 0.9.8h karena sepertinya ada bug yang tidak memungkinkan Anda menghasilkan file PKCS # 12 dengan benar.
File PKCS # 12 ini akan digunakan oleh klien Java untuk menyajikan sertifikat klien ke server ketika server telah secara eksplisit meminta klien untuk mengotentikasi. Lihat artikel Wikipedia tentang TLS untuk ikhtisar tentang bagaimana protokol untuk otentikasi sertifikat klien benar-benar bekerja (juga menjelaskan mengapa kita memerlukan kunci pribadi klien di sini).
The truststore klien adalah lurus ke depan Format JKS file yang berisi akar atau CA menengah sertifikat . Sertifikat CA ini akan menentukan titik akhir mana Anda akan diizinkan untuk berkomunikasi dengan, dalam hal ini akan memungkinkan klien Anda untuk terhubung ke server mana saja yang menyajikan sertifikat yang ditandatangani oleh salah satu CA truststore.
Untuk menghasilkannya, Anda dapat menggunakan keytool Java standar, misalnya;
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
Menggunakan truststore ini, klien Anda akan mencoba melakukan jabat tangan SSL lengkap dengan semua server yang menyajikan sertifikat yang ditandatangani oleh CA yang diidentifikasi oleh myca.crt
.
File-file di atas hanya untuk klien. Ketika Anda ingin mengatur server juga, server memerlukan file key- dan truststore sendiri. Sebuah walk-through yang bagus untuk menyiapkan contoh yang berfungsi penuh untuk klien Java dan server (menggunakan Tomcat) dapat ditemukan di situs web ini .
Masalah / Komentar / Kiat
- Otentikasi sertifikat klien hanya dapat diberlakukan oleh server.
- ( Penting! ) Ketika server meminta sertifikat klien (sebagai bagian dari jabat tangan TLS), server juga akan memberikan daftar CA tepercaya sebagai bagian dari permintaan sertifikat. Ketika sertifikat klien yang ingin Anda sajikan untuk otentikasi tidak ditandatangani oleh salah satu CA ini, itu tidak akan disajikan sama sekali (menurut saya, ini adalah perilaku aneh, tapi saya yakin ada alasan untuk itu). Ini adalah penyebab utama masalah saya, karena pihak lain tidak mengonfigurasi server mereka dengan baik untuk menerima sertifikat klien yang saya tandatangani sendiri dan kami berasumsi bahwa masalahnya ada pada saya karena tidak menyediakan sertifikat klien dengan benar dalam permintaan.
- Dapatkan Wireshark. Ini memiliki analisis paket SSL / HTTPS yang hebat dan akan sangat membantu debugging dan menemukan masalah. Ini mirip dengan
-Djavax.net.debug=ssl
tetapi lebih terstruktur dan (bisa dibilang) lebih mudah untuk ditafsirkan jika Anda tidak nyaman dengan output debug SSL Java.
Sangat mungkin untuk menggunakan perpustakaan Apache httpclient. Jika Anda ingin menggunakan httpclient, ganti saja URL tujuan dengan yang setara dengan HTTPS dan tambahkan argumen JVM berikut (yang sama untuk klien lain, terlepas dari pustaka yang ingin Anda gunakan untuk mengirim / menerima data melalui 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