Jenis keystore: mana yang akan digunakan?

115

Dengan melihat file java.securitymy JRE, saya melihat bahwa jenis keystore yang digunakan secara default disetel ke JKS. Sini , ada daftar jenis keystore yang bisa digunakan.

Apakah ada jenis keystore yang direkomendasikan? Apa pro / kontra dari berbagai jenis keystore?

Mickael Marrache
sumber
4
Sejak Java 9, PKCS12 adalah jenis keystore default. Perubahan ini sesuai dengan tujuan JEP 229: "Meningkatkan keamanan. PKCS12 menawarkan algoritme kriptografi yang lebih kuat daripada JKS." Untuk info selengkapnya, lihat "JEP 229: Membuat Keystore PKCS12 Secara Default", openjdk.java.net/jeps/229 ; terakhir diakses 2 Feb 2018.
buzz3791

Jawaban:

142

Ada beberapa jenis lebih banyak dari yang tercantum dalam daftar nama standar yang Anda tautkan. Anda dapat menemukan lebih banyak di dokumentasi penyedia kriptografi . Yang paling umum adalah JKS(default) dan PKCS12(untuk file PKCS # 12, seringkali dengan ekstensi .p12atau kadang-kadang .pfx).

JKS adalah yang paling umum jika Anda tinggal di dunia Jawa. PKCS # 12 tidak khusus untuk Java, sangat nyaman menggunakan sertifikat (dengan kunci pribadi) yang dicadangkan dari browser atau berasal dari alat berbasis OpenSSL ( keytooltidak dapat mengonversi keystore dan mengimpor kunci pribadinya sebelum Java 6 , jadi Anda harus menggunakan alat lain).

Jika Anda sudah memiliki file PKCS # 12, seringkali lebih mudah untuk menggunakan PKCS12tipe secara langsung. Anda dapat mengonversi format, tetapi jarang diperlukan jika Anda dapat memilih jenis keystore secara langsung.

Di Java 7, PKCS12berguna terutama sebagai keystore tetapi lebih sedikit untuk truststore (lihat perbedaan antara keystore dan truststore ), karena Anda tidak dapat menyimpan entri sertifikat tanpa kunci pribadi. Sebaliknya, JKStidak mengharuskan setiap entri menjadi entri kunci privat, sehingga Anda dapat memiliki entri yang hanya berisi sertifikat, yang berguna untuk toko kepercayaan, tempat Anda menyimpan daftar sertifikat yang Anda percayai (tetapi Anda tidak memiliki kunci pribadi untuk mereka).

Ini telah berubah di Java 8, jadi Anda sekarang dapat memiliki entri khusus sertifikat di PKCS12toko juga. (Rincian lebih lanjut tentang perubahan ini dan rencana lebih lanjut dapat ditemukan di JEP 229: Membuat Keystore PKCS12 secara Default .)

Ada beberapa jenis keystore lain, yang mungkin lebih jarang digunakan (bergantung pada konteksnya), yang meliputi:

  • PKCS11, untuk pustaka PKCS # 11, biasanya untuk mengakses token kriptografi perangkat keras, tetapi implementasi penyedia Sun juga mendukung penyimpanan NSS (dari Mozilla) melalui ini.
  • BKS, menggunakan penyedia BouncyCastle (biasanya digunakan untuk Android).
  • Windows-MY/ Windows-ROOT, jika Anda ingin mengakses penyimpanan sertifikat Windows secara langsung.
  • KeychainStore, jika Anda ingin menggunakan keychain OSX secara langsung.
Bruno
sumber
7
@husayt, sertifikat PEM tidak didukung secara langsung sebagai jenis keystore (saya kira seseorang dapat menulis KeyStoreimplementasi untuk efek tersebut). Namun Anda dapat memuatnya dengan cepat ke dalam instance keystore (biasanya JKS, tipe default) dalam memori menggunakan CertificateFactory(seperti yang ditunjukkan dalam jawaban ini ).
Bruno
saya pikir JKStelah berubah menjadiJCEKS
amfibi
5
Agak kritis, penyimpanan kunci JKS tidak dapat menyimpan kunci rahasia. Untuk kasus penggunaan ini, JCEKS sesuai. Mungkin ada baiknya menyebutkan ini dalam jawaban Anda.
Duncan Jones
1
Baik. Di Java 8 saya dapat membuat keystore PKCS # 12 dengan satu sertifikat tanpa masalah apa pun. Perhatikan bahwa untuk entri sertifikat P12 dipercaya secara implisit. Jika Anda membutuhkan sertifikat tidak tepercaya, Anda mungkin harus kembali ke skema dengan beberapa penyimpanan kunci.
Maarten Bodewes
2
OK setidaknya untuk penyimpanan kunci Java 8 PKCS # 12 masih tidak dapat menyimpan entri kunci rahasia . Anda akan mendapatkan pengecualian pointer nol saat menyimpan penyimpanan kunci semacam itu (ugh), mungkin karena sertifikat terkait tidak dapat ditemukan. Seseorang tampaknya melewatkan ajaran Yosua tentang kode cepat gagal.
Maarten Bodewes
22

Berikut adalah posting yang memperkenalkan berbagai jenis keystore di Java dan perbedaan di antara berbagai jenis keystore. http://www.pixelstech.net/article/1408345768-Different-types-of-keystore-in-Java----Overview

Di bawah ini adalah deskripsi keystore yang berbeda dari postingan:

JKS, Penyimpanan Kunci Java. Anda dapat menemukan file ini di sun.security.provider.JavaKeyStore. Keystore ini khusus untuk Java, biasanya memiliki ekstensi jks. Jenis keystore ini dapat berisi kunci pribadi dan sertifikat, tetapi tidak dapat digunakan untuk menyimpan kunci rahasia. Karena ini adalah keystore khusus Java, jadi tidak bisa digunakan dalam bahasa pemrograman lain.

JCEKS, penyimpanan kunci JCE. Anda dapat menemukan file ini di com.sun.crypto.provider.JceKeyStore. Keystore ini memiliki ekstensi jceks. Entri yang dapat dimasukkan ke dalam keystore JCEKS adalah kunci pribadi, kunci rahasia, dan sertifikat.

PKCS12, ini adalah jenis keystore standar yang dapat digunakan di Java dan bahasa lain. Anda dapat menemukan implementasi keystore ini di sun.security.pkcs12.PKCS12KeyStore. Biasanya memiliki ekstensi p12 atau pfx. Anda dapat menyimpan kunci privat, kunci rahasia dan sertifikat pada jenis ini.

PKCS11, ini adalah jenis keystore perangkat keras. Ini server antarmuka untuk perpustakaan Java untuk terhubung dengan perangkat keystore perangkat keras seperti Luna, nCipher. Anda dapat menemukan implementasi ini di sun.security.pkcs11.P11KeyStore. Saat memuat keystore, Anda tidak perlu membuat penyedia khusus dengan konfigurasi tertentu. Keystore ini dapat menyimpan private key, secret key dan cetrificates. Saat memuat keystore, entri akan diambil dari keystore dan kemudian diubah menjadi entri perangkat lunak.

PixelsTech
sumber
@ peci1 Saya telah merencanakan untuk menulis beberapa tutorial tentang cara menggunakan keystore ini. Sejauh ini saya telah menulis satu posting untuk JKS, silakan temukan di pixelstech.net/article/…
PixelsTech
@PixelsTech Saya telah menemukan ini dan bertanya-tanya di mana sisanya :) Jadi saya akan tetap disini;) Terima kasih
Martin Pecka
1
@ peci1 Saya telah meliput JCEKS dan PKCS12 hari ini. Untuk PKCS11, ini melibatkan hardware dan konfigurasi ekstra, membutuhkan lebih banyak waktu untuk membuatnya. pixelstech.net/article/… dan pixelstech.net/article/…
PixelsTech
Wow, itu kecepatan kilat! Terima kasih banyak.
Martin Pecka
5

Jika Anda menggunakan Java 8 atau yang lebih baru, Anda pasti harus memilih PKCS12, default sejak Java 9 ( JEP 229 ).

Keunggulannya dibandingkan JKSdan JCEKSadalah:

  • Kunci rahasia, kunci privat dan sertifikat dapat disimpan
  • PKCS12adalah format standar, dapat dibaca oleh program dan perpustakaan lain 1
  • Keamanan yang ditingkatkan: JKSdan JCEKScukup tidak aman. Hal ini dapat dilihat dari jumlah alat untuk brute forcing password dari jenis keystore ini, terutama yang populer di kalangan developer Android. 2, 3

1 Ada JDK-8202837 , yang telah diperbaiki di Jawa 11

2 Jumlah iterasi untuk PBE yang digunakan oleh semua jenis keystore (termasuk PKCS12) biasanya agak mingguan ( CVE-2017-10356 ), namun hal ini telah diperbaiki di 9.0.1, 8u151, 7u161, dan 6u171

3 Untuk bacaan lebih lanjut:

Marcono 1234
sumber