Nano Hash - криптовалюты, майнинг, программирование

В Java 8 можно сделать HttpsURLConnection для отправки указания имени сервера (SNI)

Документация Oracle, похоже, указывает, что Java 8 отправляет SNI автоматически и по умолчанию. Wireshark указывает на обратное. Я системный администратор PowerShell, а не разработчик Java, поэтому почти наверняка что-то упускаю из виду.

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

import java.util.*;
import java.net.*;
import javax.net.ssl.*;
import java.io.*;

public class testJavaHttpConn {
    public static void main(String[] args) throws Exception {
        String strUrl = args[0];
        System.out.println("Trying to connect to " + strUrl);
        try {
            URL url = new URL(strUrl);
            HttpsURLConnection urlConn = (HttpsURLConnection) url.openConnection();
            System.out.println("Connecting");
            urlConn.connect();
            System.out.println("Done");
            System.out.println("Response " + urlConn.getResponseCode());
        } catch (IOException e) {
            System.err.println("Error creating HTTP connection");
            e.printStackTrace();
            throw e;
        }
    }
}

Я не установил System.setProperty("jsse.enableSNIExtension", "false"); и когда я устанавливаю -Djavax.net.debug=ssl, он ясно показывает, что расширение имени сервера не установлено.

Я знаю, что могу реализовать SSLSocket и установить SSLParameter serverName, если я хочу погрузиться на следующий более глубокий уровень абстракции, но я бы хотел этого избежать.

Редактировать: код работает так, как написано выше для Flo в комментариях. У меня не получается с 1.8.0_72 в Linux 2.6.18-194.11.3.el5 и с 1.8.0_51 в Windows 7. Установка Windows является ванильной, а установка Linux обновила значение urandom до securerandom.source=file: /dev/./urandom. Я не уверен, как я могу определить, что в моих установках отличается от установок Фло.

12.02.2016

  • Итак, вы ищете методы, отличные от тех, которые задокументировано здесь? 12.02.2016
  • Я ограничен невежеством. Фрагменты кода, использующие SSLSocket, предполагают наличие знаний для создания всего предшествующего и последующего материала, а мне этого не хватает. Я еще не нашел пример, показывающий, как выполнить подключение и извлечение с помощью SSLSocket и преобразовать вывод в тот же объект, который возвращает HttpURLConnection. Я построил все эти объекты в соответствии с этими фрагментами, но ничего не могу с ними сделать, когда они у меня есть. Учитывая мое невежество, казалось разумным спросить, не упускаю ли я из виду простое свойство где-то, которое заставляет HttpsURLConnection отправлять SNI. Если ответ отрицательный, то это SSLSocket. 12.02.2016
  • Я протестировал ваш код с помощью sni.velox.ch, и отладка говорит Extension server_name, server_name: [type=host_name (0), value=sni.velox.ch]. Это приводит к статусу 200. При использовании System.setProperty ("jsse.enableSNIExtension", "false") я получаю сообщение об ошибке (как и ожидалось), а расширение отсутствует в отладке. Система: Ubuntu Linux, Java 1.8.0_72 (но также работало с 1.7.0_95). К сожалению, у меня нет решения для вас. 12.02.2016
  • Ах. Спасибо, Фло! Я не вижу Extension_server_name при запуске кода. Итак, между вашим 1.8.0_72 и моим есть что-то другое, и если бы мой был прав, он действительно должен был бы отправлять SNI. Единственный файл, который я настраиваю в своей установке, это ${JDK_HOME}/jre/lib/security/java.security. Интересно, может ли что-то внутри меня помешать. 12.02.2016
  • Вау. На самом деле, я заметил, что псевдоним flo был полностью определен, и я использовал псевдоним короткого имени (интрасеть, понимаете?). Я попробовал полное доменное имя, и имя сервера отправлено. Теперь я ошибаюсь с проблемами именования сертификатов, и все они должны решиться красиво! Отменить охоту. Когда я буду на 100% уверен, что это разрешение, я опубликую ответ ниже. 13.02.2016

Ответы:


1

HttpsURLConnection отправляет SNI по умолчанию, и по умолчанию iff URL-адрес, к которому он подключается, является полным именем. Он не отправляет SNI для псевдонимов коротких имен локальной интрасети.

Extension server_name, server_name: [type=host_name (0), value=site.company.com]

(Для справки, мне также нужно было развернуть новый сертификат с SAN для коротких и полных имен, но это было тривиально.)

12.02.2016
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..