Получение Java, чтобы принять только один сертификат SSL - PullRequest
1 голос
/ 15 февраля 2010

У меня есть Java-апплет, который загружает некоторые предварительно установленные расширения собственного кода для отображения пользовательского содержимого в браузере. Часть этого контента может включать собственный код, который будет загружен JVM. Очевидно, что это проблема безопасности. Я бы хотел, чтобы весь контент поступал только с авторизованных серверов.

Путь, по которому я следовал, - создать хранилище ключей, содержащее только один SSL-сертификат. Я установил расположение хранилища ключей и пароль и включил отладочный вывод.

System.setProperty("javax.net.ssl.keyStore", "C:\\keys\\keystore");
System.setProperty("javax.net.ssl.keyStorePassword", "changeit");
System.setProperty("javax.net.debug", "ssl");

У меня сложилось впечатление, что это будет означать, что JVM будет иметь доступ только к одному файлу хранилища ключей и, следовательно, к одному ключу внутри него. Фактически, в отладочной информации SSL перечислено что-то вроде 75 ключей CA в дополнение к одному ключу, который я добавил. Понятно, что это не помешает никому отправлять нам ненадежный код.

Есть ли способ указать системе SSL использовать только один сертификат? Должен ли я использовать совершенно другой подход?

Обновление: Изменение файла cacerts на самом деле не вариант здесь. JVM должна продолжать нормально функционировать для других приложений, использующих ее. Есть ли способ во время выполнения выбрать, чтобы не загружать этот файл? Я смотрю на классы TrustManager и KeyManager, но не совсем понимаю, как их использовать.

Ответы [ 4 ]

1 голос
/ 17 февраля 2010

Сам вопрос здесь неправильный. Сертификат является только доказательством личности. Вы не авторизуете сертификаты, вы авторизуете идентификационные данные. Что если тот же клиент придет с новым сертификатом?

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

1 голос
/ 16 февраля 2010

Вам необходимо установить системное свойство javax.net.ssl.trustStore, чтобы оно указывало на хранилище ключей с одним вашим сертификатом. Хранилище ключей предназначено для ваших учетных данных, а не для вашего партнера.

0 голосов
/ 16 февраля 2010

Вы все еще «видите» сертификаты CA общесистемного файла JRE cacerts, расположенного в java.home/jre/lib/security, что является нормальным.

Теперь, цитируя документацию keytool об этом файле:

ВАЖНО: Проверьте файл ваших кодов
Так как вы доверяете CA в файл cacerts в качестве сущностей для подписание и выдача сертификатов другие лица, вы должны управлять cacerts файл тщательно. cacerts файл должен содержать только сертификаты из CA вы доверяете. Это твое ответственность за проверку доверенных сертификаты корневого центра сертификации, связанные с cacerts файл и сделайте свое доверие решения. Чтобы удалить ненадежный CA сертификат из файла cacerts, использование опция удаления keytool команда. Вы можете найти файл cacerts в каталоге установки JRE. Обратитесь к системному администратору, если у вас нет разрешения на редактирование этот файл.

В вашем случае может быть проще полностью заменить cacerts собственным хранилищем ключей вместо удаления всех 75 записей, если это действительно то, что вам нужно. Если нет, то вам следует использовать другой подход (почему бы вам просто не ограничить или не жестко закодировать список авторизованных серверов?).

0 голосов
/ 15 февраля 2010

У вас также есть глобальное хранилище ключей, установленное вместе с JRE, в котором хранятся все ЦС. Попробуйте переименовать его и посмотрите, что получится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...