获取与证书匹配的所有主机名列表

如何获取与证书( java.security.cert.X509Certificate )匹配的所有主机名和IP的列表,包括主题备用名称? 我只发现了javax.net.ssl.HostnameVerifier的各种实现。

主机名validation如何与证书绑定在RFC 2818第3.1节中定义(对于HTTPS,对于其他协议,请参阅RFC 6125 ,但它非常相似)。

简而言之:

  • 使用您的X509Certificate实例,并遍历getSubjectAlternativeNames()的结果。
  • 每个条目都是一个2元素列表。 第一个是类型,第二个是实际值。
  • 类型2用于DNS名称,类型7用于IP地址。 你需要单独对待它们。
  • 如果有任何SAN IP地址条目,请将这些地址添加到IP地址列表中。
  • 如果有任何SAN DNS名称条目,请将这些名称添加到IP地址列表中。
  • 如果没有任何SAN DNS名称条目(但可能仍有IP SAN AFAIK),您可以阅读证书的主题DN并提取其CN(公用名)并将其添加到列表中。 (请参阅有关如何提取CN的此问题 。请注意,RFC 2818中“最具体”CN的概念是在RFC 6125中得到承认和解决的模糊性。)

请注意,证书中的某些主机名可能包含通配符,因此您将无法构建可能匹配的详尽列表。 wilcards的这个问题当然是编写validation程序通常比尝试获取完整列表更有意义的原因之一。 (有关位置的详细信息,请阅读RFC 2818第3.1节,并记住点本身不是通配符表达式的一部分,因此*.example.orgexample.org不匹配。)