Як правильно імпортувати самопідписаний сертифікат у сховище 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())і зовсім непотрібні в першій частині. Друга не проводить ніякої перевірки cert. Спробуйте з звичайної URLConnectionдля початку. Ви впевнені, що ви модифікували cacertsв lib/securityвашій установці JRE? Ви спробували trustmanagerваріант налагодження ?
Бруно

Відповіді:


225

У Windows найпростіший спосіб - це використання програмного порталу .

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

У 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:

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

1
Основна ідея цього - це не portecle, а імпорт сертифікатів у потрібну сховище ключів.
Альфабраво

Це спрацювало, але моя ява була в іншому місці. Мій сховище ключів знаходилось за адресою / usr / lib / jvm / java-openjdk / jre / lib / security / cacerts, яке я знайшов, запустивши, ps -ef | grep javaякий сказав мені, що моя Java працює з openjdk, що знаходиться за адресою / usr / lib / jvm / java-openjdk / бін / джава. Крім того, якщо це, якщо для веб-сайту не забудьте перезапустити. Дякую за допомогу!!
Codezilla

7
Я не використовував portecle, але виявив, що Keystore Explorer працює досить добре для Windows, Linux (і він також повинен працювати на OSX)
Xantix

Насправді дуже корисно. Тут виділено 2 дуже важливі речі. Перший - про імпорт у потрібну сховище ключів. І ще один - переконатись про перезапуск у випадку веб-сервера.
sdm

6
У 2019 році ми навіть можемо отримати сертифікати SSL безкоштовно за допомогою таких послуг, як 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
Вам буде запропоновано пароль для зберігання ключів, за замовчуванням - "changeit"
Кинджал Гілберта Аренаса

34

Я закінчив писати невеликий сценарій, який додає сертифікати до магазинів ключів, тому це набагато простіше у використанні.

Отримати останню версію можна за посиланням 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

`` `


18

Це працювало для мене. :)

sudo keytool -importcert -файл файлу.cer -alias randomaliasname -keystore $ JAVA_HOME / jre / lib / безпека / cacerts -затримка зміни 

4

Якщо ви використовуєте сертифікат, підписаний органом сертифікації, який за замовчуванням не включений у файл файлів Java, вам потрібно виконати наступну конфігурацію для з'єднань HTTPS. Щоб імпортувати сертифікати в касети:

  1. Відкрийте Провідник Windows і перейдіть до файлу cacerts, який знаходиться в підпапці jre \ lib \ security, де встановлений AX Core Client. Місце за замовчуванням - C: \ Program Files \ ACL Software \ AX Core Client \ jre \ lib \ security
  2. Створіть резервну копію файлу, перш ніж вносити будь-які зміни.
  3. Залежно від сертифікатів, які ви отримуєте від використовуваного вами сертифікаційного органу, вам може знадобитися імпортувати проміжний сертифікат та / або кореневий сертифікат у файл кесерів. Використовуйте такий синтаксис для імпорту сертифікатів: keytool -import -alias -keystore -trustcacerts -file
  4. Якщо ви імпортуєте обидва сертифікати, псевдонім, вказаний для кожного сертифіката, повинен бути унікальним.
  5. Введіть пароль для зберігання ключів у вікні «Пароль» та натисніть Enter. Типовим паролем Java для файлу касертів є "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. зайдіть у каталог бін цього JDK, наприклад, cd / cygdrive / c / Program \ Files / Java / jdk1.8.0_121 / jre / bin
  4. Виконайте команду keytool зсередини, де ви в кінці надаєте шлях до нового Cert, наприклад:

    ./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 aliasname -file certificate.cer -keystore cacerts -захід пароля


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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.