Вопрос по java, ssl-certificate, keytool, keystore, certificate – Как правильно импортировать самоподписанный сертификат в хранилище ключей Java, которое по умолчанию доступно всем приложениям Java?

118

Я хочу импортировать самоподписанный сертификат в Java, поэтому любое приложение Java, которое попытается установить соединение SSL, будет доверять этому сертификату.

Пока мне удалось импортировать его в

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

Тем не менее, когда я пытаюсь бежатьHTTPSClient.class Я все еще получаю:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Я не обязательно буду полагаться на этот код. Вещи какSecurity.addProvider(new com.sun.net.ssl.internal.ssl.Provider()) совершенно не нужны в первой части. Вторая не выполняет какой-либо проверки подлинности. Попробуй с равнинойURLConnection начать с. Вы уверены, что изменили?cacerts вlib/security вашей установки JRE? Вы пробовалиtrustmanager debugging option? Bruno

Ваш Ответ

8   ответов
0

Могу попробовать

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

я, честно говоря, понятия не имею, где он помещает ваш сертификат, если вы просто пишетеcacerts просто дайте ему полный путь

31

В итоге я написал небольшой скрипт, который добавляет сертификаты в хранилища ключей, так что его гораздо проще использовать.

Вы можете получить последнюю версию от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

```

194

On Windows самый простой способ - использовать программуportecle.

  1. Download and install portecle.
  2. First make 100% sure you know which JRE or JDK is being used to run your program. On a 64 bit Windows 7 there could be quite a few JREs. Process Explorer can help you with this or you can use: System.out.println(System.getProperty("java.home"));
  3. Copy the file JAVA_HOME\lib\security\cacerts to another folder.
  4. In Portecle click File > Open Keystore File
  5. Select the cacerts file
  6. Enter this password: changeit
  7. Click Tools > Import Trusted Certificate
  8. Browse for the file mycertificate.pem
  9. Click Import
  10. Click OK for the warning about the trust path.
  11. Click OK when it displays the details about the certificate.
  12. Click Yes to accept the certificate as trusted.
  13. When it asks for an alias click OK and click OK again when it says it has imported the certificate.
  14. Click save. Don’t forget this or the change is discarded.
  15. Copy the file cacerts back where you found it.

On Linux:

Вы можете загрузить сертификат SSL с веб-сервера, который уже использует его, следующим образом:

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

При желании проверьте информацию сертификата:

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

Импортируйте сертификат в хранилище ключей Java cacerts:

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

Редактировать:

В наши дни нам часто не нужно добавлять сертификат в хранилище ключей, потому что вы можете получить сертификат на 5 долларов в год отssls.com, На всякий случай это вариант для вас.

Основная идея заключается не в переносчике, а в импорте сертификатов в правильное хранилище ключей.
Просто для завершения используйте$ sudo keytool -list -keystore cacerts | grep mycert чтобы проверить, был ли импорт успешным. Добавьте параметр -v, чтобы список сертификатов был более подробным.
Это сработало, но ява была в другом месте. Мой склад ключей был расположен в / usr / lib / jvm / java-openjdk / jre / lib / security / cacerts, который я нашел, запустивps -ef | grep java который сказал мне, что мой java был запущен из openjdk, расположенного в / usr / lib / jvm / java-openjdk / bin / java. Кроме того, если это для веб-приложения, не забудьте перезапустить. Спасибо за помощь!!
Очень полезно на самом деле. 2 очень важные вещи выделены здесь. Один из них об импорте в правильное хранилище ключей. И еще один, чтобы убедиться, что перезагрузить в случае веб-сервера.
Я не использовал Portecle, но обнаружил, чтоKeystore Explorer работает довольно хорошо для Windows, Linux (и должно работать на OSX)
29
    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"
Вам будет предложено ввести пароль хранилища ключей, по умолчанию это «changeit».
0

install certificate in java linux

/ opt / jdk (версия) / bin / keytool -import -alias псевдоним -file certificate.cer -keystore cacerts -storepass пароль

4

Если вы используете сертификат, подписанный центром сертификации, который по умолчанию не включен в файл Java cacerts, вам необходимо выполнить следующую настройку для соединений HTTPS. Чтобы импортировать сертификаты в кассы:

  1. Open Windows Explorer and navigate to the cacerts file, which is located in the jre\lib\security subfolder where AX Core Client is installed. The default location is C:\Program Files\ACL Software\AX Core Client\jre\lib\security
  2. Create a backup copy of the file before making any changes.
  3. Depending on the certificates you receive from the Certificate Authority you are using, you may need to import an intermediate certificate and/or root certificate into the cacerts file. Use the following syntax to import certificates: keytool -import -alias -keystore -trustcacerts -file
  4. If you are importing both certificates the alias specified for each certificate should be unique.
  5. Type the password for the keystore at the “Password” prompt and press Enter. The default Java password for the cacerts file is “changeit”. Type ‘y’ at the “Trust this certificate?” prompt and press Enter.
Используйте эту команду: - & gt; keytool -import -alias & lt; alias & gt; -keystore & lt; cacerts_file & gt; -trustcacerts -file & lt; certificate_filename & gt;
10

Это сработало для меня. :)

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

Простая команда «keytool» также работает на Windows и / или с Cygwin.

IF you're using Cygwin вот модифицированная команда, которую я использовал снизу от "S.Botha" s " ответ :

  1. make sure you identify the JRE inside the JDK that you will be using
  2. Start your prompt/cygwin as admin
  3. go inside the bin directory of that JDK e.g. cd /cygdrive/c/Program\ Files/Java/jdk1.8.0_121/jre/bin
  4. Execute the keytool command from inside it, where you provide the path to your new Cert at the end, like so:

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

Заметьте, потому что, если это в Cygwin, вы даете путь к не-Cygwin программе, поэтому путь подобен DOS и указан в кавычках.

Похожие вопросы