Как импортировать сертификат .cer в хранилище ключей Java?

226

Во время разработки клиента веб-сервиса Java я столкнулся с проблемой. Аутентификация для веб-сервиса использует сертификат клиента, имя пользователя и пароль. Клиентский сертификат, полученный от компании за веб-сервисом, имеет .cerформат. Когда я проверяю файл с помощью текстового редактора, он имеет следующее содержимое:

-----BEGIN CERTIFICATE-----
[Some base64 encoded data]
-----END CERTIFICATE-----

Я могу импортировать этот файл в качестве сертификата в Internet Explorer (без необходимости ввода пароля!) И использовать его для аутентификации в веб-сервисе.

Мне удалось импортировать этот сертификат в хранилище ключей, сначала обрезав первую и последнюю строку, преобразовав в unix новые строки и выполнив base64-декодирование. Полученный файл можно импортировать в хранилище ключей (используя keytoolкоманду). Когда я перечисляю записи в хранилище ключей, эта запись имеет тип trustedCertEntry. Из-за этого типа записи (?) Я не могу использовать этот сертификат для аутентификации в веб-сервисе. Я начинаю думать, что предоставленный сертификат является публичным сертификатом, который используется для аутентификации ...

Обходной путь, который я нашел, состоит в том, чтобы импортировать сертификат в IE и экспортировать его как .pfxфайл. Этот файл может быть загружен как хранилище ключей и может использоваться для аутентификации с помощью веб-службы. Однако я не могу ожидать, что мои клиенты будут выполнять эти шаги каждый раз, когда они получают новый сертификат. Поэтому я хотел бы загрузить .cerфайл непосредственно в Java. Есть предположения?

Дополнительная информация: компания, стоящая за веб-сервисом, сказала мне, что сертификат следует запрашивать (используя IE и веб-сайт) с ПК и пользователя, который позже импортирует сертификат.

Jan-Pieter
источник

Ответы:

317
  • Если вы хотите пройти аутентификацию, вам нужен закрытый ключ - другого варианта нет.
  • Сертификат - это открытый ключ с дополнительными свойствами (такими как название компании, страна, ...), который подписан неким центром сертификации, который гарантирует, что присоединенные свойства являются истинными.
  • .CERфайлы являются сертификатами и не имеют закрытого ключа. Закрытый ключ .PFX keystoreобычно предоставляется с файлом. Если вы действительно аутентифицируетесь, это потому что вы уже импортировали закрытый ключ.
  • Вы обычно можете импортировать .CERсертификаты без проблем с

    keytool -importcert -file certificate.cer -keystore keystore.jks -alias "Alias" 
lujop
источник
3
Оказывается, закрытый ключ генерируется плагином для IE. Единственное решение на данный момент - импортировать сертификат в IE и экспортировать файл .pfx.
Январь-Питер
5
Файлы .CER имеют открытый ключ. У них нет закрытого ключа. Предложить редактирование ..
KyleM
6
Что здесь делает -alias?
хоп
5
:( -> ошибка keytool: java.lang.Exception: введите не сертификат X.509
некромант
1
@hop У хранилища ключей Java может быть несколько сертификатов, каждый из которых имеет свой псевдоним для его идентификации. Вы можете использовать его в качестве справочного материала для его идентификации и / или программного извлечения по псевдониму.
Lujop
85

Импортирование .cerфайла сертификата, загруженного из браузера (откройте url и копайте подробности) в хранилище ключей cacerts,java_home\jre\lib\security работало для меня, в отличие от попыток создать и использовать мое собственное хранилище ключей.

  1. Перейти к вашей java_home\jre\lib\security
  2. ( Windows ) Откройте там командную строку администратора с помощью cmdи CTRL+ SHIFT+ENTER
  3. Запустите keytool для импорта сертификата:
    • (Заменить yourAliasNameи path\to\certificate.cerсоответственно)

 ..\..\bin\keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias yourAliasName -file path\to\certificate.cer

Таким образом, вам не нужно указывать какие-либо дополнительные параметры JVM, и сертификат должен быть распознан JRE.

jediz
источник
путь \ к \ CE. Если мой файл находится на рабочем столе, как я могу найти его? C: / пользователь / рабочий стол / или ../../../../desktop/filename
Джесси
в MacOS / Linux эта команда работает с sudo. Спасибо. но что такое noprompt param? Я не использовал это и все еще преуспел.
Евгений Мишустин
Обратите внимание, что при использовании JDK для разработки, правильный путь - java_home\jdk_x.xx\jre\lib\security Для абсолютного пути используйте обратную косую черту, например, "C:\myCert.crt"кавычки не обязательны, если путь не содержит пробелов.
Джи-джи
Спасибо миллион раз.
Викингстеве
Вопрос: А как насчет закрытого ключа? Обсуждение о клиентских сертификатах. Насколько я понимаю, нужно создать CSR с закрытым ключом, затем получить сертификат клиента от компании на удаленном веб-сайте, а затем сопоставить сертификат клиента с закрытым ключом. В вашем ответе ничего не говорится о закрытом ключе. Просто спрашиваю.
user2367418
51

Вот код, который я использовал для программного импорта файлов .cer в новый KeyStore.

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
//VERY IMPORTANT.  SOME OF THESE EXIST IN MORE THAN ONE PACKAGE!
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;

//Put everything after here in your function.
KeyStore trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null);//Make an empty store
InputStream fis = /* insert your file path here */;
BufferedInputStream bis = new BufferedInputStream(fis);

CertificateFactory cf = CertificateFactory.getInstance("X.509");

while (bis.available() > 0) {
    Certificate cert = cf.generateCertificate(bis);
    trustStore.setCertificateEntry("fiddler"+bis.available(), cert);
}
Патрик М
источник
20

Вам не нужно вносить какие-либо изменения в сертификат. Вы уверены, что используете правильную команду импорта?

Следующие работы для меня:

keytool -import -alias joe -file mycert.cer -keystore mycerts -storepass changeit

где mycert.cer содержит:

-----BEGIN CERTIFICATE-----
MIIFUTCCBDmgAwIBAgIHK4FgDiVqczANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
BhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAY
...
RLJKd+SjxhLMD2pznKxC/Ztkkcoxaw9u0zVPOPrUtsE/X68Vmv6AEHJ+lWnUaWlf
zLpfMEvelFPYH4NT9mV5wuQ1Pgurf/ydBhPizc0uOCvd6UddJS5rPfVWnuFkgQOk
WmD+yvuojwsL38LPbtrC8SZgPKT3grnLwKu18nm3UN2isuciKPF2spNEFnmCUWDc
MMicbud3twMSO6Zbm3lx6CToNFzP
-----END CERTIFICATE-----
кендырь
источник
2
Когда я пытаюсь импортировать неизмененный сертификат в хранилище ключей, я получаю сообщение об ошибке «ошибка keytool: java.lang.Exception: введите не сертификат X.509». После изменения сертификата, как я описал в своем посте, я могу импортировать сертификат без ошибок с помощью команды, аналогичной вашей. Однако он импортируется какrustCertEntry и не используется при доступе к веб-сервису.
Ян-Питер
Можете ли вы добавить команду исключения к вопросу? Вы уверены, что указали псевдоним в своей команде импорта?
Dogbane
Не забудьте запустить cmd от имени администратора, если вы используете Windows
SilentBob470
9

Инструмент с открытым исходным кодом GUI доступен на keystore-explorer.org

KeyStore Explorer

KeyStore Explorer - это замена графического интерфейса с открытым исходным кодом для утилит командной строки Java keytool и jarsigner. KeyStore Explorer представляет их функциональность и многое другое через интуитивно понятный графический интерфейс пользователя.

Помогут следующие скрины (они с официального сайта)

Экран по умолчанию, который вы получите, выполнив команду:

shantha@shantha:~$./Downloads/kse-521/kse.sh

введите описание изображения здесь

И пойти Examineи Examine a URLвариант , а затем дать веб - адрес , который вы хотите импортировать.

Окно результатов будет, как показано ниже, если вы дадите ссылку на сайт Google. введите описание изображения здесь

Это один из вариантов использования, а остальное зависит от пользователя (все кредиты идут на keystore-explorer.org ).

Шанта Кумара
источник
7

Сертификат, который у вас уже есть, - это, вероятно, сертификат сервера или сертификат, используемый для подписи сертификата сервера. Он понадобится вам, чтобы ваш клиент веб-службы мог аутентифицировать сервер.

Но если дополнительно вам необходимо выполнить аутентификацию клиента с помощью SSL, то вам необходимо получить собственный сертификат для аутентификации клиента веб-службы. Для этого вам необходимо создать запрос на сертификат; Процесс включает в себя создание собственного закрытого ключа и соответствующего открытого ключа, а также присоединение этого открытого ключа вместе с частью вашей информации (адрес электронной почты, имя, доменное имя и т. д.) к файлу, который называется запросом сертификата. Затем вы отправляете этот запрос на сертификат в компанию, которая уже попросила его, и они создадут ваш сертификат, подписав ваш открытый ключ своим закрытым ключом, и отправят вам обратно файл X509 с вашим сертификатом, который вы можете добавьте его в хранилище ключей, и вы будете готовы подключиться к веб-службе с использованием SSL, требующего аутентификации клиента.

Чтобы сгенерировать запрос сертификата, используйте «keytool -certreq -alias -file -keypass -keystore». Отправьте полученный файл в компанию, которая собирается его подписать.

Когда вы вернете свой сертификат, запустите "keytool -importcert -alias -keypass -keystore".

Вам может понадобиться использовать -storepass в обоих случаях, если хранилище ключей защищено (что является хорошей идеей).

Chochos
источник
5

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

./import_all_certs.sh

import_all_certs.sh

KEYSTORE="$(/usr/libexec/java_home)/jre/lib/security/cacerts";

function running_as_root()
{
  if [ "$EUID" -ne 0 ]
    then echo "NO"
    exit
  fi

  echo "YES"
}

function import_certs_to_java_keystore
{
  for crt in *.crt; do 
    echo prepping $crt 
    keytool -import -file $crt -storepass changeit -noprompt --alias alias__${crt} -keystore $KEYSTORE
    echo 
  done
}

if [ "$(running_as_root)" == "YES" ]
then
  import_certs_to_java_keystore
else
  echo "This script needs to be run as root!"
fi
Брэд Паркс
источник
1

Вот как это работает для меня:

  1. Сохранить как .txt данные сертификата в следующем формате в текстовом редакторе

    ----- НАЧАТЬ СЕРТИФИКАТ ----- [данные сериализированы Microsoft] ----- КОНЕЦ СЕРТИФИКАТ -----

  2. Откройте браузер Chrome (этот шаг может работать и с другими браузерами) настройки> показать дополнительные настройки> HTTPS / SSL> управлять сертификатами Импортировать .txt в шаге 1
  3. Выберите и экспортируйте этот сертификат в формате Base-64. Сохранить как .cer
  4. Теперь вы можете использовать keytool или Portecle для импорта в хранилище ключей Java.
code4kix
источник