文档首页
MySQL Connector/J 开发人员指南
相关文档 下载本手册
PDF (US Ltr) - 1.2Mb
PDF (A4) - 1.2Mb


6.12.2 使用 Kerberos 连接

Kerberos 是一种基于票证的服务器-客户端相互身份验证协议,受 MySQL 服务器 (仅限商业版) 支持。

Connector/J 使用 GSS-API、JAAS API 和 JCA API 实现对 Kerberos 的支持;这些 API 的提供程序必须在运行使用 Kerberos 身份验证的应用程序的 Java 虚拟机上可用。使用非默认提供程序会导致意外结果。

Kerberos 身份验证工作流程

Kerberos 身份验证在 MySQL 中的主要用途是允许用户创建连接,而无需在连接字符串中指定用户名和密码。为此,Connector/J 必须使用连接属性设置 defaultAuthenticationPlugin=authentication_kerberos_client 进行配置,然后可以从与本地缓存的票证授予票证 (TGT) 关联的 Kerberos 主体中提取 MySQL 用户名。请注意,MySQL 用户名与 Kerberos 主体不同,不包含 realm 部分;因此,Connector/J 会将主体中 @ 符号后的所有字符剪切掉,并将其用作 MySQL 用户名。

如果本地 Kerberos 缓存中没有可用的 TGT,Connector/J 会使用 OS 登录用户名作为 MySQL 用户名。在连接字符串中指定的用户名始终优先于通过任何其他方式获取的 MySQL 用户名。

然后,MySQL 用户名将发送到 MySQL 服务器进行验证。不存在的用户会导致服务器返回错误。现有用户可以继续进行身份验证过程,后续的身份验证机制取决于 MySQL 用户的创建方式。

  • 对于使用身份验证插件 authentication_kerberos 创建的用户,MySQL 服务器会将相应的 Kerberos realm 发送回 Connector/J,Connector/J 会使用该 realm 来构建标识 Kerberos 服务器上用户的 Kerberos 主体。然后可能会发生以下三种情况之一:

    • 新构建的 Kerberos 主体与与本地缓存的 TGT 关联的 Kerberos 主体匹配;然后将此 TGT 发送到 Kerberos 服务器以获取所需的 MySQL 服务票证,并继续身份验证。

    • 新构建的 Kerberos 主体与与本地缓存的 TGT 关联的 Kerberos 主体不匹配,或者没有本地 Kerberos 缓存;此 Kerberos 主体以及可能在连接字符串中指定的密码(如果未指定,则为空字符串)将发送到 Kerberos 服务器,以首先获取有效的 TGT,然后获取所需的 MySQL 服务票证;然后继续身份验证。

    • 如果 Connector/J 无法获取正确的 Kerberos 配置,无法与 Kerberos 服务器通信,或者无法执行上述两个步骤中的任何一个,则会抛出错误。

  • 对于使用不同于 authentication_kerberos 的插件定义的用户,服务器会要求 Connector/J 使用其他身份验证方法。

客户端 Kerberos 配置

为了与 Kerberos 服务器正常运行,Connector/J 需要系统范围的 Kerberos 配置,或者需要以下 JVM 本地系统属性设置:

  • -Djava.security.krb5.kdc=[KDC 主机名]

  • -Djava.security.krb5.realm=[默认 Kerberos realm]

调试信息

将 Connector/J 配置为使用 Kerberos 身份验证的过程并不总是直截了当。启用内部 Java 提供程序中的日志记录可以帮助查找潜在问题。可以通过设置以下系统属性来实现:

  • -Dsun.security.krb5.debug=true

  • -Dsun.security.jgss.debug=true