Kendinden atanmış bir sertifikayı varsayılan olarak tüm Java uygulamaları tarafından kullanılabilen Java anahtar deposuna nasıl doğru şekilde aktarabilirim?


144

SSL bağlantısı kurmaya çalışan herhangi bir Java uygulamasının bu sertifikaya güvenmesi için Java'ya kendinden imzalı bir sertifika almak istiyorum.

Şimdiye kadar içeri aktarmayı başardım

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

Yine de, koşmaya çalıştığımda HTTPSClient.classhala alıyorum:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX yolu oluşturma başarısız oldu: sun.security.provider.certpath.SunCertPathBuilderException: istenen hedefe geçerli sertifika yolu bulunamadı

Mutlaka bu koda güvenmem. Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider())İlk kısımda gibi şeyler tamamen gereksizdir. İkincisi hiçbir sertifika doğrulaması yapmaz. URLConnectionBaşlamak için bir düz ile deneyin . Eğer modifiye ettik eminiz cacertsiçinde lib/securityJRE yüklemesinin? trustmanagerHata ayıklama seçeneğini denediniz mi?
Bruno

Yanıtlar:


224

Windows'ta en kolay yol, program portresini kullanmaktır .

  1. Portecle'ı indirin ve yükleyin.
  2. Öncelikle programınızı çalıştırmak için hangi JRE veya JDK'nın kullanıldığını bildiğinizden% 100 emin olun. 64 bit Windows 7'de birkaç JRE olabilir. Process Explorer bu konuda size yardımcı olabilir veya şunları kullanabilirsiniz:System.out.println(System.getProperty("java.home"));
  3. JAVA_HOME \ lib \ security \ cacerts dosyasını başka bir klasöre kopyalayın.
  4. Portecle'de Dosya> Anahtar Deposu Dosyasını Aç'ı tıklayın.
  5. Cacerts dosyasını seçin
  6. Bu şifreyi girin: changeit
  7. Araçlar> Güvenilir Sertifikayı İçe Aktar'ı tıklayın
  8. Dosyaya göz at mycertificate.pem
  9. İçe Aktar'ı tıklayın
  10. Güven yolu hakkında uyarı için Tamam'ı tıklatın.
  11. Sertifika ile ilgili ayrıntıları görüntülediğinde Tamam'ı tıklatın.
  12. Sertifikayı güvenilir olarak kabul etmek için Evet'i tıklayın.
  13. Bir takma ad istediğinde, sertifikayı içe aktardığını söylediğinde Tamam'ı ve tekrar Tamam'ı tıklatın.
  14. Kaydet'i tıklayın. Bunu unutmayın ya da değişiklik silinir.
  15. Dosya cacerts'i bulduğunuz yere geri kopyalayın.

Linux'ta:

SSL sertifikasını zaten şu şekilde kullanan bir web sunucusundan indirebilirsiniz:

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

İsteğe bağlı olarak sertifika bilgilerini doğrulayın:

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

Sertifikayı Java cacerts anahtar deposuna alın:

$ keytool -import -trustcacerts -keystore /opt/java/jre/lib/security/cacerts \
   -storepass changeit -noprompt -alias mycert -file /tmp/examplecert.crt

1
Buradaki ana fikir portecle değil, sertifikaları doğru anahtar deposuna aktarmaktır.
Alfabravo

Bu çalıştı, ama benim java farklı bir konumda idi. Benim deposu / usr / lib / jvm / java-OpenJDK / jre / lib / security / Kaçmaktan tarafından bulunan cacerts de bulunduğu ps -ef | grep javabenim java / usr / lib / jvm / java-OpenJDK bulunan OpenJDK kaçıyordu söyledi / bin / java. Ayrıca, eğer bu bir webapp için yeniden başlatmayı unutmayın. Yardım için teşekkürler!!
Codezilla

7
Portecle kullanmadım, ancak Keystore Explorer'ın Windows, Linux için oldukça iyi çalıştığını gördüm (ve OSX'te de çalışması gerekir)
Xantix

Gerçekten çok yardımcı. Burada vurgulanan 2 çok önemli şey. Bunlardan biri doğru anahtar deposuna içe aktarma ile ilgilidir. Bir diğeri ise bir web sunucusu durumunda yeniden başlattığınızdan emin olmaktır.
sdm

6
2019'da, Lets encrypt
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"

12
Anahtar deposu şifresi istenecektir, varsayılan "changeit" dir
Gilbert Arenas Dagger

33

Anahtar depolarına sertifika ekleyen küçük bir komut dosyası yazdım, bu yüzden kullanımı çok daha kolay.

En son sürümü https://github.com/ssbarnea/keytool-trust adresinden edinebilirsiniz.

#!/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

`


"sudo keytool" NOPE
Dragas

17

Bu benim için çalıştı. :)

sudo keytool -importcert -file dosyaadı.cer -alias randomaliasname -keystore $ JAVA_HOME / jre / lib / security / cacerts -storepass changeit 

4

Varsayılan olarak Java cacerts dosyasına dahil edilmeyen bir Sertifika Yetkilisi tarafından imzalanmış bir sertifika kullanıyorsanız, HTTPS bağlantıları için aşağıdaki yapılandırmayı tamamlamanız gerekir. Sertifikaları cacerts'e aktarmak için:

  1. Windows Gezgini'ni açın ve AX Core Client'ın yüklü olduğu jre \ lib \ security alt klasöründe bulunan cacerts dosyasına gidin. Varsayılan konum şudur: C: \ Program Files \ ACL Software \ AX Core Client \ jre \ lib \ security
  2. Herhangi bir değişiklik yapmadan önce dosyanın yedek bir kopyasını oluşturun.
  3. Kullandığınız Sertifika Yetkilisi'nden aldığınız sertifikalara bağlı olarak, cacerts dosyasına bir ara sertifika ve / veya kök sertifika almanız gerekebilir. Sertifikaları içe aktarmak için aşağıdaki sözdizimini kullanın: keytool -import -alias -keystore -trustcacerts -file
  4. Her iki sertifikayı da içe aktarıyorsanız, her sertifika için belirtilen diğer ad benzersiz olmalıdır.
  5. Anahtar deposu için parolayı “Parola” istemine yazın ve Enter tuşuna basın. Cacerts dosyası için varsayılan Java parolası “changeit” tir. “Bu sertifikaya güvenilsin mi?” Alanına 'y' yazın. isteminde Enter tuşuna basın.

Bu komutu kullanın: -> keytool -import -alias <alias> -keystore <cacerts_file> -trustcacerts -file <certificate_filename>
Bharat Darakh

1

Basit 'keytool' komutu Windows ve / veya Cygwin ile de çalışır.

Cygwin kullanıyorsanız , burada "S.Botha" cevabının altından kullandığım değiştirilmiş komut:

  1. kullanacağınız JDK içindeki JRE'yi tanımladığınızdan emin olun
  2. İstemi / cygwin'i yönetici olarak başlatın
  3. o JDK'nin bin dizinine gidin, örneğin cd / cygdrive / c / Program \ Files / Java / jdk1.8.0_121 / jre / bin
  4. Keytool komutunu, içinden yeni Cert'inize giden yolu sağladığınız şekilde yürütün:

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

Dikkat edin, çünkü bu Cygwin altındaysa, Cygwin olmayan bir programa yol veriyorsunuz, bu nedenle yol DOS benzeri ve tırnak işaretleri içinde.


0

Denemek isteyebilir

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

dürüstçe cacertssadece tam bir yol vermek yazmak eğer sertifika nereye koyar hakkında hiçbir fikrim yok


0

java linux'a sertifika yükle

/ opt / jdk (sürüm) / bin / keytool -import -alias takma adı -file certificate.cer -keystore cacerts -storepass parolası


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"
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.