【问题标题】:get list of all hostnames matching certificate获取与证书匹配的所有主机名列表
【发布时间】:2013-07-30 09:06:06
【问题描述】:

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

【问题讨论】:

    标签: java ssl certificate ssl-certificate


    【解决方案1】:

    主机名验证如何与证书绑定在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(通用名称)并将其添加到您的列表中。 (有关如何提取 CN,请参阅 this question。请注意,RFC 2818 中“最具体”的 CN 概念是 RFC 6125 中承认和解决的歧义。)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-27
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 2018-06-18
      • 2021-07-07
      相关资源
      最近更新 更多