Как мне импортировать новый сертификат Java CA без использования утилиты командной строки keytool?

StackOverflow https://stackoverflow.com/questions/1650596

  •  22-07-2019
  •  | 
  •  

Вопрос

Краткое изложение:как мне установить новый корневой сертификат в Java с помощью Java-кода?

У нас есть настольное приложение, которое получает доступ к различным веб-сервисам.Недавно один из них сменил свой SSL-сертификат на сертификат, подписанный Trustwave.Хотя SSL-сертификаты Trustwave принимаются обычными интернет-браузерами, Java, похоже, не поставляется с необходимыми корневыми сертификатами, и мы потеряли доступ к данному веб-сервису со следующим сообщением об ошибке:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Мы получили временную отсрочку, убедив провайдера вернуться к Verisign, но когда они вернутся, мы должны быть готовы.Поэтому мне нужно, чтобы наше настольное программное обеспечение автоматически устанавливало корневой сертификат Trustwave по мере необходимости.Наши клиенты недостаточно технически подкованы, чтобы использовать команду keytool, и я бы предпочел не писать ее в скрипте, поскольку это кажется мне хрупким решением (отдельные реализации для Mac и ПК, борьба с ограничениями выполнения Vista, проблемы с поиском правильной JRE для установки и т.д.).

Я предполагаю, что keytool использует Java внутренне.Какую команду я мог бы использовать в Java для репликации функциональности keytool и программной установки корневого сертификата?

Это было полезно?

Решение

Я не знаю, возможно ли это, но вы могли бы реализовать собственный TrustManager, чтобы разрешить это соединение или этот CA. Здесь основы.

Другие советы

ИМХО, Sun не предоставляла keytool через API, в первую очередь для того, чтобы разработчики не могли изменять набор доверенных центров сертификации.Я вполне могу представить, как злоумышленники используют такой код для вставки своих собственных корневых сертификатов в хранилище доверия, ставя под угрозу саму модель хранилища доверия.

Фактически, если вы посмотрите на исходный код класса KeyTool (пакет sun.security.tools), он не только является окончательным, но и имеет закрытый конструктор, предотвращающий создание любым вызывающим объектом экземпляра класса KeyTool из кода.У KeyTool действительно есть метод main, что делает командную строку (и, следовательно, пользователя операционной системы), возможно, единственным способом инициализации и взаимодействия с KeyTool.

Единственными оставшимися (упрощенными) подходами были бы:

  • Инициализируйте keytool как процесс из приложения и передайте аргументы командной строки для установки сертификата корневого центра сертификации.Это само по себе плохая идея, и я бы рекомендовал уведомлять пользователя о том, что происходит.
  • Избегайте использования keytool и вместо этого предоставляйте пользователям инструкции о том, как установить корневой центр сертификации с помощью Ключник или Ключевой инструмент IUI.Говоря здесь только за себя, я предпочитаю последнее.

Вы всегда можете вызвать KeyTool как процесс Runtime.exec (...) .

Если вы хотите установить сертификат в хранилище ключей доверенного пользователя root на настольном компьютере, вам потребуется разрешение на это.То же самое и с ключевой инструмент, вам нужен пароль для доступа к хранилищу ключей доверенного пользователя root.Если вы хотите быть быстрым и грязным, вы можете

  • запишите сертификат в файл, или в поток байтов, или во что-то еще
  • импорт с использованием KeyTool класс (sun.security.tools.KeyTool)

Но ИМХО, если сертификат недействителен, то он не заслуживает доверия.Я бы сказал, что для этого есть веская причина.

Решение командной строки. На Mac - домашняя страница Java is / Library / Java / Home. Попробуйте:

$ sudo -i
# cd /Library/Java/Home
# keytool -import -trustcacerts -alias CAName -file CA.crt -keystore lib/security/cacerts

Замените CAName именем вашего CA, а CA.crt - путем к файлу сертификата (работает PEM). Он запросит пароль хранилища ключей. Пароль по умолчанию указан в связанной статье.

Я должен был сделать это для одного из сертификатов CA RapidSSL.

Sun опубликовала этот код для создания обновленной версии файла cacerts на основе любого целевого хоста, на котором запущен https с любыми сертификатами:

scroll top