代码之家  ›  专栏  ›  技术社区  ›  predi

Java1.7 TLS1.2实现在连接时是否考虑dNSName(SAN扩展)?

  •  0
  • predi  · 技术社区  · 11 年前

    我正在实施一个协议 TLS1.2 作为传输层,需要客户端服务器身份验证,通过将连接客户端套接字的主机名值与服务器在其证书中指示的值进行比较来验证服务器的主机名,即 subjectAltName 类型的扩展 dNSName .

    我创建了一个测试,将该值放入服务器的证书中,客户端似乎完全忽略了它,但我想确定。我是否必须在实现中对该检查进行编码 of X509ExtendedTrustManager.checkServerTrusted(X509Certificate[], String, Socket) 或者我可以通过一些模糊的属性启用它吗?这个 reference guide 对此事似乎保持沉默。

    协议规范(我正在实现的协议规范)还提到,通配符可以用作证书中值的前缀。

    “*”通配符可以用作最左边的名称 证书中的组件。例如,*.example.com将 匹配a.example.com、foo.example.com等,但不匹配 例如.com。

    然而,当我尝试使用 keytool ,它拒绝这样做。发生了什么?

    “C:\Program Files\Java\jdk1.7.0_51\bin\keytool.exe”-genkepair-alias server-keyalg RSA-validity 365-ext san=dns:*.example.com-keystore mykeystore ...

    keytool错误:java.lang.RuntimeException:java.io.io异常:DNSName组件必须以字母开头

    2 回复  |  直到 11 年前
        1
  •  2
  •   Bruno    11 年前

    Java 7提供了一种在 SSLSocket SSLEngine ,但它不会自动启用(这在Java 6中不存在)。该实现可以使用LDAP或HTTPS的命名规范,而不是更通用的RFC 6125(至少目前还没有)。在大多数情况下,对于其他协议,使用HTTPS规范的这一部分应该很好,当然总比什么都没有好。

    您可以按如下方式使用:

    SSLParameters sslParams = new SSLParameters();
    sslParams.setEndpointIdentificationAlgorithm("HTTPS");
    sslSocket.setSSLParameters(sslParams); // or SSLEngine
    

    您可以为此找到参考:

    你遇到的第二个问题似乎是 keytool ,以生成这样的证书。这并不影响向Java客户端提供的此类证书的验证方式。如果需要,可以使用其他工具生成带有通配符的证书。

    编辑:

    请注意,要使其工作,您需要创建 SSL插座 使用的方法 String host (以便它知道主机名)或 SSL发动机 具有 SSLContext.createSSLEngine(String peerHost, int peerPort) 。这就是它如何知道要尝试在证书中匹配哪个主机名。(使用该名称对SNI也很有用。)

        2
  •  1
  •   ZhongYu    11 年前

    主机名验证参考指南:

    http://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#ciphersuitechoice

    当使用原始SSLSocket和SSLEngine类时,在发送任何数据之前,应始终检查对等方的凭据。SSLSocket和SSLEngine类不会自动验证URL中的主机名是否与对等方凭据中的主机名称匹配。如果未验证主机名,应用程序可能会被URL欺骗攻击。

    因此,您必须手动执行此操作。从概念上讲,这项任务不属于信托管理人的责任;在建立连接后,通过检查对等证书,这可能更好。

    奇怪的是,没有公开的API来实现这一点。如果你不介意依靠 sun.* 包,您可以使用 sun.security.util.HostnameChecker.match(String expectedName, X509Certificate cert) .

    我也在研究相关问题,几天后我会发布我的API。


    通配符证书-我刚刚向jdk开发人员提出了同样的问题,等待答复- http://mail.openjdk.java.net/pipermail/security-dev/2014-September/011153.html