2

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

4

1 回答 1

6

主机名验证如何与证书绑定在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。)

于 2013-07-30T13:23:03.767 回答