安全与认证:SSL vs SASL

77

我的理解是SSL将加密算法(如AES,DES等)和密钥交换方法(如Diffie-Hellman)结合起来,在不安全的网络(如互联网)上提供安全的加密和身份验证服务。

我的理解是SASL是一个MD5 / Kerberos协议,基本上也是做同样的事情。

那么我的问题是:选择两者之间的利弊是什么,哪些情况下更适合选择SSL或选择SASL?基本上,我正在寻找在选择SSL或选择SASL时遵循的一些指南。


8
身份验证层和安全传输层基本上是两个不同的东西,尽管两者都可以用于执行身份验证。但如果你提出这个问题,我想知道你是在寻找要解决的问题,还是正在尝试解决一个问题。 - Maarten Bodewes
5
我正在努力确定我的Java客户端和服务器在彼此通信时是否需要使用SSL或SASL来保护用户数据/请求/响应,因此我决定选择后者(尝试解决一个问题)。 - IAmYourFaja
3个回答

125
很难比较SSL/TLS和SASL,因为SSL/TLS是通信协议,而SASL是一个框架,与其他协议集成。(实际上,在某些情况下可以同时使用两者。)
此外,您提到了Kerberos,它确实是一种身份验证协议(可以与SSL/TLS或SASL一起使用或独立使用)。您的问题似乎暗示着是否使用Kerberos是您首先应该选择的主要子问题之一。
SASL本质上是一个间接层,允许在现有应用程序协议(如LDAP、SMTP、Subversion等)中使用可插拔的身份验证系统和数据安全性,尽管这些协议需要意识到此扩展(例如SMTP auth)。它是否以及如何提供安全身份验证和数据加密严重依赖于该框架内使用的底层机制。以下是svnserve文档中的一个示例:“内置的CRAM-MD5机制不支持加密,但DIGEST-MD5支持加密。” 如果您想在SASL中使用Kerberos,则需要另一层间接层:GSS-API(通常与Kerberos一起使用,但也可以允许其他机制)。请注意,在SASL上下文中,GSSAPI似乎已经隐含了Kerberos,不像其GS2后继者
SSL/TLS的一般目标是保护客户端和服务器之间的通信(完整性和机密性)。客户端应始终检查SSL/TLS服务器的身份,并提供机制让服务器也可以检查客户端的身份。它所能做的也取决于其配置方式。SSL/TLS最常与X.509证书一起使用:这就是浏览器如何检查HTTPS服务器身份的方法。服务器还可以配置请求客户端使用证书来标识自己(客户端证书认证)。 但是,如果您想要使用Kerberos,则可以使用TLSKerberos密码套件。这很少见,但它们已在JSSE中实现

SSL/TLS的实现通常提供类似于普通TCP连接的API:在Java中,一旦配置完成,你可以像使用普通Socket一样使用SSLSocket。这不需要协议在套接字之上具有特定的意识,尽管有些协议有明确的命令从普通连接切换到SSL/TLS(隐式SSL/TLS vs 显式SSL/TLS)。它还可以提供身份验证。在Java中,JSSE是默认的SSL/TLS实现,它让你访问SSLSocket(或者如果你足够勇敢,则是SSLEngine)。

您可能需要阅读 "何时使用Java GSS-API与JSSE",它类似于 "SASL vs. SSL/TLS"(尽管似乎已经有一段时间没有更新了,因为自Oracle Java 6以来,JSSE已经支持Kerberos密码套件)。
我承认我不太了解SASL,但通过SASL进行数据加密听起来将需要更多的工作。它似乎没有某些SSL/TLS功能,例如由EDH密码套件提供的完美前向保密性。在JGSS教程中有一个使用GSSAPI(这里是Kerberos)与SASL的示例:您需要显式地包装/解包数据,而在使用SSLSocket时则不需要这样做。
我认为你的主要关注点应该是首先决定使用哪种身份验证机制:Kerberos、X.509证书或其他。这将对你的整体架构产生更大的影响,并且两者都可以与SASL和SSL/TLS一起使用(如果你在SSL/TLS连接上使用SASL的EXTERNAL机制,则更加如此)。
  • Kerberos非常集中化。客户端除了能够联系你的应用程序服务器外,还需要能够联系KDC进行身份验证。客户端还需要配置以使用该KDC。从用户的角度来看,他们可以使用密码。
  • X.509更加分散化。但是,你可能需要部署一个认证机构(或使用商业认证机构)来为用户证书提供认证。用户需要获得证书和私钥,其中一些人可能会觉得过于复杂。

JAAS是处理身份验证和授权的通用Java框架,与安全管理器的概念密切相关。它提供了SubjectPrincipal的概念。这与协议或通信没有直接关联,而是与您在应用程序中建模身份验证和授权的方式有关。(它为您提供一组标准类来完成此操作。)

(我通常建议阅读涉及您需要的单词的Java参考文档,例如JGSS、SASL等,尽管它们可能不容易阅读。)


37

SSL vs SASL

虽然SASL不是一个协议而是一个抽象层,但它和SSL提供了类似的功能。两者都提供身份验证、数据签名和加密。

SSL在传输层完成,通常对底层协议透明。例如,您可以在LDAP或HTTP上使用SSL。但是,在某些情况下,需要修改现有协议以切换到安全模式。例如,POP3和IMAP被扩展为具有命令STARTTLS以启动SSL的使用。从这个角度来看,这与SASL所做的有点相似。

另一方面,许多协议也被扩展以提供SASL功能。 这里 是协议列表。同样,POP3和IMAP是其中的两个,并且它们使用不同的命令来启动身份验证。

那么,何时应该使用SSL,何时应该使用SASL呢?

SSL和SASL之间一个明显的区别是,SASL允许您选择不同的机制来验证客户端,而SSL则基于证书进行身份验证。在SASL中,您可以选择使用GSSAPI、Kerberos、NTLM等。
由于这种差异,有些情况下,使用SASL比SSL更直观。例如,您的客户端应用程序正在使用Kerberos对最终用户进行身份验证。您的服务器需要验证客户端。由于您的客户端应用程序已经拥有Kerberos凭据(在Kerberos术语中,是一个票据),因此使用Kerberos凭据进行与服务器的身份验证是有意义的。当然,您始终可以设置SSL来完成相同的工作。但是,这意味着在现有的Kerberos基础设施之上,您需要设置证书颁发机构基础设施,并以某种方式将客户端证书与Kerberos凭证相关联。这是可行的,但需要大量工作。
有时候,您需要使用仅在SASL机制而非SSL中提供的某些功能。例如,Kerberos允许您将票据从客户端转发到服务器,以便服务器可以代表客户端使用票据查询某些资源。一个常见的例子是,您有一个应用程序服务器和一个数据库。客户端应用程序通过应用程序服务器进行身份验证,应用程序服务器需要使用客户端凭证代表客户端查询数据库。SSL无法为您提供此功能,但Kerberos支持此功能。因此,在这种情况下,您必须选择使用SASL。
在某些情况下,您确实希望使用SSL,但不使用SASL。例如,扩展协议不是一种选择,或者您想加密使用底层协议交换的每个数据包。
GSSAPI与Kerberos和SASL有何关系?
根据维基页面,SASL支持GSSAPI和Kerberos机制。 GSSAPI是通用编程接口。其想法是让应用程序编写者使用一个单一的常用API来进行身份验证、加密等操作,而不管底层使用什么协议。GSSAPI实现了Kerberos。因此,您可以使用GSSAPI进行Kerberos身份验证。
JAAS与SASL有何关联?
老实说,我不是Java专家。从我所读到的内容来看,JAAS似乎只是可插入式身份验证框架。我相信这个想法与GSSAPI类似。它提供了一个单一的编程接口,无论使用什么身份验证方法都可以使用。虽然GSSAPI侧重于身份验证和保护消息交换,但JAAS侧重于身份验证和授权。我没有发现JAAS也是SASL机制之一的证据。我相信Java库中应该有一些辅助类来帮助您实现自定义SASL机制。在实现自定义SASL机制时,使用JAAS可能是有意义的。

4

SASL不是一个协议,而是一种对某些认证机制的抽象层。如果您使用Digest-MD5或GSS-API作为您的SASL机制,您可以请求SASL完全加密数据流量。例如,这就是我与您的Active Directory服务器通信时所做的。您不需要SSL。请问您的用例是什么?请详细说明!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接