Impor rantai sertifikat PEM dan kunci ke Java Keystore

29

Ada banyak sumber di luar sana tentang topik ini, tetapi tidak ada yang saya temukan yang mencakup kasus yang sedikit istimewa ini.

Saya punya 4 file;

  • privatekey.pem
  • sertifikat.pem
  • intermediate_rapidssl.pem
  • ca_geotrust_global.pem

Dan saya ingin mengimpornya ke keystore baru.

Beberapa situs menyarankan untuk menggunakan format DER, dan mengimpornya satu per satu, tetapi ini gagal karena kunci tidak dikenali.

Situs lain menyarankan kelas "ImportKey" khusus untuk dijalankan untuk impor, dan ini berhasil hingga saya melihat bahwa rantai rusak. Yaitu panjang rantai pada sertifikat adalah 1, mengabaikan perantara dan ca.

Beberapa situs menyarankan PKCS7, tapi saya bahkan tidak bisa mendapatkan rantai darinya. Lainnya menyarankan format PKCS12, tetapi sejauh pengujian saya yang gagal juga untuk mendapatkan seluruh rantai.

Setiap saran atau petunjuk sangat kami harapkan.

Trollbane
sumber

Jawaban:

26

Ini mungkin tidak sempurna, tetapi saya memiliki beberapa catatan tentang penggunaan saya keytoolyang saya modifikasi untuk skenario Anda.

  1. Impor root atau sertifikat CA menengah ke Java keystore yang ada:

    keytool -import -trustcacerts -alias root -file ca_geotrust_global.pem -keystore yourkeystore.jks
    keytool -import -trustcacerts -alias root -file intermediate_rapidssl.pem -keystore yourkeystore.jks 
    
  2. Gabungkan sertifikat dan kunci pribadi ke dalam satu file sebelum mengimpor.

    cat certificate.pem privatekey.pem > combined.pem
    

    Ini akan menghasilkan file yang menyerupai format di bawah ini.

    BEGIN CERTIFICATE
    ...
    AKHIR SERTIFIKAT
    BEGIN RSA PRIVATE KEY
    ...
    END KUNCI PRIVATE RSA

  3. Impor sertifikat & kunci utama yang telah ditandatangani ke Java keystore yang ada:

    keytool -import -trustcacerts -alias yourdomain -file combined.pem -keystore yourkeystore.jks
    
Aaron Copley
sumber
2
Versi keytool apa yang memungkinkan Anda berantai seperti ini? Sintaks ini memberikan "kesalahan keytool: java.lang.Exception: Sertifikat tidak diimpor, alias <root> sudah ada" dengan kedua-impor dan -importcert
ctpenrose
Sulit dikatakan, tepatnya. Tapi mengingat tahun / bulan itu kemungkinan Java 6? (Tidak tahu rilis minor.) Versi apa yang Anda gunakan? Kesalahan terbaca seperti masalahnya bisa dengan keystore itu sendiri. ( alias <root> already exists) Dapatkah Anda mencoba dengan keystore kosong yang baru?
Aaron Copley
1
Keytool tidak akan membiarkan saya mengimpor sertifikat menggunakan alias 'root' yang sudah ada. Tapi saya pikir itu salah ketik. Menarik untuk dicatat bahwa keytool membuat rantai untuk sertifikat Anda sendiri ketika menemukan sertifikat penandatangan di keystore (dengan alias apa pun). Alat Java "Portecle" berguna untuk mengelola keystore java.
Houtman
Keytool tidak berfungsi seperti ini, dan tidak memungkinkan Anda mengimpor alias lebih dari sekali seperti yang dijelaskan. (Dan ya, saya sudah mencoba). Lihat jawaban senajqerib di bawah untuk sesuatu yang berfungsi dengan baik.
Steve Sether
1
Itu jawaban tiga tahun. Sangat mungkin bahwa segala sesuatu telah berubah, tetapi saya jamin itu berfungsi (atau hampir berfungsi seperti yang saya tunjukkan mungkin tidak sempurna) mulai Februari 2013. Silakan kirimkan suntingan atau panji untuk perhatian moderator.
Aaron Copley
42

Gabungkan semua file * .pem menjadi satu file pem, seperti all.pem Lalu buat keystore dalam format p12 dengan kunci pribadi + all.pem

openssl pkcs12 -export -inkey private.key -in all.pem -name test -out test.p12

Kemudian ekspor p12 ke jks

keytool -importkeystore -srckeystore test.p12 -srcstoretype pkcs12 -destkeystore test.jks
senanqerib
sumber
Terima kasih. Ini adalah satu-satunya jawaban yang lengkap dan benar. Seperti yang Anda sarankan, jauh lebih mudah untuk hanya menyatukan sertifikat ke dalam satu file.
Steve Sether
Ini berhasil bagiku !! Saya menggunakan instruksi ini untuk mengonversi rantai kunci yang digunakan dalam repositori nodejs-self-signed-sertifikat-contoh untuk berbicara dengan server TLS berbasis Java. Terima kasih banyak!
Galder Zamarreño
Ini jawaban yang benar.
sfThomas
8

keytool tidak menyediakan cara untuk mengimpor sertifikat + kunci pribadi dari satu file (gabungan), seperti yang diusulkan di atas. Ini berjalan dengan baik, tetapi hanya sertifikat yang diimpor, sementara kunci pribadi diabaikan. Anda dapat memeriksanya dengan keytool -list -v -keystore yourkeystore.jks- jenis entri domain Anda adalah TrustedCertEntry, bukan PrivateKeyEntry.

Jadi untuk menyelesaikan masalah awal, pertama-tama kita harus membuat keystore PKCS # 12 menggunakan openssl (atau alat serupa), kemudian mengimpor keystore dengan keytool -importkeystore.

Ixmal
sumber