Documentation Home

6.12.2 使用 Kerberos 连接

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

Connector/J(8.0.26 及更高版本)使用 GSS-API、JAAS API 和 JCA API 实现了对 Kerberos 的支持;这些 API 中的每一个的提供程序都必须在运行使用 Kerberos 身份验证的应用程序的 Java 虚拟机上可用。使用非默认提供程序可能会导致意外结果。

Kerberos 身份验证工作流程

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

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

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

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

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

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

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

  • 对于使用不同于 的插件定义的用户 authentication_kerberos,服务器请求 Connector/J 使用另一种身份验证方法。

客户端 Kerberos 配置

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

  • -Djava.security.krb5.kdc=[the KDC host name]

  • -Djava.security.krb5.realm=[the default Kerberos realm]

调试信息

配置 Connector/J 以使用 Kerberos 身份验证的过程并不总是那么简单。在内部 Java 提供程序中启用日志记录有助于发现潜在问题。这可以通过设置这些系统属性来完成:

  • -Dsun.security.krb5.debug=true

  • -Dsun.security.jgss.debug=true