2013-10-07 32 views
0

在SSL握手期间,SSL握手过程中检查的服务器的域名是否与服务器正在运行的域中检查的服务器域中的域名相符?在SSL握手过程中检查服务器的域名

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

回答

2

这取决于...

SSL/TLS标准本身并未指定如何以及何时验证服务器证书。

introduction

[...]关于如何启动TLS握手,以及如何解释交换留在认证证书运行在协议的设计者和实现的判断决定TLS的顶部。

这就是说,虽然它没有指定认证如何有发生,实现意味着握手期间进行这样的检查(或后立即至少):

  • Appendix D
  • 某些error messages与证书认证失败(bad_certificate,certificate_expired,...)明显相关。
  • 一些在handshake overview文字:“[...]如果服务器进行身份验证,它可以从客户端请求证书,如果是适当的选择的加密套件

在大多数情况下,证书验证本身由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(...),其中only supports HTTPS and LDAPS(这就是说,即使你的服务没有使用HTTP,使用HTTPS作为端点识别算法也不是一个不错的选择,肯定比没有好)。

其他SSL/TLS库或用其他语言包装其他库往往至少有回调。它们是否被开发人员使用(并正确使用)取决于,如this paper所示。 (您可能也有兴趣在Security.SE上this question

0

编号主机名检查是HTTPS的一部分,而不是SSL。

+0

该问题没有说一个关于HTTPS的单词;) –

0

是的。在SSL握手期间,正确的客户端应将其连接的主机名与证书中指定的域名进行比较。不这样做会使TLS无用,因为MITM攻击在其他方面微不足道。

请注意,存在许多写得不好的软件,它们会接受任何提供的证书并且不会执行适当的证书验证。最近有关于Android软件的这个问题的报告。看来成千上万的软件头衔(主要是免费软件)没有执行适当的验证,因此给用户带来了安全风险。

+0

SSL/TLS假定服务器的私钥没有被泄露。如果我正确的话,如果MITM由HTTPS实现,则RFC 6125解决了这个问题。 – Chandu

+0

@ user1197140服务器的真实性以某种方式进行检查(对于证书,这是一个验证过程,但TLS不仅支持基于证书的身份验证)。钥匙是否被妥协 - 这是一个完全不同的故事。检查地址(或域名)是为了确保您连接到期望的服务器A,并且MITM不会提供为服务器B颁发的证书。 –