在build立TLS / LDAP或TLS / HTTP连接时,连线上会发生什么情况?

我正在改写我的问题,希望能得到更好的回应。 我在这里问了一个关于serverfault的类似问题,并认为一个正确和有效的TLS服务器是一个需要“STARTTLS”命令的服务器。

是否可以在不需要额外端口的情况下将STARTTLS发布到正确configuration的LDAP或HTTP TLS服务器? 我知道从SMTP的angular度来看这是真实的,但我不确定我可以将这些经验应用到其他协议的广泛程度。

我花时间阅读(但不完全掌握)

  • TLS规范
  • TLS和SSL之间的区别
  • SSL规格

问:在通过LDAP或HTTP会话build立TLS之前,线路上会发生什么? 由于这是基于TCP的,我可以简单地telnet到该端口并发出一些命令来validation它的工作(到那一点)?

SSL和TLS在使用方式上几乎没有区别。 然而,SSL / TLS的前期build立和使用诸如STARTTLS之类的命令之间存在根本的区别。 有时,“TLS”与“SSL”相反,意思是“使用STARTTLS模式”,但这是不正确的。

预先的TLS / SSL

在这种情况下,客户端首先启动TLS / SSL连接,因此首先发生SSL / TLS握手。 一旦安全套接字启动,使用它的应用程序就可以开始发送TLS以上协议的各种命令(例如HTTP,在这种模式下的LDAP,SMTP)。

在这种模式下,SSL / TLS版本必须运行在与普通对应端口不同的端口上,例如:端口443上的HTTPS,端口636上的LDAPS,端口993上的IMAPS,而不是80,389,143。

实现这些应用协议的层几乎不需要知道他们正在TLS / SSL上运行。 有时候,他们只是简单地使用sslwrap等工具。

TLS在STARTTLS之后(或同等)

TLS规范允许随时进行握手,包括通过相同的TCP连接在普通的TCP中交换了一些数据之后。

某些协议(包括LDAP)包含一条命令,告诉应用程序协议将会进行升级。 从本质上说,LDAP通信的第一部分以纯文本forms发送,然后发送STARTTLS消息(仍为纯文本),这表示当前的TCP连接将被重用,但下一个命令将被封装在TLS / SSL层。 在这个阶段,发生TLS / SSL握手,并将通信“升级”为TLS / SSL。 只有在通过TLS / SSL保护通信之后,客户端和服务器才知道它们必须从TLS层(通常在TCP层和应用层之间添加TLS库)打包/解包其命令。

每个协议中STARTTLS如何实现的细节取决于协议(因为这在某种程度上必须与使用协议兼容)。

即使HTTP有一个使用这种机制的变体,尽pipe它几乎从不支持: RFC 2817在HTTP / 1.1中升级到TLS 。 这与HTTPS工作的方式( RFC 2818 )完全不同,后者首先启动TLS / SSL。

STARTTLS方法的优点是可以在同一个端口上运行安全和普通的变体,缺点是后果,特别是潜在的降级攻击或configuration中可能出现的错误。

编辑 :我已经删除了一个不正确的句子,正如@GregS指出的,谢谢。)

编辑 :我也已经把更多的SSL与TLS在这个答案在ServerFault 。)

“STARTTLS命令”是在TLS规范之外定义的。 这是一个客户端发送到一个以前未encryption连接的服务器,说:“好吧,让我们开始一个TLS谈判现在”。

并不是所有的协议都执行这样的命令 SMTP,但HTTP和LDAP(据我所知)不。

当不存在显式的开始TLS的命令时,通常的select是指定一个特定的端口:对于HTTP(s)为443,对于LDAP(s)为636。 在这种情况下,一旦TCP连接build立,TLS协商就开始。

一个很好的解决问题的工具是openssl中的“s_client”工具。 例如:

 openssl s_client -connect ldap.mycompany.com:636 

将连接并转储出服务器的证书。 把它看作是像TNET连接的“Telnet”。 (当然,LDAP不是基于文本的协议,所以一旦TLS连接build立,你就不能从键盘上做任何有用的事情。)

LDAP使用扩展操作来启动TLS层的安装。 请参阅RFC中的第4.14节。