Вопрос-ответ

How to import a .cer certificate into a java keystore?

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

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

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

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

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

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

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

Переведено автоматически
Ответ 1

  • Если вы хотите пройти аутентификацию, вам нужен закрытый ключ - другого варианта нет.

  • Сертификат - это открытый ключ с дополнительными свойствами (такими как название компании, страна, ...), который подписан некоторым центром сертификации, гарантирующим, что прикрепленные свойства верны.

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

  • Обычно вы можете импортировать .CER сертификаты без каких-либо проблем с


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

Ответ 2

Импорт .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.

Ответ 3

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