java 证书主机名验证

f2uvfpb9  于 2023-03-28  发布在  Java
关注(0)|答案(1)|浏览(151)

我想验证给定证书(X509Certificate对象)的主机名。也就是说,检查主机名是否与证书的“主题备用名称”或“公用名称”字段中列出的任何主机名匹配。
我在网上读到你可以导入javax.net.ssl.HostnameVerifier然后使用HttpsURLConnection.getDefaultHostnameVerifier().verify(...)来实现。但是,verify函数需要一个SSLSession对象,所以它不能与X509Certificate对象一起工作。
我很感激你的帮助。谢谢。

31moq8wy

31moq8wy1#

为了验证服务器提供的主机名是否包含在证书的CN或SAN中包含的主机名中,您需要从连接中读取主机名,并从证书中读取SAN & CN,如下所示:

String host = connection.getURL().getHost();

   Collection<List<?>> subjectAlternativeNames = x509.getSubjectAlternativeNames();

   String name = x509.getSubjectX500Principal().getName();
   String cn = name.replace("(?:^|,\\s?)(?:CN=(?<val>\"(?:[^\"]|\"\")+\"|[^,]+)", "$1");

请注意,当建立SSL连接时,这正是HostnameVerifier所做的。

相关问题