delphi – 如何验证服务器主机名
我使用Indy TIdHTTP(随XE2一起提供)和OpenSSL库DLL V1.0.1m在通过HTTPS连接时验证证书.我已经为TIdSSLIOHandlerSocketOpenSSL组件的OnVerifyPeer事件实现了一个事件处理程序.
function TForm1.IdSSLIOHandlerSocketOpenSSL1VerifyPeer(Certificate: TIdX509; AOk: Boolean; ADepth,AError: Integer): Boolean; begin (...) end;
现在我有一个问题是验证服务器证书的主机名: 虽然通用名称(CN)中存在通配符
>任何人都可以确认Indy或OpenSSL库删除了通配符,尽管有必要验证主机名吗? 任何帮助是极大的赞赏.谢谢阅读. 解决方法
不,OpenSSL不会删除它. 我不知道Indy图书馆.
我之所以引用这两次是有原因的.IETF和CA / B论坛(浏览器遵循的内容)不推荐在公共名称(CN)中放置服务器名称. 您可能遇到的是CN = example.com.在这种情况下,example.com不是服务器名称;相反,它是一个领域.所以你不应该认为它意味着匹配* .example.com. 如果服务器在https://example.com上回答,则只有在主题备用名称包含example.com时才应接受证书,因为公共CA在CN中列出了域.公共CA将DNS名称放在SAN中,因为它们遵循CA / B论坛.
1.1.0之前的OpenSSL没有执行主机名匹配.开发人员必须这样做. OpenSSL 1.1.0及更高版本具有内置功能.请参阅 要匹配主机名,您应该从通用名称(CN)和主题备用名称(SAN)中收集所有名称.然后,它通常像正则表达式匹配一样简单. IETF快速且宽松,它们允许主机名出现在CN或SAN中. CA / B论坛和浏览器更严格:如果主机名在CN中,那么它也必须存在于SAN中(是的,它必须列出两次).否则,CA / B论坛和浏览器需要SAN中的所有主机名. 我相信OpenSSL和CA / B论坛只允许在最左边的标签中使用通配符.我相信IETF允许通配符显示在任何地方. 如果您想查看示例代码,请查看cURL的实现. cURL使用OpenSSL,但不依赖于1.1.0的 快速警告.主机名匹配是一种黑色艺术.例如…. IETF允许匹配全球顶级域名(gTLD),如* .com或* .net;和国家顶级域名(ccTLD),如* .uk或* .us.我认为这是一次攻击,因为我知道没有一个CA可以声称“拥有”或“认证”gTLD.如果我在野外体验其中一种证书,那么我拒绝它. CA / B论坛不允许通配gTLD或ccTLD.浏览器尝试使用Public Suffix List(PSL)来避免它.虚拟域名的情况只会变得更糟,例如* .google. 浏览器尝试使用PSL还有另外一件事.他们试图在子域上划分出行政边界.例如,亚马逊拥有所有amazon.com,但他们将权限委托给子域名,例如example.amazon.com.所以PSL试图允许亚马逊控制他们的域名amazon.com,但不是你的商家相关的example.amazon.com子域名. IETF试图在DBOUND Working Group中解决行政边界问题.但委员会似乎停滞不前. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |