Anahtar deposu türü: hangisi kullanılmalı?


115

java.securityMy dosyasına baktığımda, JREvarsayılan olarak kullanılacak anahtar deposu türünün olarak ayarlandığını görüyorum JKS. Burada , kullanılabilecek anahtar deposu türlerinin bir listesi vardır.

Önerilen bir anahtar deposu türü var mı? Farklı anahtar deposu türlerinin artıları / eksileri nelerdir?


4
Java 9'dan beri, PKCS12 varsayılan anahtar deposu türüdür. Bu değişiklik JEP 229 hedefine yöneliktir: "Güvenliği geliştirin. PKCS12, JKS'den daha güçlü şifreleme algoritmaları sunar." Daha fazla bilgi için bkz. "JEP 229: Varsayılan Olarak PKCS12 Anahtar Depoları Oluşturun", openjdk.java.net/jeps/229 ; en son 2 Şubat 2018'de erişildi.
buzz3791

Yanıtlar:


142

Bağlandığınız standart ad listesinde listelenenden birkaç tür daha var. Kriptografik sağlayıcıların belgelerinde daha fazlasını bulabilirsiniz . En yaygın olanları kesinlikle JKS(varsayılan) ve PKCS12(PKCS # 12 dosyaları için, genellikle uzantı ile .p12veya bazen .pfx).

Java dünyasında kalırsanız en yaygın olanı JKS'dir. PKCS # 12, Java'ya özgü değildir, bir tarayıcıdan yedeklenen veya OpenSSL tabanlı araçlardan gelen sertifikaları (özel anahtarlarla) kullanmak özellikle uygundur ( keytoolJava 6'dan önce bir anahtar deposunu dönüştüremedi ve özel anahtarlarını içe aktaramadı) , yani diğer araçları kullanmak zorundaydınız).

Zaten bir PKCS # 12 dosyanız varsa, PKCS12türü doğrudan kullanmak genellikle daha kolaydır . Biçimleri dönüştürmek mümkündür, ancak anahtar deposu türünü doğrudan seçebiliyorsanız nadiren gereklidir.

Java 7'de, PKCS12temelde bir anahtar deposu olarak yararlıydı, ancak bir güven deposu için daha azdı ( bir anahtar deposu ile güven deposu arasındaki farka bakın ), çünkü sertifika girişlerini özel bir anahtar olmadan saklayamazsınız. Buna karşılık, JKSher bir girişin özel bir anahtar girişi olmasını gerektirmez, böylece yalnızca sertifikaları içeren girişlere sahip olabilirsiniz, bu da güven depoları için yararlıdır ve güvendiğiniz sertifikaların listesini sakladığınız (ancak sahip olmadığınız) onlar için özel anahtar).

Bu Java 8'de değişti, böylece artık PKCS12mağazalarda yalnızca sertifika girişlerine sahip olabilirsiniz . (Bu değişiklikler ve diğer planlar hakkında daha fazla ayrıntı JEP 229: Varsayılan olarak PKCS12 Anahtar Depoları Oluşturma bölümünde bulunabilir .)

Belki daha az sıklıkla kullanılan (bağlama bağlı olarak) birkaç başka anahtar deposu türü vardır, bunlar şunları içerir:

  • PKCS11, PKCS # 11 kitaplıkları için, tipik olarak donanım şifreleme belirteçlerine erişim içindir, ancak Sun sağlayıcı uygulaması bununla NSS depolarını da (Mozilla'dan) destekler.
  • BKSBouncyCastle sağlayıcısını kullanarak (genellikle Android için kullanılır).
  • Windows-MYWindows-ROOTWindows sertifika deposuna doğrudan erişmek istiyorsanız / .
  • KeychainStore, doğrudan OSX anahtar zincirini kullanmak istiyorsanız.

7
@husayt, PEM sertifikaları anahtar deposu türleri olarak doğrudan desteklenmez (sanırım KeyStorebu etki için bir uygulama yazabilir ). Bununla birlikte, bunları bir anahtar deposu örneğine (tipik olarak JKS, varsayılan tür) bir kullanarak CertificateFactory( bu yanıtta gösterildiği gibi ) anında yükleyebilirsiniz .
Bruno

bence JKSdeğiştiJCEKS
amphibient

5
Daha kritik bir şekilde, bir JKS anahtar deposu gizli anahtarları saklayamaz. Bu kullanım durumu için JCEKS uygundur. Cevabınızda bundan bahsetmeye değer olabilir.
Duncan Jones

1
Tamam. Java 8'de tek bir sertifika ile herhangi bir sorun olmadan PKCS # 12 anahtar deposu oluşturabilirim. P12 sertifika girişlerine dolaylı olarak güvenildiğini unutmayın. Güvenilmeyen sertifikalara ihtiyacınız varsa, birden çok anahtar deposu olan bir plana geri dönmeniz gerekebilir.
Maarten Bodewes

2
Tamam, en azından Java 8 için PKCS # 12 anahtar depoları hala gizli anahtar girişlerini saklayamıyor . Böyle bir anahtar deposunu (ugh) saklarken, muhtemelen ilişkili sertifikaları bulamadığı için boş bir işaretçi istisnası alırsınız. Görünüşe göre birisi Joshua'nın başarısız hızlı kod hakkındaki öğretilerini atlamış.
Maarten Bodewes

22

İşte Java'da farklı anahtar deposu türlerini ve farklı anahtar deposu türleri arasındaki farkları tanıtan bir gönderi. http://www.pixelstech.net/article/1408345768-Different-types-of-keystore-in-Java----Overview

Aşağıda, gönderideki farklı anahtar depolarının açıklamaları bulunmaktadır:

JKS, Java Anahtar Deposu. Bu dosyayı sun.security.provider.JavaKeyStore'da bulabilirsiniz. Bu anahtar deposu Java'ya özeldir, genellikle jks uzantısına sahiptir. Bu tür anahtar deposu, özel anahtarlar ve sertifikalar içerebilir, ancak gizli anahtarları depolamak için kullanılamaz. Java'ya özgü bir anahtar deposu olduğundan, diğer programlama dillerinde kullanılamaz.

JCEKS, JCE anahtar deposu. Bu dosyayı com.sun.crypto.provider.JceKeyStore adresinde bulabilirsiniz. Bu anahtar deposu jceks uzantısına sahiptir. JCEKS anahtar deposuna konulabilen girişler özel anahtarlar, gizli anahtarlar ve sertifikalardır.

PKCS12, bu Java ve diğer dillerde kullanılabilen standart bir anahtar deposu türüdür. Bu anahtar deposu uygulamasını sun.security.pkcs12.PKCS12KeyStore adresinde bulabilirsiniz. Genellikle p12 veya pfx uzantısına sahiptir. Bu tipte özel anahtarlar, gizli anahtarlar ve sertifikalar saklayabilirsiniz.

PKCS11, bu bir donanım anahtar deposu türüdür. Luna, nCipher gibi donanım anahtar deposu cihazlarına bağlanmak için Java kitaplığı için bir arayüz sunar. Bu uygulamayı sun.security.pkcs11.P11KeyStore adresinde bulabilirsiniz. Anahtar deposunu yüklediğinizde, belirli bir yapılandırmaya sahip belirli bir sağlayıcı oluşturmanız gerekmez. Bu anahtar deposu özel anahtarları, gizli anahtarları ve şifreleri depolayabilir. Anahtar deposunu yüklerken, girişler anahtar deposundan alınır ve ardından yazılım girişlerine dönüştürülür.


@ peci1 Bu anahtar depolarının nasıl kullanılacağına dair bazı öğreticiler yazmayı planladım. Şimdiye kadar JKS için bir gönderi yazdım, lütfen bunu pixelstech.net/article/…
PixelsTech

@PixelsTech Bunu buldum ve diğerlerinin nerede olduğunu merak ediyordum :) Bu yüzden bizi izlemeye devam edeceğim;) Teşekkürler
Martin Pecka

1
@ peci1 Bugün JCEKS ve PKCS12'yi ele aldım. PKCS11 için, donanım ve ekstra yapılandırma içerir, onu oluşturmak için daha fazla zaman gerekir. pixelstech.net/article/… ve pixelstech.net/article/…
PixelsTech

Vay canına, bu bir yıldırım hızı! Çok teşekkürler.
Martin Pecka

5

Java 8 veya daha yenisini kullanıyorsanız,PKCS12 Java 9'dan ( JEP 229 ) beri varsayılanı kesinlikle seçmelisiniz .

Kıyasla avantajları JKSve JCEKSşunlardır:

  • Gizli anahtarlar, özel anahtarlar ve sertifikalar saklanabilir
  • PKCS12standart bir formattır, diğer programlar ve kütüphaneler tarafından okunabilir 1
  • Gelişmiş güvenlik: JKSve JCEKSoldukça güvensiz. Bu, özellikle Android geliştiricileri arasında popüler olan bu anahtar deposu türlerinin şifrelerini kaba zorlayan araçların sayısından görülebilir. 2, 3

1 yoktur JDK-8202837 , Java 11'de düzeltildi

2 Tüm anahtar deposu türleri (PKCS12 dahil) tarafından kullanılan PBE için yineleme sayısı daha ziyade haftalardı ( CVE-2017-10356 ), ancak bu 9.0.1, 8u151, 7u161 ve 6u171'de düzeltildi

3 Daha fazla okumak için:

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.