Java anahtar deposuna bir .cer sertifikası nasıl alınır?


226

Bir Java webservice istemcisinin geliştirilmesi sırasında bir sorunla karşılaştım. Web hizmeti için kimlik doğrulaması bir istemci sertifikası, kullanıcı adı ve parola kullanıyor. Web servisinin arkasındaki şirketten aldığım istemci sertifikası .cerformatta. Bir metin düzenleyicisi kullanarak dosyayı incelediğimde, aşağıdaki içeriğe sahiptir:

-----BEGIN CERTIFICATE-----
[Some base64 encoded data]
-----END CERTIFICATE-----

Bu dosyayı Internet Explorer'da (parola girmek zorunda kalmadan!) Sertifika olarak alabilir ve web hizmetiyle kimlik doğrulaması yapmak için kullanabilirim.

Bu sertifikayı önce ilk ve son satırı sıyrılarak, unix satırlarına dönüştürerek ve base64-decode çalıştırarak bir anahtar deposuna aktarabildim. Ortaya çıkan dosya bir anahtar deposuna alınabilir ( keytoolkomut kullanılarak). Anahtar deposundaki girdileri listelediğimde, bu girdi türündedir trustedCertEntry. Bu girdi türü (?) Nedeniyle, web hizmetiyle kimlik doğrulamak için bu sertifikayı kullanamıyorum. Sağlanan sertifikanın kimlik doğrulama için kullanılan genel bir sertifika olduğunu düşünmeye başlıyorum ...

Bulduğum bir geçici çözüm, sertifikayı IE'ye almak ve bir .pfxdosya olarak vermek. Bu dosya bir anahtar deposu olarak yüklenebilir ve web hizmetiyle kimlik doğrulaması yapmak için kullanılabilir. Ancak, müşterilerimin her yeni sertifika aldıklarında bu adımları gerçekleştirmelerini bekleyemem. Bu yüzden .cerdosyayı doğrudan Java'ya yüklemek istiyorum . Düşüncesi olan var mı?

Ek bilgi: Web servisinin arkasındaki şirket, sertifikanın bilgisayardan ve kullanıcıdan daha sonra içe aktaracak olan kullanıcıdan (IE ve web sitesi kullanılarak) talep edilmesi gerektiğini söyledi.

Yanıtlar:


317
  • Kimlik doğrulaması yapmak istiyorsanız özel anahtara ihtiyacınız vardır - başka bir seçenek yoktur.
  • Sertifika, ekli özelliklerin doğru olduğunu garanti eden bazı Sertifika yetkilileri tarafından imzalanmış ek özelliklere (şirket adı, ülke, ... gibi) sahip ortak bir anahtardır.
  • .CERdosyalar sertifikalardır ve özel anahtarı yoktur. Özel anahtar .PFX keystorenormalde bir dosya ile sağlanır . Gerçekten kimlik doğrulaması yaptıysanız, özel anahtarı zaten içe aktarmış olmanızdır.
  • Normalde .CERsertifikaları sorunsuz bir şekilde içe aktarabilirsiniz

    keytool -importcert -file certificate.cer -keystore keystore.jks -alias "Alias" 

3
Özel anahtar IE için bir eklenti tarafından üretiliyor. Şimdilik tek çözüm IE'de sertifikayı içe aktarmak ve bir .pfx dosyasını dışarı aktarmaktır.
Jan-Pieter

5
.CER dosyalarında ortak anahtar var. Özel anahtarları yok. Düzenlemeyi önerin ..
KyleM

6
-Alias ​​burada ne yapar?
hop

5
:( -> keytool hatası: java.lang.Exception: X.509 sertifikası değil
büyücü

1
@hop Bir java anahtar deposunda, tanımlamak için her biri farklı bir takma adla birden çok sertifika bulunabilir. Referans olarak tanımlamak ve / veya takma adla programlı olarak almak için kullanabilirsiniz.
lujop

85

.cerTarayıcıdan indirilen sertifika dosyasını içe aktarma (url'yi açın ve ayrıntılar için kazın) kendi anahtar deposumujava_home\jre\lib\security oluşturma ve kullanma girişimlerinin aksine benim için çalışmış olan cacerts anahtar deposuna aktarıldı .

  1. Adresine git java_home\jre\lib\security
  2. ( Windows ) cmdve CTRL+ SHIFT+ tuşlarını kullanarak yönetici komut satırını orada açınENTER
  3. Sertifikayı içe aktarmak için keytool'u çalıştırın:
    • (Değiştirin yourAliasNameve path\to\certificate.cersırasıyla)

 ..\..\bin\keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias yourAliasName -file path\to\certificate.cer

Bu şekilde herhangi bir ek JVM seçeneği belirtmeniz gerekmez ve sertifika JRE tarafından tanınmalıdır.


için \ sertifika yolu \. Dosyam masaüstündeyse nasıl yönlendirebilirim? C: / kullanıcı / masaüstü / veya ../../../../desktop/filename
Jesse

MacOS / Linux'ta bu komut sudo ile çalışır. Teşekkürler. ama noprompt param nedir? Ben kullanmadım ve hala başarılı oldum.
Evgeniy Mishustin

JDK'yı geliştirme için kullanırken, java_home\jdk_x.xx\jre\lib\security mutlak yol için ters eğik çizgi kullanın, örn "C:\myCert.crt". Yol boşluk içermiyorsa , tırnak işaretleri isteğe bağlıdır.
jp-jee

Milyonlarca kez teşekkürler.
vikingsteve

Soru: Özel anahtar ne olacak? Tartışma istemci sertifikaları hakkındadır. Anladığım kadarıyla, özel anahtarlı bir CSR oluşturmanız, ardından uzak web sitesi şirketinden bir istemci sertifikası alması ve daha sonra istemci sertifikasını özel anahtarla eşleştirmesi gerekir. Cevabınız özel anahtar hakkında hiçbir şeyden bahsetmiyor gibi görünüyor. Sadece soruyorum.
user2367418

51

İşte .cer dosyalarını yeni bir KeyStore'a programlı olarak aktarmak için kullandığım kod.

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
//VERY IMPORTANT.  SOME OF THESE EXIST IN MORE THAN ONE PACKAGE!
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;

//Put everything after here in your function.
KeyStore trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null);//Make an empty store
InputStream fis = /* insert your file path here */;
BufferedInputStream bis = new BufferedInputStream(fis);

CertificateFactory cf = CertificateFactory.getInstance("X.509");

while (bis.available() > 0) {
    Certificate cert = cf.generateCertificate(bis);
    trustStore.setCertificateEntry("fiddler"+bis.available(), cert);
}

20

Sertifikada herhangi bir değişiklik yapmanız gerekmez. Doğru içe aktarma komutunu çalıştırdığınızdan emin misiniz?

Aşağıdakiler benim için çalışıyor:

keytool -import -alias joe -file mycert.cer -keystore mycerts -storepass changeit

burada mycert.cer şunları içerir:

-----BEGIN CERTIFICATE-----
MIIFUTCCBDmgAwIBAgIHK4FgDiVqczANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
BhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAY
...
RLJKd+SjxhLMD2pznKxC/Ztkkcoxaw9u0zVPOPrUtsE/X68Vmv6AEHJ+lWnUaWlf
zLpfMEvelFPYH4NT9mV5wuQ1Pgurf/ydBhPizc0uOCvd6UddJS5rPfVWnuFkgQOk
WmD+yvuojwsL38LPbtrC8SZgPKT3grnLwKu18nm3UN2isuciKPF2spNEFnmCUWDc
MMicbud3twMSO6Zbm3lx6CToNFzP
-----END CERTIFICATE-----

2
Değiştirilmemiş sertifikayı anahtar deposuna almaya çalıştığımda "keytool error: java.lang.Exception: Bir X.509 sertifikası değil" hatasını alıyorum. Sertifikayı yazımda açıkladığım şekilde değiştirdikten sonra, sertifikayı sizinkine benzer bir komutla hatasız olarak içe aktarabiliyorum. Ancak bir güvenilenCertEntry olarak alınır ve web hizmetine erişilirken kullanılmaz.
Jan-Pieter

Soruya istisna komutunu ekleyebilir misiniz? İçe aktarma komutunuzda bir takma ad belirttiğinizden emin misiniz?
dogbane

Windows kullanıyorsanız
cmd'yi

9

Keystore-explorer.org adresinde açık kaynaklı bir GUI aracı bulunmaktadır.

KeyStore Gezgini

KeyStore Explorer, Java komut satırı yardımcı programları keytool ve jarsigner için açık kaynaklı bir GUI değiştirme aracıdır. KeyStore Explorer, sezgisel bir grafik kullanıcı arabirimi aracılığıyla işlevlerini ve daha fazlasını sunar.

Aşağıdaki ekranlar yardımcı olacaktır (resmi siteden)

Komutu çalıştırarak aldığınız varsayılan ekran:

shantha@shantha:~$./Downloads/kse-521/kse.sh

resim açıklamasını buraya girin

Ve gidip Examineve Examine a URLopsiyon ve sonra almak istediğiniz web URL'sini verir.

Google site bağlantısını verirseniz sonuç penceresi aşağıdaki gibi olacaktır. resim açıklamasını buraya girin

Bu, Kullanım senaryosundan biridir ve geri kalanı kullanıcıya bağlıdır (tüm krediler keystore-explorer.org'a gider )


7

Zaten sahip olduğunuz sertifika muhtemelen sunucunun sertifikası veya sunucunun sertifikasını imzalamak için kullanılan sertifikadır. Web hizmeti istemcinizin sunucunun kimliğini doğrulayabilmesi için buna ihtiyacınız olacaktır.

Ancak ek olarak SSL ile istemci kimlik doğrulaması yapmanız gerekiyorsa, web hizmeti istemcinizin kimliğini doğrulamak için kendi sertifikanızı almanız gerekir. Bunun için bir sertifika isteği oluşturmanız gerekir; işlem, kendi özel anahtarınızı ve karşılık gelen ortak anahtarı oluşturmayı ve bu ortak anahtarı, bilgilerinizin bir kısmıyla (e-posta, ad, etki alanı adı vb.) sertifika isteği adı verilen bir dosyaya eklemeyi içerir. Ardından, bu sertifika isteğini sizden zaten talep edilen şirkete gönderirsiniz ve ortak anahtarınızı özel anahtarlarıyla imzalayarak sertifikanızı oluştururlar ve sertifikanızla size bir X509 dosyası geri gönderirler. şimdi anahtar deponuza ekleyin ve istemci kimlik doğrulaması gerektiren SSL kullanarak bir web hizmetine bağlanmaya hazır olun.

Sertifika isteğinizi oluşturmak için "keytool -certreq -alias -file -keypass -keystore" kullanın. Ortaya çıkan dosyayı imzalayacak şirkete gönderin.

Sertifikanızı geri aldığınızda "keytool -importcert -alias -keypass -keystore" komutunu çalıştırın.

Anahtar deposu korunuyorsa her iki durumda da -storepass kullanmanız gerekebilir (bu iyi bir fikirdir).


5

Geçerli dizindeki bir grup crt dosyasını java anahtar deposuna toplu olarak almak için kullandığım bir komut dosyası. Bunu sertifikanızla aynı klasöre kaydedin ve şu şekilde çalıştırın:

./import_all_certs.sh

import_all_certs.sh

KEYSTORE="$(/usr/libexec/java_home)/jre/lib/security/cacerts";

function running_as_root()
{
  if [ "$EUID" -ne 0 ]
    then echo "NO"
    exit
  fi

  echo "YES"
}

function import_certs_to_java_keystore
{
  for crt in *.crt; do 
    echo prepping $crt 
    keytool -import -file $crt -storepass changeit -noprompt --alias alias__${crt} -keystore $KEYSTORE
    echo 
  done
}

if [ "$(running_as_root)" == "YES" ]
then
  import_certs_to_java_keystore
else
  echo "This script needs to be run as root!"
fi

1

Bunun benim için nasıl çalıştığı:

  1. Bir metin düzenleyicisinde sertifika verilerini aşağıdaki biçimde .txt olarak kaydedin

    ----- BELGEYİ BAŞLAT ----- [microsoft tarafından serileştirilmiş veriler] ----- SON SERTİFİKA -----

  2. Chrome tarayıcıyı aç (bu adım diğer tarayıcılarda da işe yarayabilir) ayarlar> gelişmiş ayarları göster> HTTPS / SSL> sertifikaları yönet 1. adımda .txt dosyasını içe aktarın
  3. Bu sertifikayı seçin ve Base-64 kodlanmış biçimde dışa aktarın. .Cer olarak kaydet
  4. Artık java anahtar deponuza aktarmak için keytool veya Portecle kullanabilirsiniz
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.