【问题标题】:Is there a DTLS implementation in JSSEJSSE 中是否有 DTLS 实现
【发布时间】:2017-12-21 08:10:49
【问题描述】:

我想在 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.

所以我认为我可以在不使用任何库(例如 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。
  • 我认为这是网站的一个小故障;我几年前下载的文档包在这里有所不同。页面中间“支持类和接口”的表格正确显示了 SSL3、TLS1、1.1、1.2 用于 8 和 7,对于 6,TLS1.1 和 1.2 仅在 6u111 和 6u121 (即在付费计划中)或 OpenJDK)。同上“标准名称”,例如docs.oracle.com/javase/8/docs/technotes/guides/security/… et pred.

标签: java udp jsse dtls


【解决方案1】:

你可以使用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 的基础。对于客户端和服务器 - 事实上,它们几乎相同。

【讨论】:

    【解决方案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);
    

    【讨论】:

    • 谢谢,还有一个后续问题:要使用 DTLSv1.0,我假设我应该使用 TLSv1.1? (因为没有基于 TLSv1 的 DTLS)
    • 在创建 SSLContext 时选择 DTLS。
    • 你猜对了,描述 DTLS 1.0 的 RFC 4737 说“我们没有明确指出差异,DTLS 与 [TLS11] 中的相同”
    • EJP :不,再次检查 SSLContext.getInstance(...) 方法,目前不可能。我们很少看到您给出错误的答案,顺便感谢您的出色工作。
    • @EugèneAdell 您提供的代码示例无法编译factory.createSocket 不接受DatagramSocket。你没有碰巧有一些有效的代码吗?提前致谢
    【解决方案3】:

    JavaSE 9 中存在 DTLS:SSLContext Algorithm Names

    【讨论】:

    • JEP 219 根据 JEP 添加了对 DTLS "BUT" 的支持并没有实现实际的传输特定接口(参见 JEP 的非目标 #1)(openjdk.java.net/jeps/219)所以我想我们必须通过标准 DatagramSocket 传输实际数据???
    猜你喜欢
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 2020-06-23
    相关资源
    最近更新 更多