Bagaimana cara mengimpor sertifikat yang ditandatangani sendiri dengan benar ke Java keystore yang tersedia untuk semua aplikasi Java secara default?

144

Saya ingin mengimpor sertifikat yang ditandatangani sendiri ke Jawa sehingga aplikasi Java apa pun yang akan mencoba membuat koneksi SSL akan mempercayai sertifikat ini.

Sejauh ini, saya berhasil mengimpornya

keytool -import -trustcacerts -noprompt -storepass changeit -alias $REMHOST -file $REMHOST.pem
keytool -import -trustcacerts -noprompt -keystore cacerts -storepass changeit -alias $REMHOST -file $REMHOST.pem

Namun, ketika saya mencoba menjalankan HTTPSClient.classsaya masih mendapatkan:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: Gagal membangun jalur PKIX: sun.security.provider.certpath.SunCertPathBuilderException: tidak dapat menemukan jalur sertifikasi yang valid untuk target yang diminta
Sorin
sumber
Saya tidak perlu bergantung pada kode itu. Hal-hal seperti Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider())sama sekali tidak perlu di bagian pertama. Yang kedua tidak melakukan verifikasi sertifikat. Cobalah dengan yang sederhana URLConnectionuntuk memulai. Apakah Anda yakin Anda sudah dimodifikasi cacertsdi lib/securityinstalasi JRE Anda? Sudahkah Anda mencoba trustmanageropsi debugging ?
Bruno

Jawaban:

224

Pada Windows cara termudah adalah dengan menggunakan portecle program .

  1. Unduh dan instal portecle.
  2. Pertama, pastikan 100% Anda tahu JRE atau JDK mana yang digunakan untuk menjalankan program Anda. Pada 64 bit Windows 7 mungkin ada beberapa JRE. Process Explorer dapat membantu Anda dengan ini atau Anda dapat menggunakan:System.out.println(System.getProperty("java.home"));
  3. Salin file JAVA_HOME \ lib \ security \ cacerts ke folder lain.
  4. Di Portecle klik File> Open File Keystore
  5. Pilih file cacerts
  6. Masukkan kata sandi ini: changeit
  7. Klik Alat> Impor Sertifikat Tepercaya
  8. Jelajahi file mycertificate.pem
  9. Klik Impor
  10. Klik OK untuk peringatan tentang jalur kepercayaan.
  11. Klik OK ketika menampilkan detail tentang sertifikat.
  12. Klik Ya untuk menerima sertifikat sebagai tepercaya.
  13. Ketika meminta alias klik OK dan klik OK lagi ketika dikatakan telah mengimpor sertifikat.
  14. Klik simpan. Jangan lupa ini atau perubahannya dibuang.
  15. Salin file cacerts kembali ke tempat Anda menemukannya.

Di Linux:

Anda dapat mengunduh sertifikat SSL dari server web yang sudah menggunakannya seperti ini:

$ echo -n | openssl s_client -connect www.example.com:443 | \
   sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/examplecert.crt

Secara opsional verifikasi informasi sertifikat:

$ openssl x509 -in /tmp/examplecert.crt -text

Impor sertifikat ke keystore Java cacerts:

$ keytool -import -trustcacerts -keystore /opt/java/jre/lib/security/cacerts \
   -storepass changeit -noprompt -alias mycert -file /tmp/examplecert.crt
Sarel Botha
sumber
1
Gagasan utama dari ini bukan portecle tetapi mengimpor sertifikat ke keystore kanan.
Alfabravo
Ini berhasil, tetapi java saya berada di lokasi yang berbeda. Keystore saya terletak di / usr / lib / jvm / java-openjdk / jre / lib / security / cacerts yang saya temukan dengan menjalankan ps -ef | grep javayang memberitahu saya bahwa java saya sedang berjalan dari openjdk yang terletak di / usr / lib / jvm / java-openjdk / bin / java. Juga, jika ini jika untuk aplikasi web ingatlah untuk memulai kembali. Terima kasih untuk bantuannya!!
Codezilla
7
Saya belum pernah menggunakan portecle, tetapi saya menemukan bahwa Keystore Explorer bekerja dengan cukup baik untuk Windows, Linux, (dan seharusnya dapat bekerja pada OSX juga)
Xantix
Memang sangat membantu. 2 hal yang sangat penting disorot di sini. Salah satunya adalah tentang mengimpor di keystore kanan. Dan yang lainnya adalah memastikan untuk me-restart jika server web.
sdm
6
Pada 2019, kita bahkan bisa mendapatkan sertifikat SSL gratis menggunakan layanan seperti Mari mengenkripsi
Ferrybig
41
    D:\Java\jdk1.5.0_10\bin\keytool -import -file "D:\Certificates\SDS services\Dev\dev-sdsservices-was8.infavig.com.cer" -keystore "D:\Java\jdk1.5.0_10\jre\lib\security\cacerts" -alias "sds certificate"
Vikky
sumber
12
Anda akan dimintai kata sandi keystore, standarnya adalah "changeit"
The Gilbert Arenas Dagger
33

Saya akhirnya menulis skrip kecil yang menambahkan sertifikat ke keystores, sehingga lebih mudah digunakan.

Anda bisa mendapatkan versi terbaru dari https://github.com/ssbarnea/keytool-trust

#!/bin/bash
# version 1.0
# https://github.com/ssbarnea/keytool-trust
REMHOST=$1
REMPORT=${2:-443}

KEYSTORE_PASS=changeit
KEYTOOL="sudo keytool"

# /etc/java-6-sun/security/cacerts

for CACERTS in  /usr/lib/jvm/java-8-oracle/jre/lib/security/cacerts \
    /usr/lib/jvm/java-7-oracle/jre/lib/security/cacerts \
    "/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security/cacerts" \
    "/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/MacOS/itms/java/lib/security/cacerts"
do

if [ -e "$CACERTS" ]
then
    echo --- Adding certs to $CACERTS

# FYI: the default keystore is located in ~/.keystore

if [ -z "$REMHOST" ]
    then
    echo "ERROR: Please specify the server name to import the certificatin from, eventually followed by the port number, if other than 443."
    exit 1
    fi

set -e

rm -f $REMHOST:$REMPORT.pem

if openssl s_client -connect $REMHOST:$REMPORT 1>/tmp/keytool_stdout 2>/tmp/output </dev/null
        then
        :
        else
        cat /tmp/keytool_stdout
        cat /tmp/output
        exit 1
        fi

if sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' </tmp/keytool_stdout > /tmp/$REMHOST:$REMPORT.pem
        then
        :
        else
        echo "ERROR: Unable to extract the certificate from $REMHOST:$REMPORT ($?)"
        cat /tmp/output
        fi

if $KEYTOOL -list -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT >/dev/null
    then
    echo "Key of $REMHOST already found, skipping it."
    else
    $KEYTOOL -import -trustcacerts -noprompt -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT -file /tmp/$REMHOST:$REMPORT.pem
    fi

if $KEYTOOL -list -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT -keystore "$CACERTS" >/dev/null
    then
    echo "Key of $REMHOST already found in cacerts, skipping it."
    else
    $KEYTOOL -import -trustcacerts -noprompt -keystore "$CACERTS" -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT -file /tmp/$REMHOST:$REMPORT.pem
    fi

fi

done

`` `

Sorin
sumber
"sudo keytool" NOPE
Dragas
17

Ini berhasil untuk saya. :)

sudo keytool -importcert -file filename.cer -alias randomaliasname -keystore $ JAVA_HOME / jre / lib / keamanan / cacerts -storepass changeit 
Berjalan
sumber
4

Jika Anda menggunakan sertifikat yang ditandatangani oleh Otoritas Sertifikat yang tidak termasuk dalam file Java cacerts secara default, Anda perlu menyelesaikan konfigurasi berikut untuk koneksi HTTPS. Untuk mengimpor sertifikat ke dalam cacerts:

  1. Buka Windows Explorer dan navigasikan ke file cacerts, yang terletak di subfolder jre \ lib \ security tempat AX Core Client diinstal. Lokasi default adalah C: \ Program Files \ ACL Software \ AX Core Client \ jre \ lib \ security
  2. Buat salinan cadangan file sebelum membuat perubahan apa pun.
  3. Bergantung pada sertifikat yang Anda terima dari Otoritas Sertifikat yang Anda gunakan, Anda mungkin perlu mengimpor sertifikat perantara dan / atau sertifikat root ke file cacerts. Gunakan sintaks berikut untuk mengimpor sertifikat: keytool -import -alias -keystore -trustcacerts -file
  4. Jika Anda mengimpor kedua sertifikat, alias yang ditentukan untuk setiap sertifikat harus unik.
  5. Ketikkan kata sandi untuk keystore di prompt “Kata Sandi” dan tekan Enter. Kata sandi Java default untuk file cacerts adalah "changeit". Ketik 'y' di “Percayai sertifikat ini?” meminta dan tekan Enter.
Bharat Darakh
sumber
Gunakan perintah ini: -> keytool -import -alias <alias> -keystore <cacerts_file> -trustcacerts -file <certificate_filename>
Bharat Darakh
1

Perintah sederhana 'keytool' juga berfungsi di Windows dan / atau dengan Cygwin.

JIKA Anda menggunakan Cygwin di sini adalah perintah yang dimodifikasi yang saya gunakan dari bawah jawaban "S.Botha's":

  1. pastikan Anda mengidentifikasi JRE di dalam JDK yang akan Anda gunakan
  2. Mulai prompt / cygwin Anda sebagai admin
  3. masuk ke dalam direktori bin dari JDK itu misalnya cd / cygdrive / c / Program \ Files / Java / jdk1.8.0_121 / jre / bin
  4. Jalankan perintah keytool dari dalamnya, di mana Anda memberikan path ke Cert baru Anda di akhir, seperti:

    ./keytool.exe -import -trustcacerts -keystore ../lib/security/cacerts  -storepass changeit -noprompt -alias myownaliasformysystem -file "D:\Stuff\saved-certs\ca.cert"

Perhatikan, karena jika ini di bawah Cygwin Anda memberikan path ke program non-Cygwin, sehingga path tersebut seperti-DOS dan dalam tanda kutip.

Jordan Gee
sumber
0

Mungkin ingin mencoba

keytool -import -trustcacerts -noprompt -keystore <full path to cacerts> -storepass changeit -alias $REMHOST -file $REMHOST.pem

saya benar-benar tidak tahu di mana ia meletakkan sertifikat Anda jika Anda hanya menulis cacertscukup berikan jalan penuh

Gradien
sumber
0

instal sertifikat di java linux

/ opt / jdk (versi) / bin / keytool -import -alias aliasname -file Certificate.cer -keystore cacerts -storepass password

Apuri Srikanth
sumber
0
fist get the certificate from the provider
create a file ends wirth .cer and pase the certificate

copy the text file or  past   it  somewhere you can access it 
then use the cmd prompt as an admin and cd to the bin of the jdk,
the cammand that will be used is the:  keytool 

change the  password of the keystore with :

keytool  -storepasswd -keystore "path of the key store from c\ and down"

the password is : changeit 
 then you will be asked to enter the new password twice 

then type the following :

keytool -importcert -file  "C:\Program Files\Java\jdk-13.0.2\lib\security\certificateFile.cer"   -alias chooseAname -keystore  "C:\Program Files\Java\jdk-13.0.2\lib\security\cacerts"
Hilal Aissani
sumber