Есть ли реализация DTLS в JSSE

Я хочу реализовать клиент DTLS 1.0 на Java, и после погугления я обнаружил, что JSSERefGuide говорит следующее:

API JSSE поддерживает SSL версий 2.0 и 3.0 и TLS версии 1.0. Эти протоколы безопасности инкапсулируют обычный сокет двунаправленного потока, а API JSSE добавляет прозрачную поддержку аутентификации, шифрования и защиты целостности. Реализация JSSE, поставляемая с JDK, поддерживает SSL 3.0, TLS (1.0, 1.1 и 1.2) и DTLS (версии 1.0 и 1.2). SSL 2.0 не реализована.

Поэтому я подумал, что смогу реализовать это на чистой Java без использования какой-либо библиотеки (например, BouncyCastle).

Но когда я пытаюсь запустить (и некоторые другие, например DTLSv1.2, DTLSv1...):

final SSLContext sslContext = SSLContext.getInstance("DTLSv1.0", "SunJSSE");

Он бросает:

Exception in thread "main" java.security.NoSuchAlgorithmException: no such algorithm: DTLSv1.0 for provider SunJSSE
at sun.security.jca.GetInstance.getService(GetInstance.java:87)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:206)
at javax.net.ssl.SSLContext.getInstance(SSLContext.java:199)

в то время как, например, следующие работы:

final SSLContext sslContext = SSLContext.getInstance("TLSv1.2", "SunJSSE");

Перечисляя всех поставщиков безопасности, я вообще не нахожу ничего DTLS.

Так существует ли на самом деле реализация DTLS? И если да, то как вы собираетесь его использовать?


person osundblad    schedule 21.12.2017    source источник
comment
Хороший вопрос. DTLS не упоминается на странице стандартных имен.   -  person user207421    schedule 21.12.2017
comment
Я думаю, что это глюк на сайте; пакеты документов, которые я скачал несколько лет назад, здесь отличаются. В таблице «Поддерживаемые классы и интерфейсы» на полпути вниз страницы правильно показаны только SSL3, TLS1, 1.1, 1.2 для 8 и 7, а для 6 TLS1.1 и 1.2 только для 6u111 и 6u121 (т.е. на платном плане или OpenJDK). То же самое со «стандартными именами», например. docs.oracle.com/javase/8/ docs/technotes/guides/security/ и пред.   -  person dave_thompson_085    schedule 21.12.2017


Ответы (3)


Документ правильный, и вы получаете исключение из-за отсутствия протокола DTLS: https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#SSLContext

Выбор DTLS происходит в момент создания сокета, так как это будет один из типов TCP или дейтаграмм. В начале это будет выглядеть так:

DatagramSocket s = new DatagramSocket();
...

final SSLContext sslContext = SSLContext.getInstance("TLSv1.0", "SunJSSE");
sslContext.init(null, yourSSLTrustManager, null);

SSLSocketFactory factory = (SSLSocketFactory)sslContext.getSocketFactory();
SSLSocket daSocket = (SSLSocket) factory.createSocket(s, host, port, false);
person Eugène Adell    schedule 21.12.2017
comment
Спасибо, и дополнительный вопрос: чтобы использовать DTLSv1.0, я предполагаю, что должен использовать TLSv1.1? (поскольку нет DTLS на базе TLSv1) - person osundblad; 21.12.2017
comment
Выбор DTLS происходит в момент создания файла SSLContext. - person user207421; 21.12.2017
comment
Вы правы, в RFC 4737, описывающем DTLS 1.0, говорится: «Там, где мы явно не вызываем различия, DTLS такой же, как в [TLS11]». - person Eugène Adell; 21.12.2017
comment
EJP: нет, проверьте еще раз методы SSLContext.getInstance(...), в данный момент это невозможно. Мы очень редко видим, что вы даете плохой ответ, кстати, спасибо за вашу прекрасную работу. - person Eugène Adell; 21.12.2017
comment
@EugèneAdell EugèneAdell приведенный вами пример кода не компилируется factory.createSocket, не принимает DatagramSocket. У вас случайно нет работающего кода? заранее спасибо - person osundblad; 21.12.2017
comment
У меня нет никакого кода, но я могу потратить некоторое время, чтобы сделать тесты позже. Взгляните на устаревшее, которое все еще должно работать docs.oracle.com/javase/7/docs/api/java/net/ - person Eugène Adell; 21.12.2017
comment
Обратите внимание: если вы запросите TLSv1.0 при вызове SSLContext.getInstance, SunJSSE интерпретирует это как максимальную версию протокола, которую вы хотите поддерживать. Как правило, вам следует просто попросить TLS разрешить согласование самой последней версии. - person Neil Madden; 25.02.2020
comment
@NeilMadden это где-нибудь задокументировано? Я не могу найти это. - person Eugène Adell; 25.02.2020
comment
Насколько я знаю, не документировано. Я знаю это по горькому опыту. См. исходный код: hg.openjdk.java.net/jdk/jdk/file/61ee15b9a1ac/src/java.base/ Каждый TLSXXContext по умолчанию включает только протоколы до этой версии. - person Neil Madden; 26.02.2020

Вы можете использовать https://github.com/AdoptOpenJDK/openjdk-jdk11/blob/master/test/jdk/javax/net/ssl/DTLS/DTLSOverDatagram.java (или https://github.com/twosigma/OpenJDK/blob/master/test/jdk/javax/net/ssl/DTLS/DTLSOverDatagram.java , то же самое)

Для человека, который убил мой предыдущий ответ из-за ссылок: даже если ссылка не работает, это не проблема, потому что, посмотрев на ссылку, вы с легкостью увидите, что DTLSOverDatagram является частью официальных тестов open-jdk 11 - так что даже если ссылка исчезает, вы можете легко найти другие источники.

Хотя это тесты для реализации DTLS, с небольшим рефакторингом их можно использовать в качестве основы для DTLS поверх (udp-) дейтаграмм. И для клиента, и для сервера — по сути, они почти одинаковы.

person mifritscher    schedule 15.08.2019

DTLS присутствует в JavaSE 9: SSLContext Имена алгоритмов

person dsh    schedule 06.03.2018
comment
JEP 219 добавляет поддержку DTLS, НО, согласно JEP, НЕ реализует фактические интерфейсы, специфичные для транспорта (см. нецели № 1 JEP) (openjdk.java.net/jeps/219) Итак, я думаю, нам нужно передавать фактические данные через стандартный DatagramSocket??? - person Peter Quiring; 30.03.2018