Как правильно импортировать самоподписанный сертификат в хранилище ключей Java, которое по умолчанию доступно всем приложениям Java?

144

Я хочу импортировать самоподписанный сертификат в 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: sun.security.provider.certpath.SunCertPathBuilderException: невозможно найти действительный путь сертификации для запрошенной цели
Сорин
источник
Я не обязательно буду полагаться на этот код. Такие вещи Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider())совершенно не нужны в первой части. Второй не делает какой-либо проверки подлинности. Попробуйте URLConnectionначать с простого . Вы уверены, что вы модифицировали cacertsв lib/securityвашей установке JRE? Вы пробовали trustmanagerвариант отладки ?
Бруно

Ответы:

224

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

  1. Скачайте и установите Portecle.
  2. Сначала убедитесь, что вы знаете, какой JRE или JDK используется для запуска вашей программы. На 64-битной Windows 7 может быть довольно много JRE. Process Explorer может помочь вам в этом, или вы можете использовать:System.out.println(System.getProperty("java.home"));
  3. Скопируйте файл JAVA_HOME \ lib \ security \ cacerts в другую папку.
  4. В Portecle выберите Файл> Открыть файл хранилища ключей.
  5. Выберите файл cacerts
  6. Введите этот пароль: changeit
  7. Нажмите Инструменты> Импортировать доверенный сертификат
  8. Найдите файл mycertificate.pem
  9. Нажмите Импорт
  10. Нажмите OK для предупреждения о пути доверия.
  11. Нажмите OK, когда отобразятся сведения о сертификате.
  12. Нажмите Да, чтобы принять сертификат как доверенный.
  13. Когда он запрашивает псевдоним, нажмите OK и снова нажмите OK, когда он говорит, что импортировал сертификат.
  14. Нажмите сохранить. Не забывайте об этом, или изменение отменяется.
  15. Скопируйте файл cacerts туда, где вы его нашли.

В 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
Сарел Бота
источник
1
Основная идея заключается не в переносчике, а в импорте сертификатов в правильное хранилище ключей.
Альфабраво
Это сработало, но ява была в другом месте. Мой склад ключей был расположен в / usr / lib / jvm / java-openjdk / jre / lib / security / cacerts, который я обнаружил, запустив, ps -ef | grep javaкоторый сказал мне, что мой java запускается из openjdk, расположенного в / usr / lib / jvm / java-openjdk / бен / Java. Кроме того, если это для веб-приложения, не забудьте перезапустить. Спасибо за помощь!!
Codezilla
7
Я не использовал portecle, но обнаружил, что Keystore Explorer работает довольно хорошо для Windows, Linux (и он должен работать и для OSX)
Xantix
Очень полезно на самом деле. 2 очень важные вещи выделены здесь. Один из них об импорте в правильное хранилище ключей. И еще один, чтобы убедиться, что перезагрузить в случае веб-сервера.
SDM
6
В 2019 году мы даже можем бесплатно получить SSL-сертификаты, используя такие сервисы, как Lets
encrypt
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
источник
12
Вам будет предложено ввести пароль хранилища ключей, по умолчанию «changeit»
The Gilbert Arenas Dagger
33

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

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

`` `

Сорин
источник
"sudo keytool" NOPE
Dragas
17

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

sudo keytool -importcert -file filename.cer -alias randomaliasname -keystore $ JAVA_HOME / jre / lib / security / cacerts -storepass changeit 
Ходить
источник
4

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

  1. Откройте проводник Windows и перейдите к файлу cacerts, который находится в подпапке jre \ lib \ security, где установлен AX Core Client. Расположение по умолчанию: C: \ Program Files \ ACL Software \ AX Core Client \ jre \ lib \ security
  2. Создайте резервную копию файла, прежде чем вносить какие-либо изменения.
  3. В зависимости от сертификатов, которые вы получаете от центра сертификации, который вы используете, вам может потребоваться импортировать промежуточный сертификат и / или корневой сертификат в файл cacerts. Используйте следующий синтаксис для импорта сертификатов: keytool -import -alias -keystore -trustcacerts -file
  4. Если вы импортируете оба сертификата, псевдоним, указанный для каждого сертификата, должен быть уникальным.
  5. Введите пароль для хранилища ключей в строке «Пароль» и нажмите Enter. Пароль Java по умолчанию для файла cacerts - «changeit». Напечатайте 'y' в “Доверять этому сертификату?” предложите и нажмите Enter.
Бхарат Дарах
источник
Используйте эту команду: -> keytool -import -alias <alias> -keystore <cacerts_file> -trustcacerts -file <certificate_filename>
Бхарат Дарах
1

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

Если вы используете Cygwin, вот модифицированная команда, которую я использовал в нижней части ответа "S.Botha":

  1. убедитесь, что вы указали JRE внутри JDK, который вы будете использовать
  2. Запустите вашу подсказку / cygwin как администратор
  3. перейдите в каталог bin этого JDK, например, cd / cygdrive / c / Program \ Files / Java / jdk1.8.0_121 / jre / bin
  4. Выполните команду keytool изнутри, где в конце укажите путь к вашему новому сертификату, например, так:

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

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

Джордан Джи
источник
0

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

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

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

градиент
источник
0

установить сертификат в Java Linux

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

Апури Срикант
источник
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"
Хилал Айссани
источник