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

StackOverflow https://stackoverflow.com/questions/4325263

  •  29-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

    keytool -importcert -file certificate.cer -keystore keystore.jks -alias "Alias" 
    

Другие советы

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

  1. Перейти к вашей java_home\jre\lib\security
  2. (Окна) Откройте командную строку администратора, используя cmd и Ctrl+СДВИГ+ВОЙТИ
  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.

Вот код, который я использовал для программного импорта .CER -файлов в новый магазин ключей.

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);
}

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

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

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

Инструмент с графическим интерфейсом с открытым исходным кодом доступен на KeyStore-Explorer.org

Keystore Explorer

KeyStore Explorer-это замена графического интерфейса с открытым исходным интерфейсом для утилиты командной строки Java Keytool и Jarsigner. Keystore Explorer представляет свою функциональность, а также в других, через интуитивно понятный графический пользовательский интерфейс.

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

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

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

enter image description here

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

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

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

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

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

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

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

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

Вот сценарий, который я использовал для того, чтобы выпить импорт кучу файлов 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. Сохранить как .txt Данные сертификата в следующем формате в текстовом редакторе

    ----- Сертификат начала ----- [данные, сериализованные Microsoft] ----- End Сертификат -----

  2. Откройте браузер Chrome (этот шаг также может работать с другими браузерами) Настройки> Показать расширенные настройки> HTTPS/SSL> Управление сертификатами импортируйте .txt в шаге 1
  3. Выберите и экспортируйте этот сертификат в кодированном формате Base-64. Сохраните это как .cer
  4. Теперь вы можете использовать KeyTool или Portecle, чтобы импортировать его в свой магазин ключей Java
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top