我想在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实现?如果是这样你应该如何使用它?
答案 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