Вам не нужен пароль для доступа к truststore (сделанный с помощью Java keytool)?

Я только что создал truststore с Java keytool (для проверки подлинности сервера, на котором нет сертификата CA). Однако я заметил кое-что странное. Я начинаю своего клиента так:

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

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

вышеупомянутый вызов работает.


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

java -classpath <STUFF> Client

Это не работает. (Очевидно, что это не работает, для этого требуется truststore).


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

-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 Не могу сказать, но предполагается, что вы или программное обеспечение, читающее магазин, знаете.

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


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


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