Bagaimana cara mengimpor sertifikat .cer ke java keystore?

226

Selama pengembangan klien layanan web Java saya mengalami masalah. Otentikasi untuk layanan web menggunakan sertifikat klien, nama pengguna, dan kata sandi. Sertifikat klien yang saya terima dari perusahaan di belakang layanan web dalam .cerformat. Ketika saya memeriksa file menggunakan editor teks, ia memiliki konten berikut:

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

Saya dapat mengimpor file ini sebagai sertifikat di Internet Explorer (tanpa harus memasukkan kata sandi!) Dan menggunakannya untuk mengotentikasi dengan layanan web.

Saya dapat mengimpor sertifikat ini ke dalam keystore dengan terlebih dahulu menghapus baris pertama dan terakhir, mengonversi ke unix baris baru dan menjalankan decode base64. File yang dihasilkan dapat diimpor ke keystore (menggunakan keytoolperintah). Ketika saya daftar entri dalam keystore, entri ini adalah tipe trustedCertEntry. Karena jenis entri ini (?) Saya tidak dapat menggunakan sertifikat ini untuk mengautentikasi dengan layanan web. Saya mulai berpikir bahwa sertifikat yang disediakan adalah sertifikat publik yang digunakan untuk otentikasi ...

Solusi yang saya temukan adalah mengimpor sertifikat di IE dan mengekspornya sebagai .pfxfile. File ini dapat dimuat sebagai keystore dan dapat digunakan untuk mengautentikasi dengan layanan web. Namun saya tidak dapat mengharapkan klien saya untuk melakukan langkah-langkah ini setiap kali mereka menerima sertifikat baru. Jadi saya ingin memuat .cerfile langsung ke Java. Adakah pikiran?

Info tambahan: perusahaan di balik layanan web memberi tahu saya bahwa sertifikat harus diminta (menggunakan IE & situs web) dari PC dan pengguna yang akan mengimpor sertifikat nanti.

Jan-Pieter
sumber

Jawaban:

317
  • Jika Anda ingin mengautentikasi, Anda memerlukan kunci pribadi - tidak ada opsi lain.
  • Sertifikat adalah kunci publik dengan properti tambahan (seperti nama perusahaan, negara, ...) yang ditandatangani oleh beberapa otoritas Sertifikat yang menjamin bahwa properti yang dilampirkan adalah benar.
  • .CERfile adalah sertifikat dan tidak memiliki kunci pribadi. Kunci pribadi disediakan dengan .PFX keystorefile secara normal. Jika Anda benar-benar mengautentikasi adalah karena Anda telah mengimpor kunci pribadi.
  • Anda biasanya dapat mengimpor .CERsertifikat tanpa masalah

    keytool -importcert -file certificate.cer -keystore keystore.jks -alias "Alias" 
lujop
sumber
3
Ternyata kunci pribadi sedang dibuat oleh plugin untuk IE. Satu-satunya solusi untuk saat ini adalah mengimpor sertifikat di IE dan mengekspor file .pfx.
Jan-Pieter
5
File .CER memiliki kunci publik. Mereka tidak memiliki kunci pribadi. Sarankan pengeditan ..
KyleM
6
Apa yang dilakukan -ali di sini?
hop
5
:( -> keytool error: java.lang.Exception: Input bukan sertifikat X.509
necromancer
1
@hop Java keystore dapat memiliki beberapa sertifikat, masing-masing dengan alias berbeda untuk mengidentifikasinya. Anda dapat menggunakannya sebagai referensi untuk mengidentifikasi dan / atau mengambilnya secara terprogram dengan nama alias.
lujop
85

Mengimpor .cerfile sertifikat yang diunduh dari browser (buka url dan gali untuk detailnya) ke cacerts keystore di java_home\jre\lib\securityberfungsi untuk saya, sebagai lawan dari upaya untuk menghasilkan dan menggunakan keystore saya sendiri.

  1. Pergi ke java_home\jre\lib\security
  2. ( Windows ) Buka baris perintah admin di sana menggunakan cmddan CTRL+ SHIFT+ENTER
  3. Jalankan keytool untuk mengimpor sertifikat:
    • (Ganti yourAliasNamedan path\to\certificate.cermasing - masing)

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

Dengan cara ini Anda tidak perlu menentukan opsi JVM tambahan dan sertifikat harus dikenali oleh JRE.

jediz
sumber
path \ to \ cert. Jika file saya ada di desktop bagaimana saya bisa mem-path-nya? C: / user / desktop / atau ../../../../desktop/filename
Jesse
pada MacOS / Linux perintah ini berfungsi dengan sudo. Terima kasih. tapi apa param noprompt? Saya tidak menggunakannya dan masih berhasil.
Evgeniy Mishustin
Perhatikan bahwa saat menggunakan JDK untuk pengembangan, jalur yang benar adalah java_home\jdk_x.xx\jre\lib\security Untuk jalur absolut gunakan backslash, mis. "C:\myCert.crt"Tanda kutip adalah opsional jika jalur tidak mengandung spasi putih.
jp-jee
Terima kasih jutaan kali.
vikingsteve
Pertanyaan: Bagaimana dengan kunci privat? Diskusi adalah tentang sertifikat klien. Pemahaman saya adalah bahwa seseorang perlu membuat CSR dengan kunci pribadi, kemudian menerima sertifikat klien dari perusahaan situs web jarak jauh dan kemudian mencocokkan sertifikat klien dengan kunci pribadi. Jawaban Anda sepertinya tidak menyebutkan apa pun tentang kunci privat. Hanya bertanya.
user2367418
51

Ini adalah kode yang saya gunakan untuk mengimpor file .cer secara terprogram ke dalam KeyStore baru.

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);
}
Patrick M
sumber
20

Anda tidak harus membuat perubahan apa pun pada sertifikat. Apakah Anda yakin Anda menjalankan perintah impor yang benar?

Berikut ini berfungsi untuk saya:

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

di mana mycert.cer berisi:

-----BEGIN CERTIFICATE-----
MIIFUTCCBDmgAwIBAgIHK4FgDiVqczANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
BhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAY
...
RLJKd+SjxhLMD2pznKxC/Ztkkcoxaw9u0zVPOPrUtsE/X68Vmv6AEHJ+lWnUaWlf
zLpfMEvelFPYH4NT9mV5wuQ1Pgurf/ydBhPizc0uOCvd6UddJS5rPfVWnuFkgQOk
WmD+yvuojwsL38LPbtrC8SZgPKT3grnLwKu18nm3UN2isuciKPF2spNEFnmCUWDc
MMicbud3twMSO6Zbm3lx6CToNFzP
-----END CERTIFICATE-----
dogbane
sumber
2
Ketika saya mencoba mengimpor sertifikat yang tidak dimodifikasi ke dalam keystore, saya mendapatkan kesalahan "keytool error: java.lang.Exception: Input bukan sertifikat X.509". Setelah memodifikasi sertifikat dengan cara yang saya jelaskan di posting saya, saya dapat mengimpor sertifikat tanpa kesalahan dengan perintah yang mirip dengan Anda. Namun itu diimpor sebagaiCertEntry tepercaya dan tidak digunakan saat mengakses layanan web.
Jan-Pieter
Bisakah Anda menambahkan perintah pengecualian ke pertanyaan? Apakah Anda yakin menentukan alias dalam perintah impor Anda?
dogbane
Jangan lupa untuk menjalankan cmd sebagai admin jika Anda menggunakan Windows
SilentBob470
9

Alat GUI open source tersedia di keystore-explorer.org

Explorer KeyStore

KeyStore Explorer adalah pengganti GUI open source untuk utilitas baris perintah Java keytool dan jarsigner. KeyStore Explorer menyajikan fungsionalitasnya, dan lebih banyak lagi, melalui antarmuka pengguna grafis yang intuitif.

Layar berikut akan membantu (berasal dari situs resmi)

Layar default yang Anda dapatkan dengan menjalankan perintah:

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

masukkan deskripsi gambar di sini

Dan pergi ke Examinedan Examine a URLopsi lalu berikan URL web yang ingin Anda impor.

Jendela hasil akan seperti di bawah ini jika Anda memberikan tautan situs google. masukkan deskripsi gambar di sini

Ini adalah salah satu Use case dan sisanya terserah pengguna (semua kredit masuk ke keystore-explorer.org )

Shantha Kumara
sumber
7

Sertifikat yang sudah Anda miliki mungkin adalah sertifikat server, atau sertifikat yang digunakan untuk menandatangani sertifikat server. Anda akan memerlukannya sehingga klien layanan web Anda dapat mengotentikasi server.

Tetapi jika tambahan Anda perlu melakukan otentikasi klien dengan SSL, maka Anda perlu mendapatkan sertifikat Anda sendiri, untuk mengotentikasi klien layanan web Anda. Untuk ini, Anda perlu membuat permintaan sertifikat; prosesnya melibatkan pembuatan kunci pribadi Anda sendiri, dan kunci publik yang sesuai, dan melampirkan kunci publik itu bersama dengan beberapa info Anda (email, nama, nama domain, dll) ke file yang disebut permintaan sertifikat. Kemudian Anda mengirim permintaan sertifikat itu ke perusahaan yang sudah meminta Anda untuk itu, dan mereka akan membuat sertifikat Anda, dengan menandatangani kunci publik Anda dengan kunci pribadi mereka, dan mereka akan mengirim Anda kembali file X509 dengan sertifikat Anda, yang Anda bisa sekarang tambahkan keystore Anda, dan Anda akan siap untuk terhubung ke layanan web menggunakan SSL yang membutuhkan otentikasi klien.

Untuk menghasilkan permintaan sertifikat Anda, gunakan "keytool -certreq -alias -file -keypass -keystore". Kirim file yang dihasilkan ke perusahaan yang akan menandatanganinya.

Ketika Anda mendapatkan kembali sertifikat Anda, jalankan "keytool -importcert -alias -keypass -keystore".

Anda mungkin perlu menggunakan -assepass dalam kedua kasus jika keystore dilindungi (yang merupakan ide yang baik).

Chochos
sumber
5

Berikut ini adalah skrip yang saya gunakan untuk mengimpor banyak file crt dalam direktori saat ini ke java keystore. Simpan saja ini ke folder yang sama dengan sertifikat Anda, dan jalankan seperti ini:

./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
Taman Brad
sumber
1

Inilah cara kerjanya bagi saya:

  1. Simpan sebagai .txt data sertifikat dalam format berikut dalam editor teks

    ----- BEGIN CERTIFICATE ----- [data bersambung oleh microsoft] ----- END CERTIFICATE -----

  2. Buka browser chrome (langkah ini mungkin juga bekerja dengan browser lain) pengaturan> tampilkan pengaturan lanjutan> HTTPS / SSL> kelola sertifikat. Impor .txt pada langkah 1
  3. Pilih dan ekspor sertifikat itu dalam format berkode Base-64. Simpan sebagai .cer
  4. Sekarang Anda dapat menggunakan keytool atau Portecle untuk mengimpornya ke java keystore Anda
code4kix
sumber