安全与安全身份验证:SSL与SASL

时间:2012-07-05 15:13:25

标签: encryption ssl md5 kerberos sasl

我的理解是SSL将加密算法(如AES,DES等)与密钥交换方法(如Diffier-Hellman)相结合,在不安全的网络上的两个端点之间提供安全的加密和识别服务(如互联网)。

我的理解是SASL是一种MD5 / Kerberos协议,几乎可以做同样的事情。

所以我的问题是:选择两者的优缺点是什么,哪种情况更优选?基本上,我正在寻找一些选择SSL时要遵循的指导方针或改为使用SASL。提前谢谢!

3 个答案:

答案 0 :(得分:77)

比较SSL / TLS和SASL非常困难,因为SSL / TLS是一种通信协议,而SASL是一个与其他协议集成的框架。 (事实上​​,在某些情况下,您可以同时使用两者。)

此外,您还提到了Kerberos,它确实是一种身份验证协议(可以与SSL / TLS或SASL一起使用,也可以单独使用)。您的问题似乎表明,是否使用Kerberos是您应首先选择的主要子问题之一。

SASL本质上是一个间接层,允许现有应用程序协议(例如LDAP,SMTP,Subversion,...)中的可插入身份验证系统和数据安全,尽管这些协议需要知道此扩展(例如{{3 }})。它是否以及如何提供安全身份验证和数据加密在很大程度上取决于此框架中使用的SMTP auth。以下是underlying mechanism中的示例:“内置CRAM-MD5机制不支持加密,但DIGEST-MD5支持”。 如果要将Kerberos与SASL一起使用,则需要另一级别的间接:svnserve documentation(最常用于Kerberos,但也可以允许其他机制)。 (请注意,SASL上下文中的GSSAPI似乎无论如何都意味着Kerberos,与GSS-API不同。)

SSL / TLS的一般目标是保护客户端和服务器之间的通信(完整性和机密性)。客户端应始终检查SSL / TLS服务器的身份,并为服务器提供检查客户端身份的机制。它能做什么还取决于它的配置方式。 SSL / TLS最常用于X.509证书:这是浏览器如何检查HTTPS服务器的身份。服务器还可以配置为请求客户端使用证书来标识自己(客户端证书身份验证)。 但是,如果要使用Kerberos,则可以使用TLS GS2 successor。这种情况不常见,但它们是Kerberos cipher suites

它的实现通常提供类似于普通TCP连接的API:在Java中,一旦配置,您可以或多或少地使用SSLSocket,就像使用普通Socket一样。尽管某些协议具有从普通连接(implemented in the JSSE)切换到SSL / TLS的显式命令,但这不需要协议在套接字上的特定意识。它还可以提供身份验证。在Java中,Implicit v.s. Explicit SSL/TLS是默认的SSL / TLS实现,如果您足够勇敢,则可以访问SSLSocket(或SSLEngine

你可能想要阅读“JSSE”,这类似于“SASL vs. SSL / TLS”(虽然它似乎没有更新一段时间,因为JSSE 确实现在支持Kerberos密码套件,至少从Oracle Java 6开始。

我承认我对SASL的了解少于SSL / TLS,但通过SASL进行数据加密听起来更像是工作。它似乎没有某些SSL / TLS功能,例如When to use Java GSS-API vs. JSSE。有Perfect Forward Secrecy offered by EDH cipher suites:您需要明确地打包/解包数据,使用SSLSocket时不需要这样做。

我认为您应该主要考虑首先要使用哪种身份验证机制:Kerberos,X.509证书或其他。这将对您的整体架构产生更大的影响,并且两者都可以与SASL和SSL / TLS一起使用(如果您使用具有EXTERNAL机制的SASL,则在SSL / TLS连接之上时更是如此)。

  • Kerberos非常集中。除了能够联系您的应用程序服务器之外,客户端还需要能够联系KDC进行身份验证。客户端还需要配置为使用该KDC。从用户的角度来看,他们可以使用密码。
  • X.509更加分散。但是,您可能需要为您的用户证书部署证书颁发机构(或使用商业证书颁发机构)。用户需要获得证书和私钥,有些人可能会觉得太复杂了。

JAAS进入它,因为它是处理身份验证和授权的通用Java框架。它与安全管理人员的概念密切相关。它为您提供了example that uses SASL with GSSAPI (Kerberos here) in the JGSS tutorial的概念。这与协议或通信没有直接关联,而是与应用程序中的身份验证和授权建模方式有关。 (它为您提供了一组标准的类。)

(我通常建议通过Subject and Principal提及你所说的话:JGSS,SASL,......,虽然它们不一定容易阅读。)

答案 1 :(得分:23)

SSL与SASL

SASL确实不是协议而是抽象层。 SSL和SASL也提供类似的功能,这也是事实。它们都提供身份验证,数据签名和加密。

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

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

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

SSL和SASL之间的一个明显区别是,SASL允许您选择不同的机制来验证客户端,而SSL是一种绑定,可以根据证书进行身份验证。在SASL中,您可以选择使用GSSAPI,Kerberos,NTLM等。

由于这种差异,在某些情况下,使用SASL而不是SSL更直观。例如,您的客户端应用程序正在使用Kerberos对最终用户进行身份验证。您的服务器需要对客户端进行身份验证。由于您的客户端应用程序已具有Kerberos凭据(使用Kerberos术语,故障单),因此使用Kerberos凭据对服务器进行身份验证是有意义的。当然,您始终可以设置SSL来执行相同的操作。但是,这意味着在现有Kerberos基础结构之上,您需要设置证书颁发机构infrasture,并以某种方式将客户端证书与Kerberos凭据相关联。这是可行的,但很多工作。

此外,有时,您需要使用仅在SASL机制中可用但在SSL中不可用的某些功能。例如,Kerberos允许您将票证从客户端转发到服务器,以便服务器可以使用票证代表客户端查询某些资源。一个常见的例子是您有一个应用程序服务器和一个数据库。客户端应用程序使用应用程序服务器进行身份验证,应用程序服务器需要使用客户端凭据代表客户端查询数据库。 SSL无法为您提供此功能,但Kerberos支持此功能。因此,在这种情况下,您必须选择使用SASL。

在某些情况下,您确实希望使用SSL而不是SASL。例如,扩展协议不是一种选择,或者您希望加密使用协议下交换的每个数据包。

GSSAPI如何与Kerberos和SASL相关

根据这个wiki page,在SASL中支持GSSAPI和Kerberos mechansim。 GSSAPI是一个通用的编程接口。我们的想法是让应用程序编写者使用一个通用的API进行身份验证,加密等,而不管下面使用什么协议。 GSSAPI实现了Kerberos。因此,您可以使用GSSAPI进行Kerberos身份验证。

JAAS如何与SASL相关

老实说,我不是Java专家。从我读到的,听起来像JAAS只是一个可插入的身份验证框架。我相信这个想法类似于GSSAPI。无论使用何种身份验证方法,都要提供单个编程接口。虽然GSSAPI专注于身份验证和安全消息交换,但JAAS专注于身份验证和授权。我没有发现任何证据表明JAAS也是SASL机制之一。我相信Java库中应该有一些辅助类可以帮助您实现自定义SASL机制。在实现自定义SASL机制时,仅使用JAAS可能是有意义的。

答案 2 :(得分:2)

SASL不是协议,而是某些auth机制的抽象层。如果您使用Digest-MD5或GSS-API作为SASL机制,则可以请求SASL完全加密您的数据流量。这是我与您的Active Directory服务器交谈的例子。您不需要SSL。你的用例是什么?请详细说明!