Mengubah Java Keystore ke dalam Format PEM

132

Saya mencoba untuk mengkonversi dari file Java keystore menjadi file PEM menggunakan keytool dan aplikasi openssl. Tetapi saya tidak dapat menemukan cara yang baik untuk melakukan konversi. Ada ide?

Alih-alih mengubah keystore secara langsung ke PEM, saya mencoba membuat file PKCS12 terlebih dahulu dan kemudian dikonversi menjadi file PEM yang relevan dan Keystore. Tetapi saya tidak dapat membuat koneksi menggunakan mereka. (Perhatikan bahwa saya hanya perlu file PEM dan file Keystore untuk mengimplementasikan koneksi aman. Tidak ada batasan seperti "Mulai dari file java keystore". :) Jadi, mulai dari format lain dapat diterima dengan kasus saya)

Tetapi metode konversi langsung dari jks ke pem lebih disukai.

Chathuranga Chandrasekara
sumber

Jawaban:

214

Ini cukup mudah, menggunakan jdk6 setidaknya ...

bash $ keytool -keystore foo.jks -genkeypair -alias foo \
        -nama 'CN = foo.example.com, L = Melbourne, ST = Victoria, C = AU'
Masukkan kata sandi keystore:  
Masukkan kembali kata sandi baru: 
Masukkan kata sandi kunci untuk 
        (KEMBALI jika sama dengan kata sandi keystore):  
bash $ keytool -keystore foo.jks -exportcert -alias foo | \
       openssl x509-informasikan der -text
Masukkan kata sandi keystore: asdasd
Sertifikat:
    Data:
        Versi: 3 (0x2)
        Nomor Seri: 1237334757 (0x49c03ae5)
        Algoritma Tanda Tangan: dsaWithSHA1
        Penerbit: C = AU, ST = Victoria, L = Melbourne, CN = foo.example.com
        Keabsahan
            Tidak Sebelum: Mar 18 00:05:57 2009 GMT
            Not After: Jun 16 00:05:57 2009 GMT
        Subjek: C = AU, ST = Victoria, L = Melbourne, CN = foo.example.com
        Info Kunci Publik Subjek:
            Algoritma Kunci Publik: dsaEncryption
            Kunci Publik DSA:
                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
Masukkan kata sandi tujuan utama:  
Masukkan kembali kata sandi baru: 
Masukkan kata sandi keystore sumber:  
Entri untuk alias foo berhasil diimpor.
Perintah impor selesai: 1 entri berhasil diimpor, 0 entri gagal atau dibatalkan

bash $ openssl pkcs12 -dalam foo.p12 -keluar dari foo.pem
Masukkan Kata Sandi Impor:
MAC terverifikasi OK
Masukkan frase pass PEM:
Memverifikasi - Masukkan frase pass PEM:

bash $ openssl x509 -text -in foo.pem
Sertifikat:
    Data:
        Versi: 3 (0x2)
        Nomor Seri: 1237334757 (0x49c03ae5)
        Algoritma Tanda Tangan: dsaWithSHA1
        Penerbit: C = AU, ST = Victoria, L = Melbourne, CN = foo.example.com
        Keabsahan
            Tidak Sebelum: Mar 18 00:05:57 2009 GMT
            Not After: Jun 16 00:05:57 2009 GMT
        Subjek: C = AU, ST = Victoria, L = Melbourne, CN = foo.example.com
        Info Kunci Publik Subjek:
            Algoritma Kunci Publik: dsaEncryption
            Kunci Publik DSA:
                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
baca kunci DSA
Masukkan frase pass PEM:
Kunci Pribadi: (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:



Anda berakhir dengan:

  • foo.jks - keystore dalam format java.
  • foo.p12 - keystore dalam format PKCS # 12.
  • foo.pem - semua kunci dan sertifikat dari keystore, dalam format PEM.

(File terakhir ini dapat dibagi menjadi beberapa kunci dan sertifikat jika Anda mau.)


Ringkasan perintah - untuk membuat keystore JKS:

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

Ringkasan perintah - untuk mengonversi JKS keystore menjadi PKCS # 12 keystore, lalu ke file PEM:

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

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

jika Anda memiliki lebih dari satu sertifikat di keystore JKS Anda, dan Anda hanya ingin mengekspor sertifikat dan kunci yang terkait dengan salah satu alias, Anda dapat menggunakan variasi berikut:

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

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

Ringkasan perintah - untuk membandingkan JKS keystore ke file PEM:

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

openssl x509 -text -in foo.pem

openssl dsa -text -in foo.pem
Stobor
sumber
12
Sertifikat tepercaya tidak didukung dalam metode ini: ini adalah pembatasan format PKS12 yang saya percaya lihat: java.sun.com/javase/6/docs/technotes/guides/security/jsse/… (bagian di java.security.KeyStoreException : TrustedCertEntry tidak didukung)
andygavin
2
Saya memiliki file JKS yang lebih lama. Saya tidak bisa mengekspor menggunakan metode di atas. Saya akhirnya bisa melakukannya dengan mengatur keytool arg '-destkeypass' ke nilai dummy. 'keytool' bahkan meminta peringatan yang mengatakan itu mengabaikan nilai destkeypass? Tidak ada teknik lain yang akan berhasil. Menggunakan prompt tidak berfungsi, hanya berfungsi dari argumen baris perintah. Harus ada bug dalam ekspor PKCS12, adakah yang bisa berkomentar?
cmcginty
4
"openssl pkcs12 -dalam foo.p12 -keluar foo.pem" melempar kesalahan berikut. Masukkan Kata Sandi Impor: MAC diverifikasi OK Kunci-kunci dan sertifikat keluaran 139848775526048: kesalahan: 06065064: rutinitas amplop digital: EVP_DecryptFinal_ex: bad decrypt: evp_enc.c: 539 : 139848775526048: error: 23077074: pKCS12 rutinitas: PKCS12_pbe_crypt: pkcs12 cipherfinal error: p12_decr.c: 104: 139848775526048: error: 2306A075: pKCS12 rutinitas: PKCS12_item_decrypt_d2i: pkcs12 PBE crypt error: p12_decr.c: 130. Apa solusinya?
Udara SS Liyanage
1
peringatan untuk orang lain, perintah keytool membutuhkan beberapa saat untuk menyelesaikan karena suatu alasan, saya harus menunggu 30 detik sampai ekspor selesai
Nicolas Mommaerts
1
@ UdaraS.SLiyanage: lihat jawaban Casey untuk solusinya
Nicolas Mommaerts
29

Saya terus mendapatkan kesalahan opensslsaat menggunakan perintah StoBor:

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:

Untuk beberapa alasan, hanya gaya perintah ini yang akan bekerja untuk file JKS saya

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

Kuncinya adalah pengaturan destkeypass, nilai argumen tidak masalah.

cmcginty
sumber
6
Alasannya dapat ditemukan di sini: herongyang.com/PKI/... Destkeypass APAKAH penting
Nicolas Mommaerts
Saya mengubah komentar ini tetapi layak untuk posnya sendiri. Sulit ditemukan di sini.
Richie Rich
15

The keytoolperintah tidak akan memungkinkan Anda untuk mengekspor kunci pribadi dari toko kunci. Anda harus menulis beberapa kode Java untuk melakukan ini. Buka penyimpanan kunci, dapatkan kunci yang Anda butuhkan, dan simpan ke file dalam format PKCS # 8. Simpan sertifikat yang terkait juga.

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();

Gunakan utilitas OpenSSL untuk mengonversi file-file ini (yang dalam format biner) ke format PEM.

openssl pkcs8 -inform der -nocrypt < tmpkey.der > tmpkey.pem
openssl x509 -inform der < tmpcert.der > tmpcert.pem
erickson
sumber
Terima kasih erickson .. Kesimpulannya adalah "Kami tidak dapat melakukan konversi langsung dari JKS ke PEM hanya dengan menggunakan keytool dan utilitas openssl". Apakah saya benar?
Chathuranga Chandrasekara
4
Anda hanya perlu menulis kode hingga Java 1.4 - dari Java 5 dan seterusnya, keytool dan openssl dapat digabungkan untuk melakukan konversi dua tahap dari JKS -> PKCS # 12 -> PEM. Namun, menulis alat kunci Anda sendiri adalah satu-satunya cara untuk melakukan KONVERSI LANGSUNG dari JKS -> PEM.
Stobor
Saya pikir ini dari JDK 6 dan seterusnya. Tapi ya, impor PKCS # 12 sekarang didukung.
erickson
13

Konversi langsung dari jks ke file pem menggunakan keytool

keytool -exportcert -alias selfsigned -keypass password -keystore test-user.jks -rfc -file test-user.pem
Sanghavis
sumber
10
Yap, yang mengekspor sertifikat. Namun, itu tidak mengekspor informasi kunci ...
Stobor
Ini adalah jawaban sederhana yang tepat untuk apa yang saya cari di puluhan halaman keytooldan jbossdokumen tanpa hasil. Terima kasih!
kratenko
15
INI TIDAK MENGEKSPOR INFORMASI KUNCI PRIVATE
James
1
Ini mengekspor sertifikat kunci publik
asami
Saya mencoba menjalankan perintah ini. Ini memerlukan kata sandi, Masukkan kata sandi keystore: kesalahan keytool: java.io.IOException: Keystore dirusak, atau kata sandi salah. Saya telah menggunakan kata sandi sebagai (kata sandi) tetapi ternyata melemparkan kesalahan yang sama
Mohit Singh
9

Instruksi sederhana untuk mengonversi file JKS ke format PEM dan KEY (.crt & .key):

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>
asami
sumber
2

Saya menemukan solusi yang sangat menarik:

http://www.swview.org/node/191

Kemudian, saya membagi pasangan kunci publik / privat menjadi dua file private.key publi.pem dan berfungsi!

Marco Luly
sumber
2

Mengkonversi JKS KeyStore ke file PEM tunggal dapat dengan mudah dilakukan dengan menggunakan perintah berikut:

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

Penjelasan:

  1. keytool -list -rfc -keystore "myKeystore.jks"mencantumkan semua yang ada di KeyStore 'myKeyStore.jks' dalam format PEM. Namun, ia juga mencetak informasi tambahan.
  2. | sed -e "/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d"menyaring semua yang tidak kita butuhkan. Kita hanya memiliki PEM dari semua yang ada di KeyStore.
  3. >> "myKeystore.pem" tulis PEM ke file 'myKeyStore.pem'.
Mark Lagendijk
sumber
3
bash
:!
1
@ user3217883 Anda dapat mencoba sesuatu sebagai sed "s/^\-*BEGIN [A-Z]*\-*$//g;s/^\-*END [A-Z]*\-*$//g"gantinya (dengan gnu sed) tapi saya tidak yakin itu cukup jika ada lebih dari satu cert di keystore Anda
Idriss Neumann
jika Anda mendapatkan bash: !d": event not found: untuk bash tanda seru adalah kunci pendek untuk menggunakan perintah. Untuk menggunakan jawaban ini, Anda perlu menggunakan tanda kutip sebagai pengganti tanda kutip untuk opsi yang digunakan sebagai -e untuk sedkeytool -list -rfc -keystore "myKeystore.jks" | sed -e '/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d' >> "myKeystore.pem"
B.Adler
Sayangnya, ini hanya mengekspor sertifikat, bukan kunci pribadi
Maddin
2

Pertama buang keystore dari JKS ke PKCS12

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

Buang file pkcs12 baru ke dalam pem

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

Anda harus memiliki sertifikat dan kunci pribadi dalam format pem. Pisahkan mereka. Masukkan bagian antara "BEGIN CERTIFICATE" dan "END CERTIFICATE" ke cert.x509.pem Letakkan bagian antara "BEGIN RSA PRIVATE KEY" dan "END RSA PRIVATE KEY" menjadi private.rsa.pem Konversikan kunci privat ke dalam format pk8 sebagai diharapkan oleh signapk

3. openssl pkcs8 -topk8 -format DER -in private.rsa.pem -informasikan PEM -out private.pk8 -nocrypt

nkalra0123
sumber
1

Nah, OpenSSL harus melakukannya dengan mudah dari file # 12:

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

Mungkin lebih detail tentang apa kesalahan / kegagalan itu?

Charlie Martin
sumber
1

Jika Anda tidak menginstal openssl dan Anda mencari solusi cepat, ada perangkat lunak yang disebut portcle yang sangat berguna dan kecil untuk diunduh.

Kerugiannya adalah tidak ada baris perintah sejauh yang saya tahu. Namun dari GUI, cukup mudah untuk mengekspor kunci privat PEM:

  1. Buka penyimpanan kunci JKS Anda
  2. Klik kanan pada entri kunci pribadi Anda dan pilih ekspor
  3. Pilih Kunci Pribadi dan sertifikat dan format PEM

    Ekspor KE private key dari JKS dengan Portcle

Marcio Jasinski
sumber
0

Coba Keystore Explorer http://keystore-explorer.org/

KeyStore Explorer adalah pengganti GUI open source untuk utilitas baris perintah Java keytool dan jarsigner. Itu openssl / pkcs12 juga.

Johnnyboy
sumber
0

pertama buat file keystore sebagai

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

Masukkan kata sandi keystore: Masukkan
kembali kata sandi baru:
Apa nama depan dan belakang Anda? Tidak dikenal: FirstName LastName
Apa nama unit organisasi Anda? Tidak dikenal: Pengembangan Seluler
Apa nama organisasi Anda? Tidak dikenal: nama perusahaan Anda
Apa nama Kota atau Lokalitas Anda? Apa nama Negara Bagian atau Provinsi Anda?
Apa kode negara dua huruf untuk unit ini? Tidak dikenal: IN // tekan enter

Sekarang akan meminta konfirmasi

Apakah CN = FirstName LastName, OU = Pengembangan Mobile, O = nama perusahaan Anda, L = CityName, ST = StateName, C = IN benar? [tidak]: ya

Masukkan kata sandi kunci untuk (KEMBALI jika sama dengan kata sandi keystore): tekan enter jika Anda menginginkan kata sandi yang sama

kunci telah dihasilkan, sekarang Anda cukup mendapatkan file pem menggunakan perintah berikut

C: \ Program Files \ Android \ Android Studio \ jre \ bin> keytool -export -rfc -alias androidkey -file android_certificate.pem -keystore androidkey.jks
Masukkan kata sandi keystore:
Sertifikat disimpan dalam file

Ankit Dubey
sumber
0

Mengubah Java Keystore ke dalam Format PEM

Jawaban yang paling tepat dari semuanya adalah bahwa ini TIDAK mungkin.

Java keystore hanyalah fasilitas penyimpanan untuk kunci kriptografi dan sertifikat sedangkan PEM adalah format file untuk sertifikat X.509 saja.

pedagang whaefelinger
sumber