我需要用C-土地的OpenSSL验证X509证书的域。
我的理解是,库不为我做到这一点,我必须大致实现以下算法:
- 如果主题替代延伸DNSNAME域存在,设置
name
为该值。 - 否则,设置
name
为主题的CN域。 - 比较
name
相对于请求的主机名,允许每个星号可匹配[A-ZA-Z0-9 _] +,而不是'点'(。)。
在我看来,应该有大量的代码踢各地要做到这一点,但我还没有发现任何。
任何人都可以找到这样的例子? 或可替换地,理智检查我的算法?
编辑:这是我想出了: https://gist.github.com/2821083 。 看来还真奇怪,OpenSSL的会离开这个高达调用代码。
你几乎现货上 - 不过要当心主题备用名称和原始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。
看来还真奇怪,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证书不能包含通配符。