验证OpenSSL中证书的域(Verifying the domain of a certifica

2019-07-29 14:18发布

我需要用C-土地的OpenSSL验证X509证书的域。

我的理解是,库不为我做到这一点,我必须大致实现以下算法:

  1. 如果主题替代延伸DNSNAME域存在,设置name为该值。
  2. 否则,设置name为主题的CN域。
  3. 比较name相对于请求的主机名,允许每个星号可匹配[A-ZA-Z0-9 _] +,而不是'点'(。)。

在我看来,应该有大量的代码踢各地要做到这一点,但我还没有发现任何。

任何人都可以找到这样的例子? 或可替换地,理智检查我的算法?

编辑:这是我想出了: https://gist.github.com/2821083 。 看来还真奇怪,OpenSSL的会离开这个高达调用代码。

Answer 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。



Answer 2:

看来还真奇怪,OpenSSL的会离开这个高达调用代码。

是的,在实践中的很多问题不作为,因为许多应用程序并没有意识到他们必须手动进行检查。

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


如果dnsName基于场subjectAlternativeName扩展存在,集名称为该值。

有可能是多个使用者替代名称(SAN),所以要超过一个准备。

否则,设置名称为主题的CN域。

我相信你需要检查是否匹配,太。

比较名称相对于请求的主机名,允许每个星号可匹配[A-ZA-Z0-9 _] +,而不是 '点'(。)。

它的痛苦得多。 你还必须确保你不相匹配的通用顶级域名或国家代码顶级域名。 例如,你不想来匹配对通用顶级域名颁发的证书*.com 。 该证书可能是由一个坏家伙发出;)

ccTLD的像* .EU,*页面没有自动跳转,或இலங்கை(nic.lk)。 这里也有一些5000左右他们和Mozilla提供的列表http://publicsuffix.org/ 。 生名单在https://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1 。


在我看来,应该有大量的代码踢各地要做到这一点,但我还没有发现任何。

除了面包车罗佩的建议,你也可以尝试卷曲。 我相当肯定卷曲包含主机名匹配代码。


你甚至可以验证的证书完全形成了。 负责在网络的上下文中的组是CA /浏览器论坛。 他们有基准和创建证书的扩展需求:

  • 基线证书要求, https://www.cabforum.org/Baseline_Requirements_V1_1_6.pdf
  • 扩展验证证书要求, https://www.cabforum.org/Guidelines_v1_4_3.pdf

在基准文档,你会发现,例如,列为公用名称(CN)的IP也必须在使用者替代名称(SAN)中列出。

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



文章来源: Verifying the domain of a certificate in OpenSSL
标签: openssl ssl x509