Saya mengerti bahwa keystore biasanya memegang kunci privat / publik dan trust store hanya kunci publik (dan mewakili daftar pihak tepercaya yang ingin Anda komunikasikan). Nah, itu asumsi pertama saya, jadi jika itu tidak benar, saya mungkin belum memulai dengan baik ...
Saya tertarik untuk memahami bagaimana / kapan Anda membedakan toko ketika menggunakan keytool.
Sejauh ini saya telah membuat keystore menggunakan
keytool -import -alias bob -file bob.crt -keystore keystore.ks
yang membuat file keystore.ks saya. Saya menjawab yes
pertanyaan apakah saya mempercayai bob tetapi tidak jelas bagi saya apakah ini telah membuat file keystore atau file truststore? Saya dapat mengatur aplikasi saya untuk menggunakan file sebagai salah satu.
-Djavax.net.ssl.keyStore=keystore.ks -Djavax.net.ssl.keyStorePassword=x
-Djavax.net.ssl.trustStore=keystore.ks -Djavax.net.ssl.trustStorePassword=x
dan dengan System.setProperty( "javax.net.debug", "ssl")
set, saya dapat melihat sertifikat di bawah sertifikasi tepercaya (tetapi tidak di bawah bagian keystore). Sertifikat khusus yang saya impor hanya memiliki kunci publik dan saya bermaksud menggunakannya untuk mengirim barang melalui koneksi SSL ke Bob (tapi mungkin itu yang terbaik untuk pertanyaan lain!).
Petunjuk atau klarifikasi apa pun akan sangat dihargai. Apakah output dari keytool sama dengan apa pun yang Anda impor dan konvensi satu-satunya yang mengatakan satu adalah keystore dan yang lainnya toko kepercayaan? Apa hubungannya saat menggunakan SSL dll?
Jawaban:
Terminologi memang agak membingungkan, tetapi keduanya
javax.net.ssl.keyStore
danjavax.net.ssl.trustStore
digunakan untuk menentukan keystores mana yang akan digunakan, untuk dua tujuan yang berbeda. Keystores datang dalam berbagai format dan bahkan bukan file (lihat pertanyaan ini ), dankeytool
hanya alat untuk melakukan berbagai operasi pada mereka (impor / ekspor / daftar / ...).The
javax.net.ssl.keyStore
danjavax.net.ssl.trustStore
parameter adalah parameter default yang digunakan untuk membangunKeyManager
danTrustManager
s (masing-masing), kemudian digunakan untuk membangun sebuahSSLContext
yang pada dasarnya mengandung SSL / TLS pengaturan untuk digunakan saat membuat SSL / TLS koneksi melaluiSSLSocketFactory
atauSSLEngine
. Properti sistem ini hanya dari mana nilai-nilai default berasal, yang kemudian digunakan olehSSLContext.getDefault()
, itu sendiri digunakan olehSSLSocketFactory.getDefault()
misalnya. (Semua ini dapat dikustomisasi melalui API di sejumlah tempat, jika Anda tidak ingin menggunakan nilai default dan spesifikSSLContext
untuk tujuan tertentu.)Perbedaan antara
KeyManager
danTrustManager
(dan dengan demikian antarajavax.net.ssl.keyStore
danjavax.net.ssl.trustStore
) adalah sebagai berikut (dikutip dari panduan ref JSSE ):(Parameter lain tersedia dan nilai defaultnya dijelaskan dalam panduan referensi JSSE . Perhatikan bahwa meskipun ada nilai default untuk toko kepercayaan, tidak ada satu untuk penyimpanan kunci.)
Pada dasarnya, keystore in
javax.net.ssl.keyStore
dimaksudkan untuk berisi kunci pribadi dan sertifikat Anda, sedangkan keystore in dimaksudkan untuk berisijavax.net.ssl.trustStore
sertifikat CA yang ingin Anda percayai ketika pihak jauh menyajikan sertifikatnya. Dalam beberapa kasus, mereka bisa menjadi satu dan toko yang sama, meskipun sering kali lebih baik menggunakan toko yang berbeda (terutama ketika mereka berbasis file).sumber
$JAVA_HOME/lib/security/cacerts
(lihat tautan panduan ref JSSE ke-2 yang saya kirim). Seperti halnya peramban, peramban ini berisi serangkaian sertifikat CA tepercaya. Secara umum, klien akan selalu menggunakan truststore untuk memeriksa sertifikat server tetapi keystore hanya akan digunakan jika server meminta sertifikat klien, dan server akan selalu menggunakan keystore untuk kunci + cert sendiri tetapi truststore hanya akan menjadi digunakan jika klien mengirim sertifikat klien.Untuk menjelaskan secara umum usecase / purpose atau cara awam:
Selama jabat tangan SSL,
Seorang klien mencoba mengakses https: //
Dan dengan demikian, Server merespons dengan memberikan sertifikat SSL (yang disimpan di keyStore-nya)
Sekarang, klien menerima sertifikat SSL dan memverifikasinya melalui trustStore (yaitu trustStore klien sudah memiliki set sertifikat yang telah ditentukan sebelumnya yang dipercayai). Seperti: Dapatkah saya mempercayai server ini? Apakah ini server yang sama yang saya coba ajak bicara? Tidak ada serangan perantara?
Setelah, klien memverifikasi bahwa ia berbicara ke server yang dipercaya, maka komunikasi SSL dapat terjadi melalui kunci rahasia bersama.
Catatan: Saya tidak berbicara di sini tentang otentikasi klien di sisi server. Jika server ingin melakukan otentikasi klien juga, maka server juga memelihara trustStore untuk memverifikasi klien.
sumber
Tidak ada perbedaan antara file keystore dan truststore. Keduanya adalah file dalam format file JKS eksklusif. Perbedaannya adalah dalam penggunaan: Sepengetahuan saya, Java hanya akan menggunakan toko yang direferensikan oleh
-Djavax.net.ssl.trustStore
properti sistem untuk mencari sertifikat untuk dipercaya ketika membuat koneksi SSL. Sama untuk kunci dan-Djavax.net.ssl.keyStore
. Tapi secara teori, boleh saja menggunakan satu dan file yang sama untuk trust- dan keystores.sumber
javax.net.ssl.keyStoreType
danjavax.net.ssl.trustStoreType
properti sistem.Keystore digunakan oleh server untuk menyimpan kunci privat, dan Truststore digunakan oleh klien pihak ketiga untuk menyimpan kunci publik yang disediakan oleh server untuk diakses. Saya telah melakukannya dalam aplikasi produksi saya. Berikut adalah langkah-langkah untuk menghasilkan sertifikat java untuk komunikasi SSL:
keytool -genkey -keystore server.keystore -alias mycert -keyalg RSA -keysize 2048 -validity 3950
keytool -selfcert -alias mycert -keystore server.keystore -validity 3950
keytool -export -alias mycert -keystore server.keystore -rfc -file mycert.cer
keytool -importcert -alias mycert -file mycert.cer -keystore truststore
sumber
Ini adalah langkah-langkah untuk membuat Truststore di mesin lokal Anda menggunakan Keytool. Langkah-langkah untuk membuat truststore untuk URL di mesin lokal Anda.
1) Tekan url di browser menggunakan chrome
2) Periksa ikon "i" di sebelah kiri url di chrome dan klik
3) Periksa opsi sertifikat dan klik dan kotak Dialog akan terbuka
4) periksa tab "jalur sertifikat" untuk mengetahui jumlah sertifikat yang tersedia untuk membuat truststore
5) Buka yang
"details" tab -> click"Copy to File" -> Give the path and the name for the certificate
ingin Anda buat.6) Periksa apakah memiliki sertifikat induk dan ikuti titik "5" .
7) Setelah semua sertifikat dibuat, buka Command Prompt dan navigasikan ke jalur tempat Anda membuat sertifikat.
8) berikan perintah Keytool di bawah ini untuk menambahkan sertifikat dan membuat truststore.
9) Berikan perintah keytool untuk semua sertifikat dan tambahkan ke toko kepercayaan.
sumber
keystore hanya menyimpan kunci pribadi, sementara truststore menyimpan kunci publik. Anda akan ingin menghasilkan sertifikat java untuk komunikasi SSL. Anda dapat menggunakan perintah keygen di windows, ini mungkin akan menjadi solusi paling mudah.
sumber
Secara sederhana:
Keystore digunakan untuk menyimpan kredensial Anda (server atau klien) sementara truststore digunakan untuk menyimpan kredensial orang lain (Sertifikat dari CA).
Keystore diperlukan ketika Anda menyiapkan sisi server pada SSL, itu digunakan untuk menyimpan sertifikat identitas server, yang server akan hadirkan kepada klien pada koneksi sementara setup toko kepercayaan di sisi klien harus berisi untuk membuat koneksi berfungsi. Jika Anda browser untuk terhubung ke situs web apa pun melalui SSL, ia memverifikasi sertifikat yang disajikan oleh server terhadap truststore-nya.
sumber