Вам не нужен пароль для доступа к доверенному хранилищу (созданному с помощью 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

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


person sixtyfootersdude    schedule 26.02.2010    source источник
comment
@Паскаль, да. Сервер, который я использую, не имеет сертификата CA, поэтому ему требуется хранилище доверенных сертификатов, чтобы он мог выполнять аутентификацию ssl для сервера.   -  person sixtyfootersdude    schedule 01.03.2010
comment
Я также не понимаю, зачем нужен пароль для TrustStore, который является клиентской частью SSL. В частности, когда ЦС не участвует. Вам удалось это решить?   -  person AlikElzin-kilaka    schedule 09.01.2015


Ответы (4)


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

person Pascal Thivent    schedule 01.03.2010
comment
@sixtyfootersdude Да, целостность не проверяется, но, тем не менее, вы можете получить доступ к хранилищу ключей. - person Pascal Thivent; 01.03.2010
comment
Этот ответ касается KeyStore, но главный вопрос касается TrustStore. Я в замешательстве. - person AlikElzin-kilaka; 09.01.2015

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

person javabrett    schedule 20.05.2016
comment
Действительно хороший ответ. Я также заметил, что разные типы хранилищ обрабатывают пароль по-разному. В то время как отсутствие пароля для типа JKS просто приводит к недоступности проверки целостности хранилища, отсутствие пароля для хранилища ключей PKCS12 приводит к пустому списку (при использовании keytool -list), поэтому нет возможности использовать хранилище, если вы не знаете пароль. - person Alexey R.; 17.02.2020

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

person cafebabe    schedule 26.02.2010
comment
Привет, bfoo, да, я знал, что это значение по умолчанию, однако это не отвечает на мой вопрос. Очевидно, что значение по умолчанию не работает, а тот, который я указал, работает. У меня вопрос: для чтения доверенного хранилища вам нужен пароль? Есть ли пароль по умолчанию? - person sixtyfootersdude; 01.03.2010

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

person thulasiram p    schedule 09.04.2015