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

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

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

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

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

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

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

Ответ 1

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

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

Ответ 2

Вот код, который я использовал для программного импорта файлов .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);
}

Ответ 3

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

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

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

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

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

Ответ 6

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

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

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

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

Ответ 7

Здесь script Я использовал для пакетного импорта кучу 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

Ответ 8

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

Проводник KeyStore

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

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

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

[email protected]:~$./Downloads/kse-521/kse.sh

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

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

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

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