JSSE中是否有DTLS实现

Is there a DTLS implementation in JSSE

我想在 Java 中实现 DTLS 1.0 客户端,在 google 之后我发现 JSSERefGuide 说了以下内容:

The JSSE API is capable of supporting SSL versions 2.0 and 3.0 and TLS version 1.0. These security protocols encapsulate a normal bidirectional stream socket, and the JSSE API adds transparent support for authentication, encryption, and integrity protection. The JSSE implementation shipped with the JDK supports SSL 3.0, TLS (1.0, 1.1, and 1.2) and DTLS (version 1.0 and 1.2). It does not implement SSL 2.0.

所以我认为我可以在不使用任何库(例如 BouncyCastle)的情况下以纯 Java 实现它

但是当我尝试 运行(以及其他一些,例如 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 实现吗?如果是这样,您应该如何使用它?

文档是正确的,你会得到一个异常,因为没有 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);

DTLS 存在于 JavaSE 9 中:SSLContext Algorithm Names

可以用https://github.com/AdoptOpenJDK/openjdk-jdk11/blob/master/test/jdk/javax/net/ssl/DTLS/DTLSOverDatagram.java (or https://github.com/twosigma/OpenJDK/blob/master/test/jdk/javax/net/ssl/DTLS/DTLSOverDatagram.java,一样)

对于因为 links 而杀死我之前的答案的人:即使 link 中断也没有问题 - 因为看着 link 你会很容易看出 DTLSOverDatagram 是官方开放-jdk 11 测试的一部分 - 因此即使 link 消失,您也可以轻松找到其他来源。

虽然这些是针对 DTLS 实现的测试,但只需进行少量重构,就可以将其用作 DTLS over (udp-) 数据报的基础。对于客户端和服务器——事实上,它们几乎是一样的。