Trust Store vs Key Store - keytool ile oluşturma


249

Anahtar deposunun genellikle özel / genel anahtarları ve güven deposunun yalnızca ortak anahtarları tutacağını anlıyorum (ve iletişim kurmak istediğiniz güvenilir tarafların listesini temsil ediyor). Bu benim ilk varsayımım, eğer bu doğru değilse, muhtemelen çok iyi başlamamıştım ...

Keytool kullanırken mağazaları nasıl / ne zaman ayırdığınızı anlamakla ilgileniyordum.

Şimdiye kadar kullanarak bir anahtar deposu oluşturdum

keytool -import -alias bob -file bob.crt -keystore keystore.ks

Bu benim keystore.ks dosyamı oluşturur. yesBob'a güveniyorum sorusuna cevap veriyorum ama bu bir anahtar deposu dosyası mı yoksa bir truststore dosyası mı oluşturduysa net değil mi? Uygulamamı dosyayı da kullanacak şekilde ayarlayabilirim.

-Djavax.net.ssl.keyStore=keystore.ks -Djavax.net.ssl.keyStorePassword=x
-Djavax.net.ssl.trustStore=keystore.ks -Djavax.net.ssl.trustStorePassword=x

ve System.setProperty( "javax.net.debug", "ssl")set ile sertifikayı güvenilir sertifikalar altında görebilirim (ancak anahtar deposu bölümü altında değil). İçe aktardığım sertifikanın sadece ortak bir anahtarı var ve bunu Bob'a bir SSL bağlantısı üzerinden bir şeyler göndermek için kullanmayı düşünüyorum (ama belki de en iyisi başka bir soru için kaldı!).

Herhangi bir işaretçi veya açıklama çok takdir edilecektir. Keytool'un çıktısı, ne içe aktarırsanız aktarılsın ve bir anahtar deposu diğeri bir güven deposu olduğunu söyleyen tek kural mı? SSL vb. Kullanırken ilişki nedir?


"İçe aktardığım sertifikanın yalnızca ortak bir anahtarı var" ile ne demek istediğinden emin değilim: bu sadece ortak bir anahtar (yani bir sertifika değil) veya CA olmayan bir sertifika mı?
Bruno

hmmm, emin değilim. Tarayıcımdan PEM dosyası olarak dışa aktardım. Bu yardımcı olur mu?
Toby

Tarayıcıdan dışa aktarılırsa, muhtemelen bir sertifikadır. Bir sunucu sertifikası mı (sunucunun adıyla eşleşen bir CN veya SubjectAltName ile)? Bir CA sertifikası mı (Temel Kısıtlamalar'ın altına bakın, bunu tarayıcınızı kullanarak görebilmeniz gerekir).
Bruno

2
tl; dr: güven depoları genel, güvenilir, kök (CA) sertifikaları içerirken, kimlik / anahtar depoları özel, kimlik sertifikaları içerir; ancak dosya açısından aynıdır.
Andrew

Yanıtlar:


346

Terminoloji gerçekten biraz kafa karıştırıcıdır, ancak her ikisi de javax.net.ssl.keyStoreve javax.net.ssl.trustStorehangi anahtar depolarının iki farklı amaç için kullanılacağını belirtmek için kullanılır. Anahtar depoları çeşitli biçimlerde gelir ve hatta dosya olması gerekmez ( bu soruya bakın ) ve keytoolbunlar üzerinde çeşitli işlemleri gerçekleştirmek için bir araçtır (import / export / list / ...).

javax.net.ssl.keyStorevejavax.net.ssl.trustStore parametreleri yapı için kullanılan varsayılan parametrelerdir KeyManagerlar ve TrustManagers (sırasıyla), sonra bir oluşturmak için kullanılan SSLContextbir üzeri / TLS bağlantısı bir SSL yaparken esasen kullanımına SSL / TLS ayarlarını içeren SSLSocketFactoryveya bir SSLEngine. Bu sistem özellikleri, varsayılan değerlerin nereden geldiği, örneğin SSLContext.getDefault()kendisi tarafından kullanılan değerlerdir SSLSocketFactory.getDefault(). (Varsayılan değerleri ve belirli SSLContextbir amacı belirli bir amaç için kullanmak istemiyorsanız, bunların tümü API aracılığıyla birkaç yerde özelleştirilebilir .)

Arasındaki fark KeyManager ile TrustManager(ve dolayısıyla arasında javax.net.ssl.keyStoreve javax.net.ssl.trustStore(alıntı) aşağıdaki gibi olan JSSE ref kılavuz ):

TrustManager: Uzaktan kimlik doğrulama bilgilerine (ve dolayısıyla bağlantıya) güvenilip güvenilmeyeceğini belirler.

KeyManager: Uzak ana bilgisayara hangi kimlik doğrulama bilgilerinin gönderileceğini belirler.

(Diğer parametreler mevcuttur ve varsayılan değerleri JSSE başvuru kılavuzunda açıklanmıştır . Güven deposu için varsayılan bir değer olsa da, anahtar deposu için bir tane olmadığını unutmayın.)

Temelde, anahtar deposunun javax.net.ssl.keyStoreözel anahtarlarınızı ve sertifikalarınızı javax.net.ssl.trustStoreiçermesi, uzak bir tarafın sertifikasını sunması durumunda güvenmek istediğiniz CA sertifikalarını içermesi amaçlanmıştır. Bazı durumlarda, bir ve aynı mağaza olabilirler, ancak farklı mağazalar kullanmak özellikle daha iyi bir uygulamadır (özellikle dosya tabanlı olduklarında).


cevap için teşekkürler, biraz şeyleri temizler. Kullanım söz konusu olduğunda hala kafam karıştı, bir anahtar deposu olarak (-D) bir pk12 pri / pub anahtarı (xxx.p12) kullanabilir ve bir truststore'dan bahsetmeden bir SSL bağlantısı (güvenilir) oluşturabilirim - D ... oh güzel.
Toby

57
Bir truststore belirtmeniz gerekmez, çünkü bunun için varsayılan bir değer vardır (JRE ile birlikte gelir), genellikle $JAVA_HOME/lib/security/cacerts(Gönderdiğim 2. JSSE başvuru kılavuzu bağlantısı). Tarayıcılar gibi, varsayılan bir dizi güvenilir CA sertifikası içerir. Genel olarak, bir istemci sunucu sertifikasını kontrol etmek için her zaman bir güven deposunu kullanır, ancak anahtar deposu yalnızca sunucu bir istemci sertifikası isterse kullanılır ve sunucu her zaman kendi anahtar + sertifikası için bir anahtar deposu kullanır, ancak güven deposu yalnızca istemci bir istemci sertifikası gönderirse kullanılır.
Bruno

2
Yararlı bilgiler için teşekkürler. Weblogic'te, sunucunun SSL sertifikasını saklayan "kimlik anahtarı deposu" ve ardından sunucunun güvendiği SSL sertifikalarını depolayan "trust-key-store" vardır, bu yüzden "kimlik anahtarı" -store "bir" anahtar deposu "ve" trust-key-store "dan başka bir şey" truststore "dan başka bir şey değil mi?
hagrawal

@Bruno ayrıca bir "jssecacerts" olduğunda "cacerts" ın göz ardı edildiğini de not etmeliyiz?
kommradHomer

61

Ortak kullanım / amaç veya layman yöntemiyle açıklamak için:

truststore : Adından da anlaşılacağı gibi, normalde güvenilen varlıkların sertifikalarını saklamak için kullanılır. Bir süreç, güvendiği tüm güvenilir taraflarının sertifika deposunu saklayabilir.

keyStore : Sunucu anahtarlarını (hem genel hem de özel) imzalı sertifika ile birlikte saklamak için kullanılır.

SSL anlaşması sırasında,

  1. Bir istemci https: // adresine erişmeye çalışır

  2. Ve böylece, Sunucu bir SSL sertifikası (keyStore'da depolanır) sağlayarak yanıt verir

  3. Şimdi, istemci SSL sertifikasını alır ve trustStore aracılığıyla doğrular (yani, müşterinin trustStore'u zaten güvendiği önceden tanımlanmış sertifika kümesine sahiptir.) Bunun gibi: Bu sunucuya güvenebilir miyim? Bu, konuşmaya çalıştığım sunucuyla aynı mı? Orta adam saldırısı yok mu?

  4. İstemci, güvendiği sunucu ile konuştuğunu doğrularsa, paylaşılan bir gizli anahtar üzerinden SSL iletişimi gerçekleşebilir.

Not: Burada sunucu tarafında istemci kimlik doğrulaması hakkında hiçbir şey konuşmuyorum. Bir sunucu da istemci kimlik doğrulaması yapmak istiyorsa, sunucu aynı zamanda istemciyi doğrulamak için bir trustStore tutar.


25

Anahtar deposu ve güven deposu dosyaları arasında fark yoktur. Her ikisi de tescilli JKS dosya biçimindeki dosyalardır. Ayrım kullanımda: Bildiğim kadarıyla Java, -Djavax.net.ssl.trustStoreSSL bağlantıları oluştururken güvenilecek sertifikaları aramak için yalnızca sistem özelliği tarafından başvurulan mağazayı kullanacaktır . Ve tuşları için aynı -Djavax.net.ssl.keyStore. Ancak teoride, bir ve aynı dosyayı güven ve anahtar depoları için kullanmak iyidir.


4
javax.net.ssl.keyStoreTypeVe javax.net.ssl.trustStoreTypesistem özelliklerini ayarlayarak farklı anahtar deposu türleri (örn. PKCS12) kullanabilirsiniz .
Donal Fellows

1
@Donal: İyi katkı. Desteklenen tüm kapların bir listesi olup olmadığını biliyor musunuz? Sadece PKCS12 ve JKS'i biliyorum (eski deneme yanılma sonucu ...).
musiKk

2
anahtar deposu biçimleri kullanılabilir sağlayıcılara bağlı olarak değişir ( varsayılan olarak Oracle JRE ile birlikte gelenler için bu listeye bakın ). Bu soruda da bir tartışma vardı . Diğer sağlayıcılar (örn. BouncyCastle) diğer formatlar için kullanılabilir.
Bruno

21

Anahtar deposu, özel anahtarları saklamak için bir sunucu tarafından kullanılır ve Truststore, üçüncü taraf istemci tarafından, sunucunun erişmesi için sağlanan genel anahtarları saklamak için kullanılır. Bunu üretim uygulamamda yaptım. SSL iletişimi için java sertifikaları oluşturma adımları aşağıdadır:

  1. Windows'ta keygen komutunu kullanarak sertifika oluşturun:

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

  1. Sertifikayı kendiniz onaylayın:

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

  1. Sertifikayı klasöre aktar:

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

  1. Sertifikayı istemci Truststore'a aktar:

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


Merhaba, aynı kapsayıcıda (tomcat) iki farklı uygulamamın olduğu bir senaryom var. Her iki uygulamadan, geri kalan uç noktaları her iki taraftan da her uygulamaya çağırmak zorundayım. A'dan B'ye ve B'den A'ya (A ve B iki uygulamadır). Bu senaryoda truststore'u kullanmam gerekir mi? Anahtar deposu kullanan özel dinlenme istemcisi kullanıyorum gibi. Lütfen önerin.
Deepak

0

Bunlar, Keytool'u kullanarak yerel makinenizde bir Truststore oluşturma adımlarıdır. Yerel makinenizde bir URL için güven deposu oluşturma adımları.

1) Chrome'da tarayıcıdaki URL'ye basın

2) "i" olup olmadığını kontrol edin Kromdaki URL'nin solundaki simgesini ve tıklayın

3) Sertifika seçeneğini kontrol edin ve tıklayın; bir İletişim Kutusu açılacaktır

4) güven deposunu oluşturmak için kullanılabilecek sertifika sayısı için "sertifika yolu" sekmesini kontrol edin

5) "details" tab -> click"Copy to File" -> Give the path and the name for the certificateoluşturmak istediğiniz gidin .

6) Ana sertifika olup olmadığını kontrol edin ve "5" noktasını takip edin .

7) Tüm sertifikalar oluşturulduktan sonra Komut İstemi'ni açın ve sertifikaları oluşturduğunuz yola gidin.

8) sertifikaları eklemek ve bir güven deposu oluşturmak için aşağıdaki Keytool komutunu verin.

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) Tüm sertifikalar için keytool komutunu sağlayın ve bunları güven deposuna ekleyin.

    keytool -list -v -keystore cacerts

-1

anahtar deposu sadece özel anahtarları depolar, wheras truststore genel anahtarları saklar. SSL iletişimi için bir java sertifikası oluşturmak isteyeceksiniz. Windows'da bir keygen komutu kullanabilirsiniz, bu muhtemelen en kolay çözüm olacaktır.


Bir truststore güvenilir sertifikaları
Lorne Marquis

-1

En basit ifadeyle:

Anahtar deposu, kimlik bilgilerinizi (sunucu veya istemci) saklamak için kullanılırken truststore , diğer kimlik bilgilerini (CA'dan gelen sertifikalar) saklamak için kullanılır.

SSL'de sunucu tarafı kurarken anahtar deposu gerekir, sunucunun kimlik sertifikasını depolamak için kullanılır; bu, bağlantının çalışması için istemci tarafında güven deposu kurulumunun içermesi gerekirken, hangi sunucu bağlantıda bir istemciye sunulacaktır. SSL üzerinden herhangi bir web sitesine bağlanmak için tarayıcınız, sunucu tarafından truststore'a karşı sunulan sertifikayı doğrular.

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.