Вы инициализируете свой SSLContext
с помощью массива null
KeyManager
.
Ключ-менеджер - это то, что обрабатывает сертификат сервера (на стороне сервера), и это то, вероятно, для установки при использовании javax.net.ssl.keyStore
.
Однако, как описано в Справочном руководстве JSSE , использование null
для первого параметра не делает то, что вам кажется подумать, что это делает:
Если параметр KeyManager [] имеет значение NULL, то для этого контекста будет определен пустой KeyManager. Если параметр TrustManager [] равен NULL, установленным поставщикам безопасности будет поиск наивысшей приоритетной реализации TrustManagerFactory, из которой будет получен соответствующий TrustManager. Аналогично, параметр SecureRandom может быть нулевым, и в этом случае будет использоваться реализация по умолчанию.
blockquote>Пустое
KeyManager
не содержит сертификатов RSA или DSA. Поэтому все блоки шифрования по умолчанию, которые будут полагаться на такой сертификат, будут отключены. Вот почему вы получаете все эти сообщения « Игнорирование недоступных сообщений шифра », что в конечном итоге приводит к сообщению об « без шифрования вообще ».Если вы хотите, чтобы ваше хранилище ключей использовалось в качестве хранилища ключей, вам нужно загрузить его и инициализировать KeyManagerFactory с помощью него:
KeyStore ks = KeyStore.getInstance("JKS"); InputStream ksIs = new FileInputStream("..."); try { ks.load(ksIs, "password".toCharArray()); } finally { if (ksIs != null) { ksIs.close(); } } KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory .getDefaultAlgorithm()); kmf.init(ks, "keypassword".toCharArray());
Использовать
kmf.getKeyManagers()
в качестве первого параметра дляSSLContext.init()
.Для двух других параметров, поскольку вы явно не запрашиваете аутентификацию клиентского сертификата, вы должны оставить доверительный менеджер значением по умолчанию (
null
) вместо копирования / вставки доверительного менеджера, который является потенциальную причину уязвимости, и вы также можете использовать значение по умолчаниюnull
SecureRandom
.
Это - просто часть ужасающей путаницы, которая является API даты/времени Java. Список что случилось с ним занял бы очень долгое время (и я уверен, что не знаю половины проблем). По общему признанию рабочий с датами и временем хитро, но aaargh так или иначе.
Делают себе одолжение и используют Время Joda вместо этого, или возможно JSR-310.
РЕДАКТИРОВАНИЕ: Что касается причин, почему - как отмечено в других ответах, это могло произойти из-за старых API C, или просто общего настроения запуска всего от 0... за исключением того, что дни запускаются с 1, конечно. Я сомневаюсь, мог ли кто-либо вне исходной команды внедрения действительно заявить причины - но снова, я буду убеждать читателей не волноваться так [приблизительно 117], почему плохие решения были приняты, чтобы посмотреть на целую палитру злобности в java.util.Calendar
и найти что-то лучше.
Одна точка, которая является в пользу использования индексов на основе 0, - то, что оно делает вещи как "массивы имен" легче:
// I "know" there are 12 months
String[] monthNames = new String[12]; // and populate...
String name = monthNames[calendar.get(Calendar.MONTH)];
, Конечно, это перестало работать, как только Вы получаете календарь с 13 месяцами..., но по крайней мере определенный размер является числом месяцев, которые Вы ожидаете.
Это не хорошо причина, но это причина...
РЕДАКТИРОВАНИЕ: Как вид комментария запросов некоторые идеи о том, что я думаю, являются неправильными с Датой/Календарем:
Date
и Calendar
как разные вещи, но разделение "локальных" по сравнению с "зонными" значениями отсутствует, как дата/время по сравнению с датой по сравнению со временем Date.toString()
реализация, которая всегда использует системную зону местного времени (это смутило многих пользователей Переполнения стека до настоящего времени) В дополнение к ответу DannySmurf лени я добавлю, что это должно поощрить Вас использовать константы, такой как Calendar.JANUARY
.
Это точно не определяется как нуль по сути, это определяется как Календарь. Январь. Это - проблема использования ints как константы вместо перечислений. Календарь. Январь == 0.
Лично, я взял странность календарного API Java как признак, что я должен был отделить меня от Грегорианско-центрального мышления и попытки программировать более агностически в этом отношении. А именно, я учился еще раз избегать hardcoded констант для вещей как месяцы.
, Какое из следующего, более вероятно, будет корректно?
if (date.getMonth() == 3) out.print("March");
if (date.getMonth() == Calendar.MARCH) out.print("March");
Это иллюстрирует одну вещь, которая раздражает меня немного во Время Joda - это может поощрить программистов думать с точки зрения hardcoded констант. (Только немного, все же. Это не, как будто Joda принуждение программисты к программе плохо.)
Поскольку программисты одержимы индексами на основе 0. Хорошо, это немного более сложно, чем это: это имеет больше смысла, когда Вы работаете с логикой низшего уровня для использования индексации на основе 0. Но в общем и целом, я буду все еще придерживаться своего первого предложения.
Вероятно, потому что C "TM структуры" делает то же.
Я сказал бы лень. Массивы запускаются в 0 (все знают это); месяцы года являются массивом, который приводит меня полагать, что некоторый инженер в Sun просто не потрудился помещать эту небольшую точность в код Java.
В Java 8 существует новая дата/рремя API JSR 310 , которая более нормальна. Вывод спецификации совпадает с основным автором JodaTime, и они совместно используют много подобных понятий и шаблонов.
C базирующиеся языки копируют C до некоторой степени. tm
структура (определенный в time.h
) имеет целочисленное поле tm_mon
с (прокомментированным) диапазоном 0-11.
C базировался, языки запускают массивы в индексе 0. Таким образом, это было удобно для вывода строки в массиве имен месяца, с tm_mon
как индекс.