SSL握手时是否检查服务器的域名

Cha*_*ndu 2 dns ssl

在 SSL 握手期间,是否在 SSL 握手期间检查服务器的域名,我的意思是服务器中的域名是否根据运行服务器的域进行了检查?

示例:假设服务器证书具有域 mydomain.com 。如果服务器在域 someotherdomain.com 中运行......这是否在 SSL 握手期间检查并中止,因为 mydomain.com 不是 someotherdomain.com ?

Bru*_*uno 5

这取决于...

SSL/TLS 标准本身没有指定验证服务器证书的方式和时间。

介绍

[...] 如何发起 TLS 握手以及如何解释交换的身份验证证书的决定留给了在 TLS 之上运行的协议的设计者和实施者的判断。

话虽如此,虽然它没有指定必须如何进行身份验证,但实现旨在在握手期间(或至少,紧接其后)执行此检查:

  • 附录 D
  • 一些错误消息显然与证书身份验证失败有关 ( bad_certificate,certificate_expired,...)。
  • 握手概述中的一些文本:“ [...] 如果服务器经过身份验证,它可能会从客户端请求证书,如果这适合所选的密码套件。

在大多数情况下,证书验证本身以RFC 3280 / RFC 5280为指导。默认情况下,许多 SSL/TLS 堆栈至少会这样做。

主机名验证可以被视为证书身份验证步骤之一,历史上一直是单独实施的。这主要是因为 RFC 3280/RFC 5280 没有解决这一步,而是将它留给每个应用程序协议。RFC 6125 中有一个相对较新的协调尝试(您可以在附录 B 中找到协议中的差异)。

在 SSL/TLS 握手期间是否完成主机名检查取决于您使用的库以及您如何配置它。

例如,在 Java 7 之前,这必须与主 JSSE API ( SSLSocket/ SSLEngine)分开完成。(HttpsURLConnection例如,这是在 中完成的,但它位于 JSSE 的顶部,而不是内部。)从 Java 7 开始,可以在握手期间和在 JSSE 中使用 执行此检查X509ExtendedTrustManager,但这必须使用 进行配置SSLParameters.setEndpointIdentificationAlgorithm(...),它仅支持HTTPSLDAPS(这是说,即使你的服务不使用HTTP,使用HTTPS端点识别算法不会是一个不错的选择,当然聊胜于无)。

其他 SSL/TLS 库或用其他语言包装其他库至少会为此提供回调。它们是否被开发人员使用(并正确使用)取决于,如本文所示。(您可能也对 Security.SE 上的这个问题感兴趣。)