KeyStore, HttpClient и HTTPS: Может кто-нибудь объяснить мне этот код? - PullRequest
2 голосов
/ 30 апреля 2010

Я пытаюсь понять, что происходит в этом коде .

KeyStore trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());        
FileInputStream instream = new FileInputStream(new File("my.keystore")); 
try {
    trustStore.load(instream, "nopassword".toCharArray());
} finally {
    instream.close();
}

SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);
Scheme sch = new Scheme("https", socketFactory, 443);
httpclient.getConnectionManager().getSchemeRegistry().register(sch);

Мои вопросы:

trustStore.load(instream, "nopassword".toCharArray()); делает что именно? После прочтения документации load() загрузит данные KeyStore из входного потока (который является просто пустым файлом, который мы только что создали), используя некоторый произвольный «nopassword». Почему бы просто не загрузить его с null в качестве параметра InputStream и пустой строкой в ​​качестве поля пароля?

И что происходит, когда этот пустой KeyStore передается в конструктор SSLSocketFactory? Каков результат такой операции?

Или - это просто пример, когда в реальном приложении вам фактически нужно поместить ссылку на существующий файл / пароль хранилища ключей?

Ответы [ 2 ]

2 голосов
/ 30 апреля 2010

В этом примере показано, как загрузить собственное хранилище доверенных сертификатов. Чтобы этот пример работал, вам нужно иметь файл с именем «my.keystore» в текущем каталоге, а пароль для хранилища ключей - «nopassword».

Обратите внимание, new File("my.keystore") не обязательно создает новый файл. Он просто создает объект File, указывающий на путь.

1 голос
/ 30 апреля 2010

Или - это просто пример, когда в реальном приложении вам фактически нужно поместить ссылку на существующий файл / пароль хранилища ключей?

Это действительно выглядит так. Файл "my.keystore" не распространяется ни в двоичном, ни в исходном дистрибутиве HttpClient 4.0.1. Для этого вы должны создать реальное хранилище ключей. Вы можете использовать keytool или Portecle .

В этом примере показано, как использовать хранилище доверия, отличное от того, которое JVM использует по умолчанию ($ JAVA_HOME / jre / lib / security / cacerts) для этого экземпляра DefaultHttpClient. Это полезно, когда сайт SSL использует сертификат, подписанный их собственным внутренним центром сертификации . Соединение SSL будет установлено только тогда, когда подписчик сертификата сервера будет распознан. Запись в Википедии о TLS - достойное введение, если вы не знакомы с концепцией.

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