3

我想在 Java 中实现一个 DTLS 1.0 客户端,经过一番谷歌搜索后,发现JSSERefGuide显示以下内容:

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

4

3 回答 3

4

您可以使用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 over (udp-) 数据报的基础。对于客户端和服务器 - 事实上,它们几乎相同。

于 2019-08-15T16:06:25.413 回答
2

JavaSE 9 中存在 DTLS: SSLContext 算法名称

于 2018-03-06T18:45:24.160 回答
2

该文档是正确的,您会收到一个异常,因为没有 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);
于 2017-12-21T10:04:26.187 回答