Java Anahtar Deposunu PEM Formatına Dönüştürme


132

Java anahtar deposu dosyasından keytool ve openssl uygulamalarını kullanarak bir PEM dosyasına dönüştürmeye çalışıyorum. Ama dönüşümü yapmanın iyi bir yolunu bulamadım. Herhangi bir fikir?

Anahtar deposunu doğrudan PEM'e dönüştürmek yerine önce bir PKCS12 dosyası oluşturmaya ve ardından ilgili PEM dosyasına ve Anahtar Deposuna dönüştürmeye çalıştım. Ama onları kullanarak bağlantı kuramadım. (Güvenli bir bağlantı uygulamak için sadece bir PEM dosyasına ve bir Anahtar Deposu dosyasına ihtiyacım olduğunu unutmayın. "Bir java anahtar deposu dosyasından başla" gibi bir kısıtlama yoktur. :) Bu nedenle diğer biçimlerden başlamak benim durumumda kabul edilebilir)

Ancak jks'den pem'e doğrudan bir dönüştürme yöntemi tercih edilir.

Yanıtlar:


214

Oldukça basit, en azından jdk6 kullanmak ...

bash $ keytool -keystore foo.jks -genkeypair -alias foo \
        -dname 'CN = foo.example.com, L = Melbourne, ST = Victoria, C = AU'
Anahtar deposu şifresini girin:  
Yeni şifreyi tekrar giriniz: 
İçin anahtar şifresini girin 
        (Anahtar deposu şifresiyle aynıysa GERİ DÖN):  
bash $ keytool -keystore foo.jks -exportcert -alias foo | \
       openssl x509 -bilgi der -metin
Anahtar deposu şifresini girin: asdasd
Sertifika:
    Veri:
        Sürüm: 3 (0x2)
        Seri Numarası: 1237334757 (0x49c03ae5)
        İmza Algoritması: dsaWithSHA1
        Sertifikayı Veren: C = AU, ST = Victoria, L = Melbourne, CN = foo.example.com
        Geçerlilik
            Daha Önce Değil: Mar 18 00:05:57 2009 GMT
            Sonra Değil: 16 Haziran 00:05:57 2009 GMT
        Konu: C = AU, ST = Victoria, L = Melbourne, CN = foo.example.com
        Konu Genel Anahtar Bilgileri:
            Genel Anahtar Algoritması: dsaEncryption
            DSA Genel Anahtarı:
                pub: 
                    00: e2: 66: 5c: e0: 2e: da: e0: 6b: a6: aa: 97: 64: 59: 14:
                    7e: A6: 2e: 5a: 45: F9: 2f: B5: 2d: f4: 34: 27: e6: 53: C7:
 

bash $ keytool -importkeystore -srckeystore foo.jks \
       -destkeystore foo.p12 \
       -srcstoretype jks \
       -deststoretype pkcs12
Hedef anahtar deposu şifresini girin:  
Yeni şifreyi tekrar giriniz: 
Kaynak anahtar deposu şifresini girin:  
Foo takma adı girişi başarıyla içe aktarıldı.
İçe aktarma komutu tamamlandı: 1 giriş başarıyla içe aktarıldı, 0 giriş başarısız oldu veya iptal edildi

bash $ openssl pkcs12 -in foo.p12 -out foo.pem
Alma Parolasını Girin:
MAC doğrulandı, Tamam
PEM parolasını girin:
Doğrulanıyor - PEM parolasını girin:

bash $ openssl x509 -text -in foo.pem
Sertifika:
    Veri:
        Sürüm: 3 (0x2)
        Seri Numarası: 1237334757 (0x49c03ae5)
        İmza Algoritması: dsaWithSHA1
        Sertifikayı Veren: C = AU, ST = Victoria, L = Melbourne, CN = foo.example.com
        Geçerlilik
            Daha Önce Değil: Mar 18 00:05:57 2009 GMT
            Sonra Değil: 16 Haziran 00:05:57 2009 GMT
        Konu: C = AU, ST = Victoria, L = Melbourne, CN = foo.example.com
        Konu Genel Anahtar Bilgileri:
            Genel Anahtar Algoritması: dsaEncryption
            DSA Genel Anahtarı:
                pub: 
                    00: e2: 66: 5c: e0: 2e: da: e0: 6b: a6: aa: 97: 64: 59: 14:
                    7e: A6: 2e: 5a: 45: F9: 2f: B5: 2d: f4: 34: 27: e6: 53: C7:
 

bash $ openssl dsa -text -in foo.pem
DSA anahtarını oku
PEM parolasını girin:
Özel Anahtar: (1024 bit)
priv:
    00: 8f: B1: af: 55: 63: 92: 7c: d2: 0f: e6: f3: a2: F5: ff:
    1a: 7a: Fe: 8c: 39: dd
pub: 
    00: e2: 66: 5c: e0: 2e: da: e0: 6b: a6: aa: 97: 64: 59: 14:
    7e: A6: 2e: 5a: 45: F9: 2f: B5: 2d: f4: 34: 27: e6: 53: C7:



Şunlarla sonuçlanırsınız:

  • foo.jks - java formatında anahtar deposu.
  • foo.p12 - PKCS # 12 biçiminde anahtar deposu.
  • foo.pem - anahtar deposundaki tüm anahtarlar ve sertifikalar, PEM biçiminde.

(Bu son dosya, isterseniz anahtarlara ve sertifikalara bölünebilir.)


Komut özeti - JKS anahtar deposu oluşturmak için:

keytool -keystore foo.jks -genkeypair -alias foo \
    -dname 'CN=foo.example.com,L=Melbourne,ST=Victoria,C=AU'

Komut özeti - JKS anahtar deposunu PKCS # 12 anahtar deposuna, ardından PEM dosyasına dönüştürmek için:

keytool -importkeystore -srckeystore foo.jks \
   -destkeystore foo.p12 \
   -srcstoretype jks \
   -deststoretype pkcs12

openssl pkcs12 -in foo.p12 -out foo.pem

JKS anahtar deponuzda birden fazla sertifikanız varsa ve yalnızca takma adlardan biriyle ilişkili sertifika ve anahtarı dışa aktarmak istiyorsanız, aşağıdaki varyasyonu kullanabilirsiniz:

keytool -importkeystore -srckeystore foo.jks \
   -destkeystore foo.p12 \
   -srcalias foo \
   -srcstoretype jks \
   -deststoretype pkcs12

openssl pkcs12 -in foo.p12 -out foo.pem

Komut özeti - JKS anahtar deposunu PEM dosyasıyla karşılaştırmak için:

keytool -keystore foo.jks -exportcert -alias foo | \
   openssl x509 -inform der -text

openssl x509 -text -in foo.pem

openssl dsa -text -in foo.pem

12
Güvenilir sertifikaları, bu yöntemde desteklenmez: Bu bir görüyorum inanıyorum PKS12 formatının sınırlamadır java.sun.com/javase/6/docs/technotes/guides/security/jsse/... java.security.KeyStoreException üzerine (bölüm : TrustedCertEntry desteklenmiyor)
andygavin

2
Daha eski bir JKS dosyam var. Yukarıdaki yöntemi kullanarak dışa aktaramadım. Sonunda keytool arg '-destkeypass' öğesini kukla bir değere ayarlayarak bunu başardım. 'keytool' destkeypass değerini yok saydığını söyleyen bir uyarı bile veriyor? Başka hiçbir teknik işe yaramaz. İstemleri kullanmak işe yaramadı, sadece komut satırı argümanından çalışır. PKCS12 dışa aktarımında bir hata olmalı, herkes yorum yapabilir mi?
cmcginty

4
"openssl pkcs12 -in foo.p12 -out foo.pem" aşağıdaki hatayı atıyor Parolayı Girin: MAC doğrulandı Tamam Anahtar ve sertifikaların çıktısı alınırken hata 139848775526048: hata: 06065064: dijital zarf rutinleri: EVP_DecryptFinal_ex: bozuk şifre çözme: evp_enc.c: 539 : 139848775526048: hata: 23077074: PKCS12 yordamları: PKCS12_pbe_crypt: pkcs12 şifre son hatası: p12_decr.c: 104: 139848775526048: hata: 2306A075: PKCS12 yordamları: PKCS12_item_decrypt_d2. Bunun çözümü nedir?
Udara SS Liyanage

1
ihracat yapıldığını kadar diğer insanlar için bir uyarı, keytool komut nedense tamamlamak için biraz zaman alıyor, ben 30 saniye beklemek zorunda kaldı
Nicolas Mommaerts

1
@ UdaraS.SLiyanage: Casey'nin çözüm için cevabına bakın
Nicolas Mommaerts

29

opensslStoBor'un komutunu kullanırken hatalar almaya devam ettim :

MAC verified OK
Error outputting keys and certificates
139940235364168:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:535:
139940235364168:error:23077074:PKCS12 routines:PKCS12_pbe_crypt:pkcs12 cipherfinal error:p12_decr.c:97:
139940235364168:error:2306A075:PKCS12 routines:PKCS12_item_decrypt_d2i:pkcs12 pbe crypt error:p12_decr.c:123:

Bazı nedenlerden dolayı, JKS dosyam için yalnızca bu komut stili çalışabilir

keytool -importkeystore -srckeystore foo.jks \
   -destkeystore foo.p12 \
   -srcstoretype jks \
   -srcalias mykey \
   -deststoretype pkcs12 \
   -destkeypass DUMMY123

Anahtar belirleniyordu destkeypass, argümanın değeri önemli değildi.


6
Gerekçe burada bulunabilir: herongyang.com/PKI/… destkeypass önemlidir btw
Nicolas Mommaerts

Bu yoruma oy verdim ama kendi gönderisini hak ediyor. Burada bulmak zordu.
Richie Rich

15

keytoolKomut bir anahtar deposundan Özel anahtar dışa izin vermeyecektir. Bunu yapmak için bir miktar Java kodu yazmalısınız. Anahtar deposunu açın, ihtiyacınız olan anahtarı alın ve PKCS # 8 formatında bir dosyaya kaydedin. İlişkili sertifikayı da kaydedin.

KeyStore ks = KeyStore.getInstance("jks");
/* Load the key store. */
...
char[] password = ...;
/* Save the private key. */
FileOutputStream kos = new FileOutputStream("tmpkey.der");
Key pvt = ks.getKey("your_alias", password);
kos.write(pvt.getEncoded());
kos.flush();
kos.close();
/* Save the certificate. */
FileOutputStream cos = new FileOutputStream("tmpcert.der");
Certificate pub = ks.getCertificate("your_alias");
cos.write(pub.getEncoded());
cos.flush();
cos.close();

Bu dosyaları (ikili formatta olan) PEM formatına dönüştürmek için OpenSSL yardımcı programlarını kullanın.

openssl pkcs8 -inform der -nocrypt < tmpkey.der > tmpkey.pem
openssl x509 -inform der < tmpcert.der > tmpcert.pem

Teşekkürler erickson .. Sonuç "JKS'den PEM'e sadece keytool ve openssl yardımcı programlarını kullanarak doğrudan bir dönüşüm gerçekleştiremiyoruz". Doğrumuyum?
Chathuranga Chandrasekara

4
Yalnızca Java 1.4'e kadar kod yazmanız gerekir - Java 5'ten itibaren, keytool ve openssl birleştirilerek JKS -> PKCS # 12 -> PEM'den iki aşamalı bir dönüşüm gerçekleştirilebilir. Ancak, JKS -> PEM'den DIRECT CONVERSION yapmanın tek yolu kendi anahtar aracınızı yazmaktır.
Stobor

Sanırım JDK 6'dan itibaren. Ancak evet, bir PKCS # 12 içe aktarma artık desteklenmektedir.
erickson

13

Keytool kullanarak jks'den pem dosyasına doğrudan dönüştürme

keytool -exportcert -alias selfsigned -keypass password -keystore test-user.jks -rfc -file test-user.pem

10
Evet, sertifikayı ihraç eden. Ancak, önemli bilgileri dışa
aktarmaz

Bu, düzinelerce keytoolve jbossbelge sayfasında aradığım şeyin tam basit yanıtı ve başarılı olamadı. Teşekkürler!
kratenko

15
BU ÖZEL ANAHTAR BİLGİLERİNİ İHRACAT ETMEMEKTEDİR
James

1
Bu ihracat genel anahtar sertifikası
asami

Bu komutu çalıştırmayı denedim. Parola gerektiriyor, Anahtar deposu parolasını girin: anahtar aracı hatası: java.io.IOException: Anahtar deposu değiştirildi veya parola hatalı. Parolayı (parola) olarak kullandım ama aynı hatayı
veriyordu

9

Bir JKS dosyasını PEM ve KEY biçimine (.crt & .key) dönüştürmek için basitleştirilmiş talimatlar:

keytool -importkeystore -srckeystore <Source-Java-Key-Store-File> -destkeystore <Destination-Pkcs12-File> -srcstoretype jks -deststoretype pkcs12 -destkeypass <Destination-Key-Password>

openssl pkcs12 -in <Destination-Pkcs12-File> -out <Destination-Pem-File>

openssl x509 -outform der -in <Destination-Pem-File> -out <Destination-Crt-File>

openssl rsa -in <Destination-Pem-File> -out <Destination-Key-File>


2

Bir JKS Anahtar Deposunu tek bir PEM dosyasına dönüştürmek, aşağıdaki komut kullanılarak kolayca gerçekleştirilebilir:

keytool -list -rfc -keystore "myKeystore.jks" | sed -e "/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d" >> "myKeystore.pem"

Açıklama:

  1. keytool -list -rfc -keystore "myKeystore.jks"'myKeyStore.jks' KeyStore'daki her şeyi PEM biçiminde listeler. Bununla birlikte, fazladan bilgi de yazdırır.
  2. | sed -e "/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d"ihtiyacımız olmayan her şeyi filtreler. KeyStore'daki her şeyin yalnızca PEM'leriyle baş başa kalıyoruz.
  3. >> "myKeystore.pem" PEM'leri 'myKeyStore.pem' dosyasına yazın.

3
bash
:!

1
@ user3217883 Bunun sed "s/^\-*BEGIN [A-Z]*\-*$//g;s/^\-*END [A-Z]*\-*$//g"yerine benzer bir şey deneyebilirsiniz (gnu sed ile) ama anahtar deponuzda birden fazla sertifika varsa bunun yeterli olduğundan emin değilim
Idriss Neumann

şunu elde ediyorsanız bash: !d": event not found: bash için ünlem işareti, bir komutu kullanmak için kısa bir tuştur. Bu cevabı kullanmak için sed için -e olarak kullanılan seçenek için tırnak yerine kesme işareti kullanmanız gerekir.keytool -list -rfc -keystore "myKeystore.jks" | sed -e '/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d' >> "myKeystore.pem"
B.Adler

Ne yazık ki, bu yalnızca sertifikayı dışa
aktarıyor

2

Önce anahtar deposunu JKS'den PKCS12'ye boşaltın

1. keytool -importkeystore -srckeystore ~ ​​/ .android / debug.keystore -destkeystore intermediate.p12 -srcstoretype JKS -deststoretype PKCS12

Yeni pkcs12 dosyasını pem'e boşaltın

  1. openssl pkcs12 -inortada.p12 -nodes -out intermediate.rsa.pem

Sertifika ve özel anahtara pem formatında sahip olmalısınız. Onları ayırın. "BEGIN CERTIFICATE" ile "END CERTIFICATE" arasındaki kısmı cert.x509.pem içine koyun "BEGIN RSA PRIVATE KEY" ile "END RSA PRIVATE KEY" arasındaki kısmı private.rsa.pem olarak pk8 formatına dönüştürün. signapk tarafından beklenen

3. openssl pkcs8 -topk8 -outform DER -in private.rsa.pem -inform PEM -out private.pk8 -nocrypt


1

Eh, OpenSSL dezavantaj bunu yapmalıyım bir # 12 dosyadan:

openssl pkcs12 -in pkcs-12-certificate-file -out pem-certificate-file
openssl pkcs12 -in pkcs-12-certificate-and-key-file -out pem-certificate-and-key-file

Belki hatanın / başarısızlığın ne olduğu hakkında daha fazla ayrıntı?


1

Openssl kurulu değilse ve hızlı bir çözüm arıyorsanız, portcle adında bir yazılım var. çok kullanışlı ve küçük olan .

Dezavantajı, bildiğim kadarıyla komut satırı olmaması. Ancak GUI'den bir PEM özel anahtarını dışa aktarmak oldukça basittir:

  1. JKS anahtar deposunu aç
  2. Özel anahtar girişinize sağ tıklayın ve dışa aktarmayı seçin
  3. Özel Anahtar ve sertifikalar ile PEM biçimini seçin

    Portcle ile JKS'den PEM özel anahtarını dışa aktarın


0

Keystore Explorer'ı http://keystore-explorer.org/ deneyin

KeyStore Explorer, Java komut satırı yardımcı programları keytool ve jarsigner için açık kaynaklı bir GUI değişimidir. Ayrıca openssl / pkcs12 yapar.


0

ilk olarak anahtar deposu dosyasını oluştur

C: \ Program Files \ Android \ Android Studio \ jre \ bin> keytool -keystore androidkey.jks -genkeypair -alias androidkey

Anahtar deposu şifresini girin:
Yeni şifreyi tekrar girin:
Adınız ve soyadınız nedir? Bilinmiyor: FirstName LastName
Kuruluş biriminizin adı nedir? Bilinmeyen: Mobil Geliştirme
Kuruluşunuzun adı nedir? Bilinmiyor: şirketinizin adı
Şehrinizin veya Bölgenizin adı nedir? Eyaletinizin veya Bölgenizin adı nedir?
Bu birim için iki harfli ülke kodu nedir? Bilinmeyen: IN // enter tuşuna basın

Şimdi onaylamanızı isteyecek

CN = FirstName LastName, OU = Mobile Development, O = şirket adınız, L = CityName, ST = StateName, C = IN doğru mu? [hayır]: evet

(Anahtar deposu şifresiyle aynıysa GERİ DÖN) için anahtar şifresini girin: aynı şifreyi istiyorsanız enter tuşuna basın

anahtar oluşturuldu, şimdi aşağıdaki komutu kullanarak pem dosyasını kolayca alabilirsiniz

C: \ Program Files \ Android \ Android Studio \ jre \ bin> keytool -export -rfc -alias androidkey -file android_certificate.pem -keystore androidkey.jks
Anahtar deposu şifresini girin:
Sertifika dosyada saklanır


0

Java Anahtar Deposunu PEM Formatına Dönüştürme

Hepsinin en kesin yanıtı bunun mümkün OLMADIĞI olmalıdır.

Java anahtar deposu, yalnızca kriptografik anahtarlar ve sertifikalar için bir depolama olanağı iken, PEM yalnızca X.509 sertifikaları için bir dosya biçimidir.

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.