SSL java dan keystore cert

165

Bagaimana program java saya tahu di mana keystore saya yang berisi sertifikat itu? Atau sebagai alternatif, bagaimana cara memberi tahu program java saya di mana harus mencari keystore?

Setelah menentukan keystore dalam beberapa cara, bagaimana menentukan sertifikat yang digunakan untuk mengotentikasi server ke klien?

deborah
sumber
lebih baik menghindari penggunaan pengaturan System.setProperty (pendekatan di bawah), lihat: docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/… , cara membuat KeyManagerFactory untuk SSLContext
Marek- A-

Jawaban:

111
System.setProperty("javax.net.ssl.trustStore", path_to_your_jks_file);
DaveH
sumber
4
Adakah yang tahu cara merujuk ini pada kotak windows? System.setProperty ("javax.net.ssl.trustStore", "C: \\ Program Files (x86) \\ Java \\ jdk1.7.0_21 \\ jre \\ lib \\ keamanan \\ cacerts"); tidak bekerja untuk saya :(
simgineer
4
Di Windows, pathname yang ditentukan harus menggunakan garis miring ke depan, /, sebagai ganti garis miring terbalik, \.
Droidman
Apakah ini berhasil? Saya menggunakan kode yang sama di mana file 'jks' saya berisi Sertifikat CA. Tapi saya masih mendapatkan javax.xml.ws.WebServiceException: org.apache.axis2.AxisFault: Kesalahan transport: 403 Kesalahan: Kesalahan terlarang saat saya memanggil kode klien melalui stub dihasilkan SOAP. Ada ide?
james2611nov
1
Ada juga properti sistem kata sandi (javax.net.ssl.trustStorePassword). Dapat juga diteruskan sebagai argumen JVM -Djavax.net.ssl.trustStore = clientTrustStore.key -Djavax.net.ssl.trustStorePassword = customPassword Lihat docs.oracle.com/javadb/10.8.3.0/adminguide/cadminsslclient.html
Kingsly
@ james2611nov: Jika Anda mendapatkan kesalahan HTTP 403 (atau respons HTTP lainnya) yang memanggil titik akhir HTTPS, maka itu berarti Anda berhasil melewati pengaturan TLS: interaksi HTTP hanya terjadi setelah saluran TLS diatur ( kalau tidak mereka tidak bisa dilindungi). Jadi - ya, jawaban ini tampaknya berhasil untuk Anda. :-)
ruakh
295

Properti SSL diatur pada level JVM melalui properti sistem. Berarti Anda dapat mengaturnya saat menjalankan program (java -D ....) Atau Anda dapat mengaturnya dalam kode dengan melakukan System.setProperty.

Kunci spesifik yang harus Anda atur adalah di bawah ini:

javax.net.ssl.keyStore - Lokasi file Java keystore yang berisi sertifikat proses pribadi dan kunci pribadi. Di Windows, pathname yang ditentukan harus menggunakan garis miring ke depan, /, sebagai ganti garis miring terbalik.

javax.net.ssl.keyStorePassword - Kata sandi untuk mengakses kunci pribadi dari file keystore yang ditentukan oleh javax.net.ssl.keyStore. Kata sandi ini digunakan dua kali: Untuk membuka kunci file keystore (menyimpan kata sandi), dan Untuk mendekripsi kunci pribadi yang disimpan dalam keystore (kata sandi kunci).

javax.net.ssl.trustStore - Lokasi file Java keystore yang berisi koleksi sertifikat CA yang dipercaya oleh proses aplikasi ini (trust store). Di Windows, pathname yang ditentukan harus menggunakan garis miring ke depan /,, sebagai ganti garis miring terbalik \,.

Jika lokasi toko trust tidak ditentukan menggunakan properti ini, implementasi SunJSSE mencari dan menggunakan file keystore di lokasi berikut (dalam urutan):

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

javax.net.ssl.trustStorePassword - Kata sandi untuk membuka kunci file keystore (kata sandi toko) yang ditentukan oleh javax.net.ssl.trustStore.

javax.net.ssl.trustStoreType - (Opsional) Untuk format file Java keystore, properti ini memiliki nilai jks (atau JKS). Anda biasanya tidak menentukan properti ini, karena nilai defaultnya sudah jks.

javax.net.debug - Untuk mengaktifkan logging untuk layer SSL / TLS, setel properti ini ke ssl.

Karthik Ramachandran
sumber
17
Akan lebih tepat untuk menautkan ke dokumen dari mana ini dikutip. Saya kira inilah dia: fusesource.com/docs/broker/5.3/security/SSL-SysProps.html
Bruno
4
Dokumen resmi harus menjadi Panduan Referensi JSSE: docs.oracle.com/javase/6/docs/technotes/guides/security/jsse/…
aleung
11
Bagi siapa pun yang mungkin ingin mengedit penyimpanan kepercayaan sistem, kata sandi default adalah "changeit": community.oracle.com/thread/1540678?start=0&tstart=0
cwc
+1 untuk prop javax.net.ssl.trustStorePassword. Saya sudah mencari-cari sebentar dan ini yang pertama menyebutkannya.
jgreen
22

Hanya kata-kata peringatan. Jika Anda mencoba untuk membuka keystore JKS yang ada di Java 9 dan seterusnya, Anda perlu memastikan bahwa Anda menyebutkan properti berikut juga dengan nilai sebagai "JKS":

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

Alasannya adalah bahwa tipe keystore default seperti yang ditentukan dalam file java.security telah diubah menjadi pkcs12 dari jks dari Java 9 dan seterusnya.

Sankar Natarajan
sumber
11

Pertama-tama, ada dua jenis keystores.

Individu dan Umum

Aplikasi akan menggunakan yang ditunjukkan dalam startup atau default sistem.

Ini akan menjadi folder yang berbeda jika JRE atau JDK berjalan, atau jika Anda memeriksa yang pribadi atau yang "global".

Mereka juga dienkripsi

Singkatnya, jalannya akan seperti:

$JAVA_HOME/lib/security/cacerts untuk "yang umum", yang memiliki semua CA untuk Otoritas dan sangat penting.

Carlos Garcia
sumber
Jenisnya adalah 'keystore' dan 'truststore'. Tolong jangan menciptakan terminologi yang berlebihan.
Marquis of Lorne
9

Anda juga bisa menyebutkan path saat runtime menggunakan -Dproperti seperti di bawah ini

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

Dalam aplikasi percikan apache saya, saya biasa menyediakan jalur sertifikat dan keystore menggunakan --confopsi dan extraJavaoptionsdalam percikan-kirim seperti di bawah ini

--conf 'spark.driver.extraJavaOptions= 
-Djavax.net.ssl.trustStore=/home/user/SSL/my-cacerts 
-Djavax.net.ssl.keyStore=/home/user/SSL/server_keystore.jks' 
Balakumaran Muralidharan
sumber