How to import a .cer certificate into a java keystore?
Как импортировать сертификат .cer в хранилище ключей Java?
Во время разработки клиента веб-сервиса Java я столкнулся с проблемой. Аутентификация для веб-сервиса осуществляется с использованием сертификата клиента, имени пользователя и пароля. Клиентский сертификат, который я получил от компании, стоящей за веб-сервисом, имеет формат .cer. Когда я просматриваю файл с помощью текстового редактора, он имеет следующее содержимое:
Я могу импортировать этот файл в качестве сертификата в Internet Explorer (без необходимости вводить пароль!) и использовать его для аутентификации с помощью веб-сервиса.
Я смог импортировать этот сертификат в хранилище ключей, сначала удалив первую и последнюю строку, преобразовав в новые строки unix и запустив base64-decode. Полученный файл можно импортировать в хранилище ключей (используя keytool команду). Когда я перечисляю записи в хранилище ключей, эта запись имеет тип trustedCertEntry. Из-за этого типа записи (?) Я не могу использовать этот сертификат для аутентификации с помощью веб-сервиса. Я начинаю думать, что предоставленный сертификат является общедоступным сертификатом, который используется для аутентификации...
Я нашел обходной путь - импортировать сертификат в IE и экспортировать его в виде .pfx файла. Этот файл может быть загружен как хранилище ключей и использоваться для аутентификации с помощью веб-сервиса. Однако я не могу ожидать, что мои клиенты будут выполнять эти действия каждый раз, когда они получают новый сертификат. Поэтому я хотел бы загрузить .cer файл непосредственно в Java. Есть мысли?
Дополнительная информация: компания, стоящая за веб-сервисом, сказала мне, что сертификат следует запросить (используя IE и веб-сайт) у ПК и пользователя, который импортирует сертификат позже.
Переведено автоматически
Ответ 1
Если вы хотите пройти аутентификацию, вам нужен закрытый ключ - другого варианта нет.
Сертификат - это открытый ключ с дополнительными свойствами (такими как название компании, страна, ...), который подписан некоторым центром сертификации, гарантирующим, что прикрепленные свойства верны.
.CER файлы являются сертификатами и не содержат закрытого ключа. Закрытый ключ обычно предоставляется с .PFX keystore файлом. Если вы действительно аутентифицируетесь, это потому, что вы уже импортировали закрытый ключ.
Обычно вы можете импортировать .CER сертификаты без каких-либо проблем с
Импорт .cer файла сертификата, загруженного из браузера (откройте URL и поищите подробности) в хранилище ключей cacerts в java_home\jre\lib\security у меня сработало, в отличие от попыток создать и использовать мое собственное хранилище ключей.
Перейдите в свой java_home\jre\lib\security
(Windows) Откройте там командную строку администратора, используя cmd и CTRL+SHIFT+ENTER
Запустите keytool для импорта сертификата:
(Заменить yourAliasName и 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. KeyStoretrustStore= KeyStore.getInstance(KeyStore.getDefaultType()); trustStore.load(null);//Make an empty store InputStreamfis=/* insert your file path here */; BufferedInputStreambis=newBufferedInputStream(fis);