加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 如何验证服务器主机名

发布时间:2020-12-15 04:14:07 所属栏目:大数据 来源:网络整理
导读:我使用Indy TIdHTTP(随XE2一起提供)和OpenSSL库DLL V1.0.1m在通过HTTPS连接时验证证书.我已经为TIdSSLIOHandlerSocketOpenSSL组件的OnVerifyPeer事件实现了一个事件处理程序. function TForm1.IdSSLIOHandlerSocketOpenSSL1VerifyPeer(Certificate: TIdX509;
我使用Indy TIdHTTP(随XE2一起提供)和OpenSSL库DLL V1.0.1m在通过HTTPS连接时验证证书.我已经为TIdSSLIOHandlerSocketOpenSSL组件的OnVerifyPeer事件实现了一个事件处理程序.
function TForm1.IdSSLIOHandlerSocketOpenSSL1VerifyPeer(Certificate: TIdX509;
  AOk: Boolean; ADepth,AError: Integer): Boolean;
begin
  (...)
end;

According to RFC 2818,chapter 3.1.,if the hostname is available to
the client,the client MUST check it against the server’s identity as
presented in the server’s Certificate message,in order to prevent
man-in-the-middle attacks.

现在我有一个问题是验证服务器证书的主机名:

虽然通用名称(CN)中存在通配符
服务器证书(* .google.com)中“主题”字段中的字段,
OnVerifyPeer事件的参数Certificate.Subject.OneLine
返回没有任何通配符的CN(即google.com而不是* .google.com).

As stated in RFC 2818,chapter 3.1. the wildcard character * is used
to match any single domain name component or component fragment.

>任何人都可以确认Indy或OpenSSL库删除了通配符,尽管有必要验证主机名吗?
>有没有人想在这些情况下验证主机名?

任何帮助是极大的赞赏.谢谢阅读.

解决方法

Can anyone confirm that the wildcard character is removed by Indy or the OpenSSL libraries,although it is necessary to verify the hostname?

不,OpenSSL不会删除它.

我不知道Indy图书馆.

Can anyone confirm that the wildcard character is removed by Indy or the OpenSSL libraries,although it is necessary to verify the hostname?

我之所以引用这两次是有原因的.IETF和CA / B论坛(浏览器遵循的内容)不推荐在公共名称(CN)中放置服务器名称.

您可能遇到的是CN = example.com.在这种情况下,example.com不是服务器名称;相反,它是一个领域.所以你不应该认为它意味着匹配* .example.com.

如果服务器在https://example.com上回答,则只有在主题备用名称包含example.com时才应接受证书,因为公共CA在CN中列出了域.公共CA将DNS名称放在SAN中,因为它们遵循CA / B论坛.

Has anyone an idea to verify the hostname under these circumstances?

1.1.0之前的OpenSSL没有执行主机名匹配.开发人员必须这样做. OpenSSL 1.1.0及更高版本具有内置功能.请参阅X509_check_host(3)和朋友.

要匹配主机名,您应该从通用名称(CN)和主题备用名称(SAN)中收集所有名称.然后,它通常像正则表达式匹配一样简单.

IETF快速且宽松,它们允许主机名出现在CN或SAN中. CA / B论坛和浏览器更严格:如果主机名在CN中,那么它也必须存在于SAN中(是的,它必须列出两次).否则,CA / B论坛和浏览器需要SAN中的所有主机名.

我相信OpenSSL和CA / B论坛只允许在最左边的标签中使用通配符.我相信IETF允许通配符显示在任何地方.

如果您想查看示例代码,请查看cURL的实现. cURL使用OpenSSL,但不依赖于1.1.0的X509_check_host(3)和朋友. cURL有自己的实现.

快速警告.主机名匹配是一种黑色艺术.例如….

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中解决行政边界问题.但委员会似乎停滞不前.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读