获取与证书匹配的所有主机名列表
如何获取与证书( 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.org
与example.org
不匹配。)