如何获取与证书(java.security.cert.X509Certificate)匹配的所有主机名和IP的列表,包括主题替代名称?我只发现了javax.net.ssl.HostnameVerifiers的各种实现.
解决方法:
主机名验证如何与证书绑定在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.org与example.org不匹配.)