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

Java1.7 TLS1.2实现在连接时是否考虑了dNSName(SAN扩展)?,java,ssl,verification,endpoint,hostname,Java,Ssl,Verification,Endpoint,Hostname,我正在实现一个协议,该协议将TLS1.2指定为传输层,并要求客户端服务器身份验证,通过比较连接客户端套接字的主机名值与服务器在其证书中指示的值来验证服务器的主机名,即subjectAltName类型的扩展dNSName 我创建了一个测试,将这个值放在服务器的证书中,客户端似乎完全忽略了它,但我想确定一下。我是否必须在实现X509ExtendedTrustManager.checkServerTrusted(X509Certificate[],String,Socket)中对该检查进行编码,还是可

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

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

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

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

然而,当我试图用
keytool
创建这样一个扩展值时,它拒绝了。发生什么事了

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

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


主机名验证参考指南:

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

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

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

我也在处理相关问题,几天后我将发布我的API


通配符证书-我刚刚向jdk开发人员提出了同样的问题,等待答复-
主机名验证参考指南:

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

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

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

我也在处理相关问题,几天后我将发布我的API


通配符证书-我刚刚向jdk开发人员提出了同样的问题,等待答复-
主机名验证参考指南:

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

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

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

我也在处理相关问题,几天后我将发布我的API


通配符证书-我刚刚向jdk开发人员提出了同样的问题,等待答复-
主机名验证参考指南:

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

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

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

我也在处理相关问题,几天后我将发布我的API


通配符证书-我刚刚向jdk开发人员提出了同样的问题,等待答复-
Java 7提供了一种在
SSLSocket
SSLEngine
上自动验证主机名的方法,但它不是自动启用的(Java 6中不存在这种方法)。该实现可以使用
SSLParameters sslParams = new SSLParameters();
sslParams.setEndpointIdentificationAlgorithm("HTTPS");
sslSocket.setSSLParameters(sslParams); // or SSLEngine