Как импортировать сертификат .cer в хранилище ключей Java?
-
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
Работал для меня, в отличие от попыток генерировать и использовать мой собственный магазин ключей.
- Перейти к вашей
java_home\jre\lib\security
- (Окна) Откройте командную строку администратора, используя
cmd
и Ctrl+СДВИГ+ВОЙТИ - Запустите 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
И иди Examine
и Examine a URL
Опция, а затем дайте веб -URL, который вы хотите импортировать.
Окно результата будет похоже на ниже, если вы дадите ссылку на сайт Google.
Это один из вариантов использования, и отдых-это пользователь (все кредиты идут в 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
Вот как это сработало для меня:
- Сохранить как .txt Данные сертификата в следующем формате в текстовом редакторе
----- Сертификат начала ----- [данные, сериализованные Microsoft] ----- End Сертификат -----
- Откройте браузер Chrome (этот шаг также может работать с другими браузерами) Настройки> Показать расширенные настройки> HTTPS/SSL> Управление сертификатами импортируйте .txt в шаге 1
- Выберите и экспортируйте этот сертификат в кодированном формате Base-64. Сохраните это как .cer
- Теперь вы можете использовать KeyTool или Portecle, чтобы импортировать его в свой магазин ключей Java