在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节。