使用 Kerberos 集成身份验证连接到 SQL Server

从 Microsoft JDBC Driver 4.0 for SQL Server 开始，应用程序可使用 authenticationScheme 连接属性指示它希望连接到使用类型 4 Kerberos 集成身份验证的数据库。有关连接属性的详细信息，请参阅设置连接属性。有关 Kerberos 的详细信息，请参阅 Windows Kerberos 技术补充和 Microsoft Kerberos。

对 Java Krb5LoginModule 使用集成身份验证时，可使用 类 Krb5LoginModule 配置该模块。

Microsoft JDBC Driver for SQL Server 针对 IBM Java VM 设置了以下属性：

- useDefaultCcache = true

- moduleBanner = false

Microsoft JDBC Driver for SQL Server 针对所有其他 Java VM 设置了以下属性：

- useTicketCache = true

- doNotPrompt = true

# 备注

在 Microsoft JDBC Driver 4.0 for SQL Server 之前，应用程序可通过使用 integratedSecurity 连接属性并引用 sqljdbc_auth.dll 来指定集成身份验证（使用 Kerberos 或 NTLM，具体取决于所提供的对象），如创建连接 URL 中所述。

从 Microsoft JDBC Driver 4.0 for SQL Server 开始，应用程序可使用 authenticationScheme 连接属性指示它希望通过纯 Java Kerberos 实现连接到使用 Kerberos 集成身份验证的数据库：

- 如果要选择使用 Krb5LoginModule 的集成身份验证，仍然必须指定 integratedSecurity=true 连接属性。然后，还要指定 authenticationScheme=JavaKerberos 连接属性。

- 若要继续通过 sqljdbc_auth.dll 使用集成身份验证，仅需指定 integratedSecurity=true 连接属性（而且还可以指定 authenticationScheme=NativeAuthentication）。

- 如果指定 authenticationScheme=JavaKerberos 但未同时指定 integratedSecurity=true，则驱动程序将忽略 authenticationScheme 连接属性，并希望在连接字符串中找到用户名和密码凭据。

使用数据源创建连接时，可使用 setAuthenticationScheme 以编程方式设置身份验证架构。

新增了一个记录程序以支持 Kerberos 身份验证：com.microsoft.sqlserver.jdbc.internals.KerbAuthentication。有关详细信息，请参阅跟踪驱动程序操作。

以下准则将有助于您配置 Kerberos：

1. 在 Windows 注册表中，将 AllowTgtSessionKey 设置为 1。有关详细信息，请参阅 Windows Server 2003 中的 Kerberos 协议注册表项和 KDC 配置项。

2. 请确保 Kerberos 配置（UNIX 环境中的 krb5.conf）指向您的环境中正确的领域和 KDC。

3. 通过使用 kinit 或登录到域来初始化 TGT 缓存。

4. 当在 Windows Vista 或 Windows 7 操作系统上运行使用 authenticationScheme=JavaKerberos 的应用程序时，您应使用标准用户帐户。但如果以管理员帐户运行应用程序，则必须使用管理员特权运行该应用程序。

# 服务主体名称

服务主体名称 (SPN) 是客户端用来唯一标识服务实例的名称。有关服务主体名称 (SPN) 的详细信息，请参阅：

- 如何在 SQL Server 中使用 Kerberos 身份验证

- 对 SQL Server 使用 Kerberos

# 创建登录模块配置文件

您也可选择指定 Kerberos 配置文件。如果未指定配置文件，则以下设置有效：

Sun JVM

  com.sun.security.auth.module.Krb5LoginModule required useTicketCache=true doNotPrompt=true;

IBM JVM

  com.ibm.security.auth.module.Krb5LoginModule required useDefaultCcache = true moduleBanner = false;

如果您决定创建登录模块配置文件，则该文件必须遵循以下格式：

    <name> {
        <LoginModule> <flag> <LoginModule options>;
        <optional_additional_LoginModules, flags_and_options>;
    };

登录配置文件包含一个或多个条目，每个条目分别指定应用于某个特定应用程序或多个应用程序的基础身份验证技术。例如，

    SQLJDBCDriver {
       com.sun.security.auth.module.Krb5LoginModule required useTicketCache=true doNotPrompt=true;
    };

因此，每个登录模块配置文件条目均包含一个名称，该名称后跟一个或多个特定于 LoginModule 的条目，其中每个特定于 LoginModule 的条目以分号结尾，并且整个特定于 LoginModule 的条目组都包含在大括号中。每个配置文件条目均以分号结尾。

除了允许驱动程序使用登录配置模块文件中指定的设置获取 Kerberos 凭据之外，驱动程序还可使用现有凭据。这在您的应用程序需要使用多个用户的凭据创建连接时非常有用。

在尝试使用指定登录模块登录之前，如果现有凭据可用，则驱动程序将尝试使用它们。因此，使用 Subject.doAs 方法在特定上下文下执行代码时，将使用传递给 Subject.doAs 调用的凭据创建连接。

有关详细信息，请参阅 JAAS 登录配置文件和类 Krb5LoginModule。

# 创建 Kerberos 配置文件

有关 Kerberos 配置文件的详细信息，请参阅 Kerberos 要求。

下面是一个示例域配置文件，其中 YYYY 和 ZZZZ 是您网站的域名称。

    [libdefaults]
    default_realm = YYYY.CORP.CONTOSO.COM
    dns_lookup_realm = false
    dns_lookup_kdc = true
    ticket_lifetime = 24h
    forwardable = yes

    [domain_realm]
    .yyyy.corp.contoso.com = YYYY.CORP.CONTOSO.COM
    .zzzz.corp.contoso.com = ZZZZ.CORP.CONTOSO.COM

    [realms]
            YYYY.CORP.CONTOSO.COM = {
      kdc = krbtgt/YYYY.CORP. CONTOSO.COM @ YYYY.CORP. CONTOSO.COM
      default_domain = YYYY.CORP. CONTOSO.COM
    }

            ZZZZ.CORP. CONTOSO.COM = {
      kdc = krbtgt/ZZZZ.CORP. CONTOSO.COM @ ZZZZ.CORP. CONTOSO.COM
      default_domain = ZZZZ.CORP. CONTOSO.COM
    }

# 启用域配置文件和登录模块配置文件

您可以使用 -Djava.security.krb5.conf 启用域配置文件。您可以使用 -Djava.security.auth.login.config 启用登录模块配置文件。

例如，启动应用程序时，您可使用以下命令行：

    Java.exe -Djava.security.auth.login.config=SQLJDBCDriver.conf -Djava.security.krb5.conf=krb5.ini <APPLICATION_NAME>

# 验证可通过 Kerberos 访问 SQL Server

在 SQL Server Management Studio 中运行以下查询：

select auth_scheme from sys.dm_exec_connections where session_id=@@spid

请确保您具有运行此查询的必要权限。

# 请参阅

通过 JDBC 驱动程序连接到 SQL Server
发送有关本主题的反馈至 Microsoft。

© 2012 Microsoft。保留所有权利。