【问题标题】:Verifying the domain of a certificate in OpenSSL在 OpenSSL 中验证证书的域
【发布时间】:2012-06-03 01:08:57
【问题描述】:

我需要使用 C-land OpenSSL 验证 X509 证书的域。

我的理解是库不会为我做这件事,我必须大致实现以下算法:

  1. 如果 subjectAlternativeName 扩展的 dnsName 字段存在,请将 name 设置为该值。
  2. 否则,将name设置为主题的CN字段。
  3. name 与请求的主机名进行比较,允许每个星号匹配 [A-Za-z0-9_]+,但不匹配“点”(.)。

在我看来,应该有大量的代码来执行此操作,但我没有找到任何代码。

谁能找到这方面的例子?或者,对我的算法进行健全性检查?

编辑:这就是我想出的:https://gist.github.com/2821083。 OpenSSL 将其留给调用代码似乎真的很奇怪。

【问题讨论】:

  • 不要根据您在证书中找到的内容“设置”值,而应该反过来:检查您期望的内容是否具有匹配的 SAN DNS 条目。这是因为 SAN 扩展中可能有多个 DNS 条目。 (顺便说一句,现在 RFC 6125 中有更精确的通配符匹配规则。)

标签: openssl ssl x509


【解决方案1】:

您非常准确 - 尽管要注意主题备用名称和原始 IP 地址和 FQDN。你可能想偷东西

BOOL SSL_X509_getIDs(apr_pool_t *p, X509 *x509, apr_array_header_t **ids)

和来自http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/ssl/ssl_util_ssl.c的相关朋友和ssl_engine_init.c中的被调用者(顺便说一句是服务器端)的所有选项。

当您在执行 openssl 回调时 - 如果您尚未在 CTX 中提供,还请考虑日期和时间以及链。

Dw.

【讨论】:

    【解决方案2】:

    OpenSSL 将其留给调用代码似乎真的很奇怪。

    是的,它在实践中非常有问题的遗漏,因为很多应用程序没有意识到他们必须手动执行检查。

    OpenSSL 1.1.0 将包括主机名验证(现在位于 HEAD 中(截至 2013 年 9 月))。根据更改日志,有一个-verify_name 选项,apps.c 响应-verify_hostname 开关。但是s_client 不会响应任一开关,因此不清楚将如何为客户端实施或调用主机名检查。


    如果存在subjectAlternativeName 扩展的dnsName 字段,请将名称设置为该值。

    可能有多个主题备用名称 (SAN),因此请准备好多个。

    否则,将名称设置为主题的CN字段。

    我相信你也需要检查它是否匹配。

    将名称与请求的主机名进行比较,允许每个星号 匹配 [A-Za-z0-9_]+,但不匹配 'dot' (.)。

    它更痛苦。您还必须确保您没有匹配 gTLD 或 ccTLD。例如,您不想匹配针对 gTLD *.com 颁发的证书。那个证书可能是坏人签发的;)

    ccTLD 类似于 *.eu、*.us 或 இலங்கை (nic.lk)。其中大约有 5000 个,Mozilla 在http://publicsuffix.org/ 上提供了一个列表。原始列表位于https://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1


    在我看来,应该有大量的代码可以做 这个,但我没有找到。

    除了v​​an Gulik的建议,你也可以试试Curl。我相当肯定 Curl 包含主机名匹配代码。


    您甚至可以验证证书格式是否正确。在 Web 上下文中负责的组是 CA/浏览器论坛。他们对创建证书有基本要求和扩展要求:

    在基线文档中,您会发现,例如,作为通用名称 (CN) 列出的 IP 也必须在主题备用名称 (SAN) 中列出。

    在扩展文档中,您会发现保留 IP (RFC 1918) 不能出现在扩展验证 (EV) 证书中;和 EV 证书不能包含通配符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-21
      • 1970-01-01
      • 1970-01-01
      • 2015-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-19
      相关资源
      最近更新 更多