Jak poprawnie zaimportować samopodpisany certyfikat do magazynu kluczy Java, który jest domyślnie dostępny dla wszystkich aplikacji Java?

144

Chcę zaimportować certyfikat z podpisem własnym do Javy, aby każda aplikacja Java, która spróbuje nawiązać połączenie SSL, będzie ufać temu certyfikatowi.

Do tej pory udało mi się go zaimportować

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

Mimo to, kiedy próbuję uciec HTTPSClient.class, nadal otrzymuję:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: Tworzenie ścieżki PKIX nie powiodło się: sun.security.provider.certpath.SunCertPathBuilderException: nie można znaleźć prawidłowej ścieżki certyfikacji do żądanego celu
sorin
źródło
Nie musiałbym koniecznie polegać na tym kodzie. Takie rzeczy Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider())są zupełnie niepotrzebne w pierwszej części. Drugi nie przeprowadza żadnej weryfikacji certyfikatu. URLConnectionZacznij od prostego . Czy na pewno zostały zmodyfikowane cacertsw lib/securityswojej instalacji JRE? Czy próbowałeś trustmanageropcji debugowania ?
Bruno

Odpowiedzi:

225

W systemie Windows najłatwiej jest użyć portu programu .

  1. Pobierz i zainstaluj portecle.
  2. Najpierw upewnij się w 100%, że wiesz, które środowisko JRE lub JDK jest używane do uruchamiania programu. W 64-bitowym systemie Windows 7 może istnieć sporo środowisk JRE. Process Explorer może Ci w tym pomóc lub możesz użyć:System.out.println(System.getProperty("java.home"));
  3. Skopiuj plik JAVA_HOME \ lib \ security \ cacerts do innego folderu.
  4. W Portecle kliknij Plik> Otwórz plik kluczy
  5. Wybierz plik cacerts
  6. Wpisz to hasło: changeit
  7. Kliknij Narzędzia> Importuj zaufany certyfikat
  8. Wyszukaj plik mycertificate.pem
  9. Kliknij Importuj
  10. Kliknij przycisk OK, aby wyświetlić ostrzeżenie dotyczące ścieżki zaufania.
  11. Kliknij OK, gdy zostaną wyświetlone szczegółowe informacje o certyfikacie.
  12. Kliknij Tak, aby zaakceptować certyfikat jako zaufany.
  13. Gdy zapyta o alias, kliknij OK i kliknij ponownie OK, gdy powie, że zaimportował certyfikat.
  14. Kliknij zapisz. Nie zapomnij o tym, inaczej zmiana zostanie odrzucona.
  15. Skopiuj plik z powrotem tam, gdzie go znalazłeś.

W systemie Linux:

Możesz pobrać certyfikat SSL z serwera internetowego, który już go używa:

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

Opcjonalnie zweryfikuj informacje o certyfikacie:

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

Zaimportuj certyfikat do magazynu kluczy Java Cacerts:

$ keytool -import -trustcacerts -keystore /opt/java/jre/lib/security/cacerts \
   -storepass changeit -noprompt -alias mycert -file /tmp/examplecert.crt
Sarel Botha
źródło
1
Głównym pomysłem nie jest portecle, ale importowanie certyfikatów do odpowiedniego magazynu kluczy.
Alfabravo
To zadziałało, ale moja java była w innej lokalizacji. Mój magazyn kluczy znajdował się w / usr / lib / jvm / java-openjdk / jre / lib / security / cacerts, które znalazłem uruchamiając, ps -ef | grep javaco powiedziało mi, że moja java działa z openjdk znajdującego się w / usr / lib / jvm / java-openjdk / bin / java. Ponadto, jeśli tak jest w przypadku aplikacji internetowej, pamiętaj o ponownym uruchomieniu. Dzięki za pomoc!!
Codezilla
7
Nie używałem portecle, ale odkryłem, że Keystore Explorer działa całkiem nieźle w systemach Windows, Linux (i powinien działać również na OSX)
Xantix
Rzeczywiście bardzo pomocne. Podkreślono tutaj dwie bardzo ważne rzeczy. Pierwsza dotyczy importowania do odpowiedniego magazynu kluczy. Kolejnym jest upewnienie się, że uruchomisz się ponownie w przypadku serwera internetowego.
sdm
6
W 2019 roku możemy nawet zdobyć certyfikaty SSL za darmo, korzystając z usług takich jak 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"
Vikky
źródło
12
Zostaniesz poproszony o podanie hasła do magazynu kluczy, domyślne ustawienie to „changeit”
The Gilbert Arenas Dagger
34

Skończyło się na napisaniu małego skryptu, który dodaje certyfikaty do magazynów kluczy, więc jest znacznie łatwiejszy w użyciu.

Możesz pobrać najnowszą wersję z 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
źródło
18

To zadziałało dla mnie. :)

sudo keytool -importcert -file filename.cer -alias randomaliasname -keystore $ JAVA_HOME / jre / lib / security / cacerts -storepass changeit 
Spacerować
źródło
4

Jeśli używasz certyfikatu podpisanego przez urząd certyfikacji, który domyślnie nie znajduje się w pliku Java cacerts, musisz wykonać następującą konfigurację połączeń HTTPS. Aby zaimportować certyfikaty do cacerts:

  1. Otwórz Eksploratora Windows i przejdź do pliku cacerts, który znajduje się w podfolderze jre \ lib \ security, w którym jest zainstalowany klient AX Core. Domyślna lokalizacja to C: \ Program Files \ ACL Software \ AX Core Client \ jre \ lib \ security
  2. Utwórz kopię zapasową pliku przed wprowadzeniem jakichkolwiek zmian.
  3. W zależności od certyfikatów otrzymanych od urzędu certyfikacji, którego używasz, może być konieczne zaimportowanie certyfikatu pośredniego i / lub certyfikatu głównego do pliku cacerts. Aby zaimportować certyfikaty, użyj następującej składni: keytool -import -alias -keystore -trustcacerts -file
  4. Jeśli importujesz oba certyfikaty, alias określony dla każdego certyfikatu powinien być unikalny.
  5. Wpisz hasło do magazynu kluczy po wyświetleniu monitu „Hasło” i naciśnij klawisz Enter. Domyślne hasło Java dla pliku cacerts to „changeit”. Wpisz „y” w polu „Ufać temu certyfikatowi?” monit i naciśnij klawisz Enter.
Bharat Darakh
źródło
Użyj tego polecenia: -> keytool -import -alias <alias> -keystore <cacerts_file> -trustcacerts -file <certificate_filename>
Bharat Darakh
1

Proste polecenie „keytool” działa również w systemie Windows i / lub z Cygwin.

JEŚLI używasz Cygwin tutaj, jest zmodyfikowane polecenie, którego użyłem od dołu odpowiedzi „S.Botha”:

  1. upewnij się, że zidentyfikowałeś JRE wewnątrz JDK, którego będziesz używać
  2. Uruchom swój znak zachęty / cygwin jako administrator
  3. przejdź do katalogu bin tego JDK, np. cd / cygdrive / c / Program \ Files / Java / jdk1.8.0_121 / jre / bin
  4. Wykonaj polecenie keytool z jego wnętrza, gdzie na końcu podajesz ścieżkę do nowego certyfikatu, na przykład:

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

Zauważ, ponieważ jeśli jest to pod Cygwin, podajesz ścieżkę do programu innego niż Cygwin, więc ścieżka jest podobna do DOS i jest ujęta w cudzysłowy.

Jordan Gee
źródło
0

Może zechcesz spróbować

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

Szczerze mówiąc, nie mam pojęcia, gdzie znajduje się twój certyfikat, jeśli po prostu napiszesz, cacertspo prostu podaj mu pełną ścieżkę

Gradient
źródło
0

zainstaluj certyfikat w java linux

/ opt / jdk (wersja) / bin / keytool -import -alias aliasname -file certificate.cer -keystore cacerts -storepass hasło

Apuri Srikanth
źródło
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
źródło