我正在重写我的问题,希望我能得到更好的回应。我在serverfault here上提出了类似的问题,并且认为一个正确有效的TLS服务器是一个需要“STARTTLS”命令的服务器。
是否可以在不需要额外端口的情况下将STARTTLS发布到正确配置的LDAP或HTTP TLS服务器?我知道从SMTP的角度来看这是事实,但不确定我可以将这些经验应用到其他协议的范围。
我花时间阅读(但没有完全掌握)
问:在设置TLS over LDAP或HTTP会话之前,线路上发生了什么?由于这是基于TCP的,我可以简单地telnet到该端口并发出一些命令来验证它是否正常工作(直到那一点)?
答案 0 :(得分:23)
SSL和TLS在使用方式上的差异非常小。但是,SSL / TLS的预先建立与使用STARTTLS
等命令之间存在根本区别。有时,“TLS”与“SSL”形成对比,表示“使用STARTTLS模式”,但这是不正确的。
在这种情况下,客户端在其他任何事情之前启动TLS / SSL连接,因此首先发生SSL / TLS握手。一旦安全套接字启动,使用它的应用程序就可以开始发送TLS上方协议的各种命令(例如HTTP,此模式下的LDAP,SMTP)。
在此模式下,SSL / TLS版本必须在与其普通对应端口不同的端口上运行,例如:端口443上的HTTPS,端口636上的LDAPS,端口993上的IMAPS,而不是80,389,143
实现这些应用程序协议的层几乎不需要知道它们是在TLS / SSL之上运行的。有时,它们只是通过 sslwrap 等工具进行隧道传输。
在STARTTLS(或等效)之后TLS规范允许在任何时间进行握手,包括在通过相同的TCP连接在普通TCP中交换一些数据之后。
某些协议(包括LDAP)包含一个命令,告诉应用程序协议将进行升级。本质上,LDAP通信的第一部分以纯文本形式发送,然后发送STARTTLS
消息(仍然是纯文本),这表示当前的TCP连接将被重用,但下一个命令将被包含在内TLS / SSL层。在此阶段,发生TLS / SSL握手,并且通信“升级”为TLS / SSL。只有在此之后,通过TLS / SSL保护通信,并且客户端和服务器都知道他们必须从TLS层包装/解包他们的命令(通常在TCP层和应用层之间添加TLS库)。 p>
每个协议中STARTTLS
如何实现的细节因协议而异(因为这必须与使用它的协议兼容)。
甚至HTTP都有使用此机制的变体,尽管它几乎从不受支持:RFC 2817 Upgrading to TLS Within HTTP/1.1。这与HTTPS工作方式(RFC 2818)完全不同,后者首先启动TLS / SSL。
STARTTLS
方法的优点是您可以在同一端口上运行安全和普通变体,缺点是其后果,特别是潜在的降级攻击或配置中可能出现的错误。
(编辑:我删除了一个错误的句子,正如@GregS指出的那样,谢谢。)
(编辑:我还在this answer on ServerFault中更多地介绍了SSL与TLS。)
答案 1 :(得分:3)
“STARTTLS命令”是在
并非所有协议都实现此类命令。 SMTP可以,但HTTP和LDAP(据我所知)不会。
当不存在开始TLS的显式命令时,通常的替代方案是指定特定端口:如443用于HTTP(s)和636用于LDAP(s)。在这种情况下,一旦建立TCP连接就开始TLS协商。
一个很好的故障排除工具,就是openssl中的“s_client”工具。例如:
openssl s_client -connect ldap.mycompany.com:636
将连接并转储服务器的证书。可以将其视为TLS连接的“Telnet”。 (当然,LDAP不是基于文本的协议,因此在建立TLS连接后,您无法通过键盘执行任何有用的操作。)
答案 2 :(得分:1)
LDAP使用扩展操作来启动TLS层的安装。另见RFC中的第4.14节。