JSSE中是否有DTLS实现

时间:2017-12-21 08:10:49

标签: java udp jsse dtls

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

  

JSSE API能够支持SSL版本2.0和3.0以及TLS   版本1.0。这些安全协议封装了法线   双向流套接字,JSSE API增加了透明支持   用于身份验证,加密和完整性保护。 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实现?如果是这样你应该如何使用它?

3 个答案:

答案 0 :(得分:2)

您可以使用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实现的测试,但几乎不需要重构,就可以用作基于(udp-)数据报的DTLS的基础。对于客户端和服务器-实际上,它们几乎是相同的。

答案 1 :(得分:0)

文档是正确的,因为没有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);

答案 2 :(得分:0)

DTSE出现在JavaSE 9中:SSLContext Algorihtm Names