gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:47:54 24 4
gpt4 key购买 nike

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

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

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

A "*" wildcard character MAY be used as the leftmost name component in the certificate. For example, *.example.com would match a.example.com, foo.example.com, etc., but would not match example.com.

但是,当我尝试使用 keytool 创建这样的扩展值时,它拒绝这样做。怎么回事?

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

keytool error: java.lang.RuntimeException: java.io.IOException: DNSName components must begin with a letter

最佳答案

Java 7 提供了一种在 SSLSocketSSLEngine 上自动验证主机名的方法,但它不会自动启用(这在 Java 6 中不存在) .实现可以使用 LDAP 或 HTTPS 的命名规范,而不是更通用的 RFC 6125(至少目前还没有)。在大多数情况下,使用 HTTPS 规范的这一部分应该适用于其他协议(protocol),当然总比没有好。

您可以按如下方式使用它:

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

您可以找到相关引用资料:

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

编辑:

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

关于java - Java1.7 TLS1.2 实现是否在连接时考虑 dNSName(SAN 扩展名)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25618382/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com