Как импортировать сертификат.cer в хранилище ключей Java?
Во время разработки клиента веб-сервиса Java я столкнулся с проблемой. Аутентификация для веб-сервиса использует сертификат клиента, имя пользователя и пароль. Клиентский сертификат, полученный от компании за веб-сервисом, находится в .cer
формат. Когда я проверяю файл с помощью текстового редактора, он имеет следующее содержимое:
-----BEGIN CERTIFICATE-----
[Some base64 encoded data]
-----END CERTIFICATE-----
Я могу импортировать этот файл в качестве сертификата в Internet Explorer (без необходимости ввода пароля!) И использовать его для аутентификации в веб-сервисе.
Мне удалось импортировать этот сертификат в хранилище ключей, сначала обрезав первую и последнюю строку, преобразовав в unix новые строки и выполнив base64-декодирование. Полученный файл можно импортировать в хранилище ключей (используя keytool
команда). Когда я перечисляю записи в хранилище ключей, эта запись имеет тип trustedCertEntry
, Из-за этого типа записи (?) Я не могу использовать этот сертификат для аутентификации в веб-сервисе. Я начинаю думать, что предоставленный сертификат является публичным сертификатом, который используется для аутентификации...
Обходной путь, который я нашел, состоит в том, чтобы импортировать сертификат в IE и экспортировать его как .pfx
файл. Этот файл может быть загружен как хранилище ключей и может использоваться для проверки подлинности с помощью веб-службы. Однако я не могу ожидать, что мои клиенты будут выполнять эти шаги каждый раз, когда они получают новый сертификат. Поэтому я хотел бы загрузить .cer
файл прямо в Java. Какие-нибудь мысли?
Дополнительная информация: компания, стоящая за веб-сервисом, сказала мне, что сертификат следует запрашивать (используя IE и веб-сайт) с ПК и пользователя, который позже импортирует сертификат.
10 ответов
- Если вы хотите пройти аутентификацию, вам нужен закрытый ключ - другого варианта нет.
- Сертификат - это открытый ключ с дополнительными свойствами (например, название компании, страна,...), который подписан неким центром сертификации, который гарантирует, что присоединенные свойства являются истинными.
.CER
файлы являются сертификатами и не имеют закрытого ключа. Закрытый ключ предоставляется с.PFX keystore
файл нормально. Если вы действительно аутентифицируетесь, это потому что вы уже импортировали закрытый ключ.Вы обычно можете импортировать
.CER
сертификаты без проблем сkeytool -importcert -file certificate.cer -keystore keystore.jks -alias "Alias"
Импорт .cer
файл сертификата, загруженный из браузера (откройте URL-адрес и найдите подробности) в хранилище ключей cacerts в java_home\jre\lib\security
работал для меня, в отличие от попыток создать и использовать мое собственное хранилище ключей.
- Перейти к вашей
java_home\jre\lib\security
- (Windows) Откройте там командную строку администратора, используя
cmd
и CTRL+SHIFT+ВВОД - Запустите 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 файлов в новый 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);
}
Вам не нужно вносить какие-либо изменения в сертификат. Вы уверены, что используете правильную команду импорта?
Следующие работы для меня:
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-----
Инструмент с открытым исходным кодом GUI доступен на http://keystore-explorer.org/index.html
KeyStore Explorer
KeyStore Explorer - это замена графического интерфейса с открытым исходным кодом для утилит командной строки Java keytool и jarsigner. KeyStore Explorer представляет их функциональность и многое другое через интуитивно понятный графический интерфейс пользователя.
Помогут следующие экраны (они с официального сайта)
Экран по умолчанию, который вы получите, выполнив команду:
shantha@shantha:~$./Downloads/kse-521/kse.sh
И перейти к Examine
а также Examine a URL
вариант, а затем укажите веб-URL, который вы хотите импортировать.
Окно результатов будет, как показано ниже, если вы дадите ссылку на сайт Google.
Это один из вариантов использования, а остальное зависит от пользователя (все кредиты идут на http://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] ----- КОНЕЦ СЕРТИФИКАТА -----
- Откройте браузер Chrome (этот шаг может работать и в других браузерах) настройки> показать дополнительные настройки> HTTPS/SSL > управлять сертификатами Импортировать.txt в шаге 1
- Выберите и экспортируйте этот сертификат в формате Base-64. Сохранить как.cer
- Теперь вы можете использовать keytool или Portecle для импорта в хранилище ключей Java.
Хотя было предоставлено много хороших ответов, я хочу дать альтернативу программной загрузке материала ssl. Вы можете попробовать следующий фрагмент:
Path certificatePath = Paths.get("/path/to/certificate.cer");
List<Certificate> certificates = CertificateUtils.loadCertificate(certificatePath);
SSLFactory sslFactory = SSLFactory.builder()
.withTrustMaterial(certificates)
.build();
SSLContext sslContext = sslFactory.getSslContext();
Он может обрабатывать файлы в формате pem, der (двоичные) и p7b. Этот пример фрагмента кода взят из библиотеки: GitHub - SSLContext Kickstart Вы можете добавить его с помощью следующего фрагмента:
<dependency>
<groupId>io.github.hakky54</groupId>
<artifactId>sslcontext-kickstart</artifactId>
<version>7.0.2</version>
</dependency>
Легкое извлечение сертификата сервера можно выполнить с помощью InstallCert2 .
Для установки сертификата сервера в хранилище ключей Java вы можете использовать любой из приведенных выше примеров keytool.