Digest-MD5

  • Digest-MD5 认证*是 LDAP v3 服务器(RFC 2829)必需的认证机制。因为 SASL 的使用是 LDAP v3(RFC 2251)的一部分,所以仅支持 LDAP v2 的服务器不支持 Digest-MD5.

Digest-MD5 机制在RFC 2831中描述。它基于 HTTP 摘要认证(RFC 2251)。在 Digest-MD5 中,LDAP 服务器将包含其愿意支持的各种身份验证选项以及特殊令牌的数据发送到 LDAPClient 端。Client 端通过发送加密的响应来进行响应,该响应指示其已选择的身份验证选项。响应以证明 Client 端知道其密码的方式进行加密。然后,LDAP 服务器解密并验证 Client 端的响应。

要使用 Digest-MD5 身份验证机制,必须按如下所示设置身份验证环境属性。

  • Context.SECURITY_AUTHENTICATION.

    • 设置为字符串"DIGEST\-MD5"
  • Context.SECURITY_PRINCIPAL.

    • 设置为主体名称。这是服务器特定的格式。某些服务器支持登录用户 ID 格式,例如为 UNIX 或 Windows 登录屏幕定义的格式。其他人则接受专有名称。还有一些使用RFC 2829中定义的授权 ID 格式。在该 RFC 中,名称应为字符串"dn:",后跟要认证的实体的标准 DN,或字符串"u:",后跟用户 ID。一些服务器接受多种格式。其中一些格式的示例是"cuser""dn: cn=C\. User, ou=NewHires, o=JNDITutorial""u: cuser"。此属性的数据类型必须为java\.lang\.String
  • Context.SECURITY_CREDENTIALS.

    • 设置为主体的密码(例如"mysecret")。它的类型为java\.lang\.Stringchar数组(char\[\])或byte数组(byte\[\])。如果密码是java\.lang\.Stringchar\[\],则使用 UTF-8 对其进行编码以传输到服务器。如果密码是byte\[\],那么它将直接发送到服务器。

following example显示了 Client 端如何使用 Digest-MD5 对 LDAP 服务器执行身份验证。

// Set up the environment for creating the initial context
Hashtable<String, Object> env = new Hashtable<String, Object>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://localhost:389/o=JNDITutorial");

// Authenticate as C. User and password "mysecret"
env.put(Context.SECURITY_AUTHENTICATION, "DIGEST-MD5");
env.put(Context.SECURITY_PRINCIPAL, 
        "dn:cn=C. User, ou=NewHires, o=JNDITutorial");
env.put(Context.SECURITY_CREDENTIALS, "mysecret");

// Create the initial context
DirContext ctx = new InitialDirContext(env);

// ... do something useful with ctx

Note:

Oracle 目录服务器 v5.2支持具有明文密码的用户的 Digest-MD5 身份验证机制。创建用户之前,必须设置密码加密 Pattern。如果您已经创建了该用户,则将其删除并重新创建。要使用 管理 控制台设置密码加密 Pattern,请选择“配置”选项卡和“数据”节点。在“密码”窗格中,为“密码加密”选择“不加密(清除)”选项。服务器接受简单的用户名(即具有一个的条 Object"uid"属性的值)和用户名的“ dn:”格式。有关详细信息,请参阅服务器的文档。

指定领域

  • realm *定义从中选择身份验证实体(Context\.SECURITY_PRINCIPAL属性的值)的名称空间。一台服务器可能具有多个领域。例如,一所大学的服务器可能配置为具有两个领域,一个领域用于学生用户,另一个领域用于教师用户。领域配置由目录 管理 员完成。某些目录具有默认的单一领域。例如,Oracle Directory Server v5.2 使用计算机的标准主机名作为默认领域。

在 Digest-MD5 身份验证中,您必须对特定领域进行身份验证。您可以使用以下身份验证环境属性来指定领域。如果未指定领域,则将使用服务器提供的任何领域。

  • java\.naming\.security\.sasl\.realm

    • 设置为主体领域。这是特定于部署和/或特定于服务器的区分大小写的字符串。它标识应从中选择主体名称(Context\.SECURITY_PRINCIPAL)的领域或域。如果此领域与服务器提供的领域之一不匹配,则认证失败。

following example显示了如何设置环境属性以使用 Digest-MD5 和指定的领域执行身份验证。要使此示例在您的环境中工作,必须更改源代码,以便该领域值反映您在目录服务器上配置的内容。

// Authenticate as C. User and password "mysecret" in realm "JNDITutorial"
env.put(Context.SECURITY_AUTHENTICATION, "DIGEST-MD5");
env.put(Context.SECURITY_PRINCIPAL, 
        "dn:cn=C. User, ou=NewHires, o=JNDITutorial");
env.put(Context.SECURITY_CREDENTIALS, "mysecret");
env.put("java.naming.security.sasl.realm", "JNDITutorial");

如果您需要使用privacy protection和其他 SASL 属性,请在《 JNDI 教程》中进行讨论。