在SSL握手期间是否检查了服务器的域名

时间:2013-10-07 09:01:05

标签: ssl dns

在SSL握手期间,是SSL握手期间检查的服务器的域名,我的意思是服务器运行的域中根据服务器验证的服务器中的域名是什么?

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

3 个答案:

答案 0 :(得分:2)

这取决于......

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

来自introduction

  

[...]关于如何启动TLS握手以及如何解释交换的身份验证证书的决定由TLS之上运行的协议的设计者和实现者做出判断。

虽然如此,虽然它没有说明如何进行身份验证,但是实现意味着在握手期间(或者至少在紧接着之后)执行此检查:

  • 请参阅Appendix D
  • 某些error messages与证书身份验证失败明显相关(bad_certificatecertificate_expired,...)。
  • handshake overview中的部分文字:“ [...]如果服务器已通过身份验证,则可以从客户端请求证书,如果该证书适用于所选的密码套件。< / EM>“

在大多数情况下,证书验证本身由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开始,可以在握手期间使用{{3}在JSSE中执行此检查。 },但必须使用X509ExtendedTrustManager进行配置,SSLParameters.setEndpointIdentificationAlgorithm(...)(即使您的服务不使用HTTP,使用HTTPS进行端点识别算法也不会是一个糟糕的选择,当然总比没有好。)

其他SSL / TLS库或其他语言包装其他库往往至少会有回调。它们是否被开发人员使用(并且正确使用)取决于only supports HTTPS and LDAPS中所示。 (您可能也对Security.SE上的this paper感兴趣。)

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

请注意,存在许多编写得很糟糕的软件,它们接受任何提供的证书并且没有进行适当的证书验证。最近有一个关于Android软件的关于这个问题的报告。似乎数千个提供的软件标题(主要是免费软件)不执行适当的验证,从而给用户带来安全风险。