Trust Store vs Key Store - membuat dengan keytool

249

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 yespertanyaan 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?

Toby
sumber
Saya tidak yakin apa yang Anda maksud dengan "Sertifikat khusus yang saya impor hanya memiliki kunci publik": apakah itu hanya kunci publik (yaitu bukan sertifikat) atau sertifikat non-CA?
Bruno
hmmm, tidak yakin. Saya diekspor dari browser saya sebagai file PEM. Apakah itu membantu?
Toby
Jika diekspor dari browser, mungkin sertifikat. Apakah ini sertifikat server (dengan CN atau subjectAltName yang cocok dengan nama server)? Apakah ini sertifikat CA (lihat di bagian Basic Constraints, Anda harus dapat melihatnya menggunakan browser Anda).
Bruno
2
tl; dr: toko kepercayaan berisi sertifikat publik, tepercaya, root (CA), sedangkan toko identitas / kunci berisi pribadi, sertifikat identitas; Namun, file-bijaksana, mereka sama.
Andrew

Jawaban:

346

Terminologi memang agak membingungkan, tetapi keduanya javax.net.ssl.keyStoredan javax.net.ssl.trustStoredigunakan untuk menentukan keystores mana yang akan digunakan, untuk dua tujuan yang berbeda. Keystores datang dalam berbagai format dan bahkan bukan file (lihat pertanyaan ini ), dan keytoolhanya alat untuk melakukan berbagai operasi pada mereka (impor / ekspor / daftar / ...).

The javax.net.ssl.keyStoredan javax.net.ssl.trustStoreparameter adalah parameter default yang digunakan untuk membangun KeyManagerdan TrustManagers (masing-masing), kemudian digunakan untuk membangun sebuah SSLContextyang pada dasarnya mengandung SSL / TLS pengaturan untuk digunakan saat membuat SSL / TLS koneksi melalui SSLSocketFactoryatau SSLEngine. Properti sistem ini hanya dari mana nilai-nilai default berasal, yang kemudian digunakan oleh SSLContext.getDefault(), itu sendiri digunakan oleh SSLSocketFactory.getDefault()misalnya. (Semua ini dapat dikustomisasi melalui API di sejumlah tempat, jika Anda tidak ingin menggunakan nilai default dan spesifik SSLContextuntuk tujuan tertentu.)

Perbedaan antara KeyManagerdan TrustManager(dan dengan demikian antara javax.net.ssl.keyStoredan javax.net.ssl.trustStore) adalah sebagai berikut (dikutip dari panduan ref JSSE ):

TrustManager: Menentukan apakah kredensial otentikasi jarak jauh (dan dengan demikian koneksi) harus dipercaya.

KeyManager: Menentukan kredensial autentikasi mana yang akan dikirim ke host jarak jauh.

(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.keyStoredimaksudkan untuk berisi kunci pribadi dan sertifikat Anda, sedangkan keystore in dimaksudkan untuk berisi javax.net.ssl.trustStoresertifikat 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).

Bruno
sumber
terima kasih atas jawabannya, itu sedikit beres. Namun saya masih bingung ketika menyangkut penggunaan, saya dapat menggunakan kunci pri / pub pk12 (xxx.p12) sebagai keystore (via -D) dan membuat koneksi SSL (tepercaya) tanpa menyebutkan truststore via - D ... oh baiklah.
Toby
57
Anda tidak perlu menentukan truststore, karena ada nilai default untuknya (ini dibundel dengan JRE), biasanya di $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.
Bruno
2
Terima kasih atas informasi yang bermanfaat. Dalam Weblogic, ada "toko kunci-identitas" yang menyimpan sertifikat SSL server dan kemudian ada "toko kunci-kepercayaan" yang menyimpan sertifikat SSL yang dipercayai oleh server, jadi apakah saya benar jika saya mengatakan bahwa "kunci-identitas" -store "tidak lain adalah" keystore "dan" trust-key-store "tidak lain adalah" truststore "?
hagrawal
@ Bruno juga haruskah kita perhatikan bahwa ketika ada "jssecacerts", "cacerts" diabaikan?
kommradHomer
61

Untuk menjelaskan secara umum usecase / purpose atau cara awam:

TrustStore : Seperti namanya, biasanya digunakan untuk menyimpan sertifikat entitas tepercaya. Suatu proses dapat mempertahankan penyimpanan sertifikat dari semua pihak tepercaya yang dipercayai.

keyStore : Digunakan untuk menyimpan kunci server (baik publik dan pribadi) bersama dengan sertifikat yang ditandatangani.

Selama jabat tangan SSL,

  1. Seorang klien mencoba mengakses https: //

  2. Dan dengan demikian, Server merespons dengan memberikan sertifikat SSL (yang disimpan di keyStore-nya)

  3. 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?

  4. 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.

Balaji Boggaram Ramanarayan
sumber
25

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.trustStoreproperti 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.

muskK
sumber
4
Anda dapat menggunakan berbagai jenis keystore (mis., PKCS12) dengan mengatur javax.net.ssl.keyStoreTypedan javax.net.ssl.trustStoreTypeproperti sistem.
Donal Fellows
1
@ Donal: Tambahan yang bagus. Apakah Anda mengetahui jika ada daftar semua kontainer yang didukung? Saya hanya tahu tentang PKCS12 dan JKS (yang pertama adalah hasil dari coba-coba ...).
musiKk
2
format keystore bervariasi tergantung pada penyedia yang tersedia (lihat daftar ini untuk yang dibundel dengan Oracle JRE secara default). Ada juga diskusi dalam pertanyaan ini . Penyedia lain (misalnya BouncyCastle) dapat digunakan untuk format lain.
Bruno
21

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:

  1. Hasilkan sertifikat menggunakan perintah keygen di windows:

keytool -genkey -keystore server.keystore -alias mycert -keyalg RSA -keysize 2048 -validity 3950

  1. Cukup sertifikasikan sertifikat:

keytool -selfcert -alias mycert -keystore server.keystore -validity 3950

  1. Ekspor sertifikat ke folder:

keytool -export -alias mycert -keystore server.keystore -rfc -file mycert.cer

  1. Impor Sertifikat ke Truststore klien:

keytool -importcert -alias mycert -file mycert.cer -keystore truststore

Akash5288
sumber
Hai, Saya punya satu skenario di mana saya memiliki dua aplikasi berbeda dalam wadah yang sama (kucing jantan). Dari kedua aplikasi, saya harus memanggil titik akhir sisanya dari kedua sisi ke setiap aplikasi. Seperti, dari A ke B dan B ke A (A dan B adalah dua aplikasi). Apakah saya perlu menggunakan truststore dalam skenario ini? Karena saya menggunakan custom rest client yang menggunakan keystore. Tolong sarankan.
Deepak
0

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 certificateingin 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.

Sample: 
   keytool -import -alias abcdefg -file abcdefg.cer -keystore cacerts
        where "abcdefg" is the alias name and "abcdefg.cer" is the actual certificate name and "cacerts" is the truststore name

9) Berikan perintah keytool untuk semua sertifikat dan tambahkan ke toko kepercayaan.

    keytool -list -v -keystore cacerts
Ganesh Sha
sumber
-1

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.

Tim END_TECH
sumber
Toko kepercayaan menyimpan sertifikat
Marquis of Lorne
-1

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.

Snehal Masne
sumber