Вам не нужен пароль для доступа к хранилищу доверенных сертификатов (сделано с помощью Java Keytool)?

Я только что создал хранилище доверенных сертификатов с помощью инструмента Java Keytool (для проверки подлинности сервера, у которого нет сертификата CA). Однако я заметил нечто странное. Я начинаю свой клиент так:

java -Djavax.net.ssl.trustStore=<PATHSTUFF>/client.keystore -classpath <STUFF> Client

(Примечание: пароль НЕ указан)

Вышеуказанный вызов работает.


Однако, когда я пытаюсь это:

java -classpath <STUFF> Client

Это не работает. (Очевидно, что это не работает, требуется хранилище доверенных сертификатов).


Я ожидал, что нужно будет передать в этом варианте (но я не сделал):

-Djavax.net.ssl.trustStorePassword=mypass

Вопрос: Вам не нужен пароль для доступа к хранилищу доверенных сертификатов? Пароль только для модификации? А как насчет хранилища ключей?

4 ответа

Решение

Пароль используется для защиты целостности хранилища ключей. если вы не предоставите пароль хранилища, вы все равно можете прочитать содержимое хранилища ключей. Команда keytool -list демонстрирует это поведение (используйте его с пустым паролем).

В дополнение к отличному ответу @pascal-thivent:

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

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

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

Вот почему, когда вы вводите пароль без пароля, keytool просто предупреждает вас, что не может убедиться, что магазин не был подделан. Если вы предоставите неверный пароль или магазин был подделан, вы получите другое сообщение:

Enter keystore password: keytool error: java.io.IOException: Keystore was tampered with, or password was incorrect

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

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

По умолчанию пароль хранилища доверенных сертификатов JRE - "changeit". Если вы хотите изменить пароль хранилища доверенных сертификатов (cacerts) по умолчанию с помощью Java, перейдите по этой ссылке.

Если вы не указываете хранилище доверенных сертификатов, вместо него используется хранилище по умолчанию. Я предполагаю, вы получаете сообщение об ошибке, что вам нужно указать хранилище доверенных сертификатов, чтобы доверять хосту, который вы запрашиваете? Склад доверенных сертификатов по умолчанию находится в $JAVA_HOME/lib/security/jssecacerts.

Другие вопросы по тегам