主机名验证与证书的绑定方式在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中得到承认和解决。)
请注意,证书中的某些主机名可能包含通配符,因此您将无法建立详尽的可能匹配列表。通配符的问题当然是写验证程序比尝试获取完整列表通常更有意义的原因之一。(有关位置的详细信息,请阅读RFC
2818第3.1节,并请记住,点本身不是通配符表达式的一部分,因此
*.example.org不匹配
example.org。)



