Introduce
简单身份验证和安全层(Simple Authentication and Security Layer,简称SASL)是一种Internet标准(RFC 2222),它指定了用于身份验证和可选地在客户机和服务器应用程序之间建立安全层的协议。SASL定义了如何交换身份验证数据,但本身并不指定该数据的内容。它是一个框架,指定身份验证数据的内容和语义的特定身份验证机制可以融入其中。
SASL被协议(如轻量级目录访问协议版本3 (LDAP v3)和Internet消息访问协议版本4 (IMAP v4))用于启用可插拔身份验证。LDAP v3和IMAP v4没有将身份验证方法硬连接到协议中,而是使用SASL执行身份验证,从而通过各种SASL机制启用身份验证。
Internet社区为不同级别的安全性和部署场景定义了许多标准的SASL机制。这些级别的范围从无安全性(例如,匿名身份验证)到高安全性(例如,Kerberos身份验证)以及介于两者之间的级别。
The Java SASL API
Java SASL API为使用SASL机制的应用程序定义了类和接口。它被定义为与机制无关的:使用API的应用程序不需要硬连接到使用任何特定的SASL机制。该API支持客户机和服务器应用程序。它允许应用程序根据所需的安全特性选择要使用的机制,比如它们是否容易受到被动字典攻击,或者它们是否接受匿名身份验证。
Java SASL API还允许开发人员使用他们自己的自定义SASL机制。通过使用Java加密体系结构(JCA)安装SASL机制。
When to Use SASL
SASL为网络应用程序提供了可插拔的身份验证和安全层。Java SE中还有其他特性提供类似的功能,包括Java安全套接字扩展(JSSE)和Java通用安全服务(Java GSS)。JSSE为SSL和TLS协议的Java语言版本提供了一个框架和实现。Java GSS是通用安全服务应用程序编程接口(GSS- api)的Java语言绑定。Java SE上这个API目前支持的唯一机制是Kerberos v5。
与JSSE和Java GSS相比,SASL是相对轻量级的,并且在最近的协议中很流行。它还有一个优点,就是定义了几种流行的轻量级(在基础设施支持方面)SASL机制。另一方面,主要的JSSE和Java GSS机制具有相对重量级的机制,需要更详细的基础设施(分别是公钥基础设施和Kerberos)。
SASL、JSSE 和 Java GSS 通常一起使用。例如,一个常见的模式是应用程序使用 JSSE 建立安全通道,使用 SASL 进行客户端基于用户名/密码的身份验证。在 GSS-API 机制之上还有 SASL 机制;一个流行的示例是与 LDAP 一起使用的 SASL GSS-API/Kerberos v5 机制。
除了从头定义和构建协议之外,协议定义通常是决定使用哪个 API 的最大因素。例如,LDAP 和 IMAP 被定义为使用 SASL,因此与这些协议相关的软件应该使用 Java SASL API。在构建Kerberos 应用程序和服务时,使用的 API 是Java GSS。当构建使用 SSL/TLS 作为协议的应用程序和服务时,使用的 API 是JSSE。
SASL Architechture
SASL Architechture
SASL Life Cycle
SASL Session Initialization
SASL Authentication: Sending Client Data
SASL Authentication: Processing Server Data
Java SASL API Overview
SASL 是一种挑战-响应协议。服务器向客户机发出质疑,客户机根据质疑发送响应。这种交换一直持续到服务器满意并且不发出进一步的挑战为止。这些挑战和响应是任意长度的二进制标记。封装协议(例如 LDAP 或 IMAP)指定了这些令牌的编码和交换方式。例如,LDAP 指定 SASL 标记如何封装在 LDAP 绑定请求和响应中。
Java SASL API是根据这种交互和使用风格建模的。它具有分别表示客户端和服务器端机制的接口 SaslClient 和 SaslServer。应用程序通过表示挑战和响应的字节数组与机制交互。服务器端机制迭代、发出挑战并处理响应,直到它满意为止,而客户端机制迭代、评估挑战并发出响应,直到服务器满意为止。使用该机制的应用程序驱动每次迭代。也就是说,它从协议包中提取挑战或响应,并将其提供给该机制,然后将该机制返回的响应或响应放入协议包中,并将其发送给对等体。
How SASL Mechanisms are Installed and Selected
SASL 机制实现由 SASL 安全提供者提供。每个提供者可以支持一个或多个 SASL 机制,并在 JCA 注册。
默认情况下,SunSASL 提供程序自动注册为 JCA 提供程序。若要将其作为 JCA 提供程序移除或重新排列其优先级,请更改 Java 安全属性文件(Java-home/conf/security/Java.security)。
1 | SunSASL = |
若要添加或删除 SASL 提供程序,请在安全属性文件中添加或删除相应的行。
或者,可以使用 java.security.Security 以编程方式添加自己的提供程序。例如,下面的示例代码将 com.example.MyProvider 注册到可用的 SASL 安全提供程序列表中。
1 | Security.addProvider(new com.example.MyProvider()); |
The SunSASL Provider
SunSASL 提供程序支持以下客户机和服务器机制:
- Client Mechanisms
- PLAIN (RFC 2595). This mechanism supports cleartext user name/password authentication.
- CRAM-MD5 (RFC 2195). This mechanism supports a hashed user name/password authentication scheme.
- DIGEST-MD5 (RFC 2831). This mechanism defines how HTTP Digest Authentication can be used as a SASL mechanism.
- EXTERNAL (RFC 2222). This mechanism obtains authentication information from an external channel (such as TLS or IPsec).
- NTLM. This mechanism supports NTLM authentication.
- Server Mechanisms
- CRAM-MD5
- DIGEST-MD5
- NTLM
The JdkSASL Provider
JdkSASL 提供程序支持以下客户机和服务器机制:
- Client Mechanisms
- Server Mechanisms
- GSSAPI (Kerberos v5)
Debugging and Monitoring
SunSASL 和 JdkSASL 提供程序使用 Logging api 提供实现日志输出。这个输出可以通过使用日志配置文件和编程 API (java.util.logging)来控制。SunSASL 提供程序使用的日志记录器名称是 javax.security.sasl。下面是一个样例日志配置文件,它为 SunSASL 提供程序启用了 FINEST 日志级别:
1 | FINEST = |
Implementing a SASL Security Provider
实现 SASL 安全提供商有三个基本步骤:
- 编写一个实现 SaslClient 或 SaslServer 接口的类。
- 编写一个工厂类(实现 SaslClientFactory 或 SaslServerFactory) ,创建类的实例。
- 编写注册工厂的 JCA 提供程序。
References
https://docs.oracle.com/cd/E53394_01/html/E54753/sasl.intro.20.html
(完)