Java JSSE中是否有DTLS实现

Java JSSE中是否有DTLS实现,java,udp,jsse,dtls,Java,Udp,Jsse,Dtls,我想用Java实现一个DTLS 1.0客户机,在谷歌搜索了一段时间后,我发现上面写着: JSSEAPI能够支持SSL版本2.0和3.0以及TLS 版本1.0。这些安全协议封装了一个普通的 双向流套接字,JSSEAPI添加了透明支持 用于身份验证、加密和完整性保护JSSE JDK附带的实现支持SSL 3.0、TLS(1.0、1.1、, 和1.2)和DTLS(版本1.0和1.2)。它不实现SSL 2.0 所以我想我可以在纯Java中实现它,而不用使用任何库(例如BouncyCastle) 但当我尝试

我想用Java实现一个DTLS 1.0客户机,在谷歌搜索了一段时间后,我发现上面写着:

JSSEAPI能够支持SSL版本2.0和3.0以及TLS 版本1.0。这些安全协议封装了一个普通的 双向流套接字,JSSEAPI添加了透明支持 用于身份验证、加密和完整性保护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…)时:

它抛出:

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协议:


在创建套接字时选择DTL,因为它将是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中:

您可以使用(或者,相同)

对于因为链接而杀死我之前答案的人:即使链接断开,这也没问题——因为在查看链接时,你会很容易看到DTLSOverdata是官方开放jdk 11测试的一部分——因此,即使链接消失,你也可以很容易地找到其他来源


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

好问题。标准名称页面中没有提到DTL。我认为这是网站的一个小故障;我几年前下载的文档包在这里是不同的。页面中间“支持类和接口”的表格正确地显示了8和7的SSL3、TLS1、1.1、1.2,而6的TLS1.1和1.2仅在6u111和6u121(即在付费计划或OpenJDK上)。类似于et pred上的“标准名称”。谢谢,还有一个后续问题:要使用DTLSv1.0,我想我应该使用TLSv1.1?(因为没有基于TLSv1的DTL)选择DTL是在创建
SSLContext
时进行的。假设您是对的,RFC 4737描述了DTLs1.0,它说“在我们没有显式调用差异的地方,DTL与[TLS11]中的相同”。EJP:不,再次检查SSLContext.getInstance(…)方法,现在不可能。我们很少看到你给出不好的答案,顺便说一句,谢谢你的出色工作。@EugèneAdell你给出的代码示例没有编译
工厂。createSocket
不接受
DatagramSocket
。你没有合适的代码吗?谢天谢地,JEP 219增加了对DTL的支持,但是“根据JEP的说法,JEP没有实现实际的传输特定接口(参见JEP的非目标1)(),所以我想我们必须通过标准DatagramSocket传输实际数据???
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);