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

时间:2013-07-30 09:32:04

标签: java ssl certificate ssl-certificate

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

1 个答案:

答案 0 :(得分:6)

RFC 2818, Section 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(公用名)并将其添加到列表中。 (参见this question关于如何提取CN。请注意,RFC 2818中“最具体”CN的概念是在RFC 6125中承认和解决的歧义。)

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