2009-10-30 1 views
8

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

У нас есть настольное приложение, которое обращается к различным веб-службам. Недавно один из них переключил свой SSL-сертификат на один, подписанный Trustwave. Хотя сертификаты Trustwave SSL принимаются регулярные интернет-браузеры, 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 и программным обеспечением установки корневого сертификата?

ответ

2

Я не знаю, возможно ли это, но вы можете реализовать свой собственный TrustManager, чтобы разрешить это соединение или этот ЦС. Here - основы.

+0

Это может сработать для нас. Ссылка предлагает способ полностью отключить проверку, которая не то, что мы хотим точно, но, возможно, я мог бы подстроить нормальный TrustManager, чтобы создать тот, который пытается использовать все обычные корневые сертификаты плюс один. Спасибо, это выглядит многообещающе. –

0

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

  • написать сертификат в файл или поток байтов или любой
  • импорта используя KeyTool класс (sun.security.tools.KeyTool)

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

+0

Это действительно в соответствии с Firefox и Internet Explorer. Java просто поставляется со своим собственным хранилищем ключей вместо того, чтобы использовать предоставленную ОС, и я полагаю, что версия Java не включает в себя последних посетителей на рынке SSL. –

+0

Есть случаи, когда это разумно: в нашей компании мы используем наш собственный ЦС внутри страны - естественно, ему не доверяют по умолчанию (браузер и т. Д.). Импорт этого сертификата ЦС намного проще, чем добавление исключений для отдельных сертификатов по всему месту. – sfussenegger

1

IMHO, Sun не раскрывает keytool через API, прежде всего, чтобы разработчики не изменяли набор доверенных ЦС. Я могу представить себе, как злоумышленники используют такой код для вставки собственных корневых сертификатов в хранилище доверия, что ставит под угрозу саму модель хранилища доверия.

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

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

  • Инициализировать Keytool как процесс из приложения, и передать аргументы командной строки для установки сертификата корневого ЦС. Это само по себе является плохой идеей, и я бы рекомендовал уведомить пользователя о том, что происходит.
  • Избегайте использования keytool и вместо этого предоставляйте пользователям инструкции по установке корневого ЦС с использованием Keyman или KeyTool IUI. Выступая только для себя, я предпочитаю последнего.
+1

Для технического уровня наших пользователей автоматическое отсутствие вопросов, заданных при установке, является единственным вариантом, который избавил бы нас от «проблем с вашим заявлением, исправить». –

+0

Что касается философского вопроса о том, следует ли разрешать приложениям модифицировать хранилище ключей, ответ должен быть конечно - иначе сам keytool не смог бы работать. Возможно, доступ к операции может контролироваться менеджером безопасности. Увы, я отвлекся. Конструктивные решения, стоящие за этим, не имеют большого значения, чем поиск практического решения. Спасибо за указатели в любом случае. –

+3

Я забыл упомянуть еще одну альтернативу - используя ваш собственный магазин доверия, который может содержать все корневые ЦС, которые вы пожелаете. Вы можете использовать JVM для использования этого магазина доверия через свойство javax.net.ssl.trustStore. –

1

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

0

Command-line solution. На Mac, дом Java - это/Library/Java/Home. Попробуйте:

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

замещающего CaName с именем ЦСА, и ca.crt с путем к файлу сертификат (PEM работает). Он будет запрашивать пароль хранилища ключей. Пароль по умолчанию указан в связанной статье.

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

+0

Я думаю, что моя любимая часть была там, где он сказал, что хочет сделать это, не используя keytool, и вы сказали ему использовать keytool;) –

+0

True. Но я не могу себе представить Java TrustManager и как-то распространять это приложение проще, чем скриптовое решение, использующее keytool, даже в смешанной среде. – farcepest

0

ВС опубликовали этот код, чтобы создать обновленную версию файла cacerts основанных на целевом хосте по протоколу HTTPS с любыми:

сертификатами

https://code.google.com/p/java-use-examples/source/browse/trunk/src/com/aw/ad/util/InstallCert.java

Ваши новые cacerts будут названы jssecacerts в текущем каталоге. Просто скопируйте этот новый файл через файл jre/lib/security/cacerts.

Я не комментирую безопасность вашего нового файла cacerts.

Смежные вопросы