使用 CommonCryptoLib (sapcrypto.dll) 将适用于 SSO 的 Kerberos 单一登录用于 SAP BW

本文介绍如何使用 CommonCryptoLib(sapcrypto.dll)将 SAP BW 数据源配置为从Power BI 服务启用单一登录(SSO)。

注意

在尝试刷新使用 Kerberos SSO 的基于 SAP BW 的报表之前,请完成本文中的步骤和配置基于 Kerberos 的 SSO 中的步骤。 使用 CommonCryptoLib 作为安全网络通信(SNC)库,可以与 SAP BW 应用程序服务器和 SAP BW 消息服务器建立 SSO 连接。

注意

不支持同一网关服务器上配置两个库(sapcrypto 和 gx64krb5)。 不建议在同一网关服务器上配置两个库,因为这样做会导致库混用。 如果要同时使用这两个库,请完全分离网关服务器。 例如,为服务器 A 配置 gx64krb5,并为服务器 B 配置 sapcrypto。请记住,不支持使用 gx64krb5 的服务器 A 上的任何故障,因为 SAP 和 Microsoft 不再支持 gx64krb5。

使用 CommonCryptoLib 配置 SAP BW 以启用 SSO

注意

本地数据网关是 64 位软件,因此需要 64 位版本的 CommonCryptoLib (sapcrypto.dll) 来执行 BW SSO。 如果计划在尝试通过网关(推荐)进行 SSO 连接之前,先在 SAP GUI 中测试到 SAP BW 服务器的 SSO 连接,那么还将需要 32 位版本的 CommonCryptoLib,因为 SAP GUI 是 32 位软件。

  1. 确保已使用 CommonCryptoLib 为 BW 服务器正确配置 Kerberos SSO。 如果是,则能够使用 SSO 通过已配置为使用 CommonCryptoLib 的 SAP GUI 之类的 SAP 工具访问 BW 服务器(直接访问或通过 SAP BW 消息服务器访问)。

    有关设置步骤的详细信息,请参阅 SAP 单一登录:使用 Kerberos/SPNEGO 进行身份验证。 BW 服务器应使用 CommonCryptoLib 作为其 SNC 库,并具有开头是 CN= 的 SNC 名称,例如 CN=BW1。 有关 SNC 名称要求的详细信息(具体而言,snc/identity/as 参数),请参阅适用于 Kerberos 配置的 SNC 参数

  2. 如果未配置,请在安装了网关的计算机上安装 x64 版本的 SAP .NET 连接器

    可以通过在网关计算机的 Power BI Desktop 中尝试连接到 BW 服务器来检查组件是否已安装。 如果无法使用 2.0 实现进行连接,则未安装 .NET 连接器或尚未安装到全局程序集缓存。

  3. 确保 SAP 安全登录客户端 (SLC) 未在安装了网关的计算机上运行。

    SLC 缓存 Kerberos 票证的方式可能会影响网关使用 Kerberos 进行 SSO 的能力。

  4. 如果安装了 SLC,请将其卸载,或者确保退出了 SAP 安全登录客户端。 在尝试使用网关进行 SSO 连接之前,请先右键单击系统托盘中的图标,并选择“注销”和“退出”

    不支持在 Windows Server 计算机上使用 SLC。 有关详细信息,请参阅 SAP 备注 2780475(需要 s 用户)。

    SAP 安全登录客户端

  5. 如果卸载 SLC 或选择“注销”和“退出”,请打开 cmd 窗口,输入 klist purge 以清除任何缓存的 Kerberos 票证,然后再尝试通过网关进行 SSO 连接

  6. 从 SAP 快速启动板上下载 64 位 CommonCryptoLib (sapcrypto.dll) 版本 8.5.25 或更高版本,并将其复制到网关计算机上的文件夹中。 在用于复制 sapcrypto.dll 的同一目录中,创建一个名为 sapcrypto.ini 的文件,该文件包含以下内容:

    ccl/snc/enable_kerberos_in_client_role = 1
    

    .ini 文件包含 CommonCryptoLib 在网关方案中启用 SSO 所需的配置信息。

    注意

    这些文件必须存储在同一位置;换句话说,/path/to/sapcrypto/ 应同时包含 sapcrypto.ini 和 sapcrypto.dll

    网关服务用户和服务用户模拟的 Active Directory (AD) 用户均需要这两个文件的读取和执行权限。 建议向经过身份验证的用户组同时授予对 .ini 和 .dll 文件的权限。 出于测试目的,还可以向网关服务用户和用于测试的 AD 用户显式授予这些权限。 在以下屏幕截图中,我们已向经过身份验证的用户组授予对 sapcrypto.dll 的“读取和执行”权限:

    经过身份验证的用户

  7. 如果还没有与要通过 SSO 连接的网关关联的 SAP BW 数据源,请在Power BI 服务的“管理连接和网关”页上添加一个。 如果已有这样一个数据源,请对其进行编辑:

    • 如果要创建到 BW 应用程序服务器的 SSO 连接,请选择“SAP Business Warehouse”作为“数据源类型”
    • 如果要创建到 BW 消息服务器的 SSO 连接,请选择“SAP Business Warehouse 消息服务器”
  8. 对于“SNC 库”,选择“SNC_LIB”或“SNC_LIB_64”环境变量或“自定义”。

    • 如果选择“SNC_LIB”,则必须将网关计算机上的 SNC_LIB_64 环境变量的值设置为网关计算机上 sapcrypto.dll 64 位副本的绝对路径。 例如,C:\Users\Test\Desktop\sapcrypto.dll

    • 如果选择“自定义”,请将 sapcrypto.dll 的绝对路径粘贴到“管理网关”页上显示的“自定义 SNC 库路径”字段中。

  9. 对于“SNC 合作伙伴名称”键入 BW 服务器的 SNC 名称。 在“高级设置”下,确保已选中“通过 Kerberos 对 DirectQuery 查询使用 SSO”。 填写其他字段,操作与从 PBI Desktop 建立 Windows 身份验证连接一样。

  10. 创建一个 CCL_PROFILE 系统环境变量,并将其值设置为 sapcrypto.ini 的路径。

    CCL_PROFILE 系统环境变量

    sapcrypto .dll 和 .ini 文件必须位于同一位置。 在上面的示例中,sapcrypto.ini 和 sapcrypto.dll 都位于桌面上。

  11. 重新启动网关服务。

    重启网关服务

  12. 运行 Power BI 报表

故障排除

如果无法在 Power BI 服务中刷新报表,可以使用网关跟踪、CPIC 跟踪和 CommonCryptoLib 跟踪来诊断问题。 因为 CPIC 跟踪和 CommonCryptoLib 是 SAP 产品,所以 Microsoft 无法为其提供支持。

网关日志

  1. 重现此问题。

  2. 打开网关应用,并从“诊断”选项卡中选择“导出日志”

    导出网关日志

CPIC 跟踪

  1. 若要启用 CPIC 跟踪,请设置两个环境变量:CPIC_TRACE 和 CPIC_TRACE_DIR。

    第一个变量设置跟踪级别,第二个变量设置跟踪文件目录。 该目录必须是经过身份验证的用户组的成员可以写入的位置。

  2. 将 CPIC_TRACE 设置为 3,将 CPIC_TRACE_DIR 设置为要将跟踪文件写入其中的任何目录。 例如:

    CPIC 跟踪

  3. 重现问题,确保 CPIC_TRACE_DIR 包含跟踪文件。

    CPIC 跟踪可以诊断更高级别的问题,例如无法加载 sapcrypto.dll 库。 例如,下面是 CPIC 跟踪文件中出现.dll加载错误的代码片段:

    [Thr 7228] *** ERROR => DlLoadLib()==DLENOACCESS - LoadLibrary("C:\Users\test\Desktop\sapcrypto.dll")
    Error 5 = "Access is denied." [dlnt.c       255]
    

    如果遇到此类失败,但已按照上面部分所述为 sapcrypto.dll 和 sapcrypto.ini 设置了读取和执行权限,则尝试为包含这些文件的文件夹设置相同的读取和执行权限。

    如果仍然无法加载 .dll,请尝试打开文件审计。 检查 Windows 事件查看器中生成的审计日志可能会帮助你确定文件无法加载的原因。 查找模拟 AD 用户启动的失败条目。 例如,对于被模拟用户 MYDOMAIN\mytestuser,审计日志失败将类似于以下内容:

    A handle to an object was requested.
    
    Subject:
        Security ID:        MYDOMAIN\mytestuser
        Account Name:       mytestuser
        Account Domain:     MYDOMAIN
        Logon ID:           0xCF23A8
    
    Object:
        Object Server:      Security
        Object Type:        File
        Object Name:        <path information>\sapcrypto.dll
        Handle ID:          0x0
        Resource Attributes:    -
    
    Process Information:
        Process ID:     0x2b4c
        Process Name:   C:\Program Files\On-premises data gateway\Microsoft.Mashup.Container.NetFX45.exe
    
    Access Request Information:
        Transaction ID:     {00000000-0000-0000-0000-000000000000}
        Accesses:           ReadAttributes
    
    Access Reasons:     ReadAttributes: Not granted
    
    Access Mask:        0x80
    Privileges Used for Access Check:   -
    Restricted SID Count:   0
    

CommonCryptoLib 跟踪

  1. 通过向之前创建的 sapcrypto.ini 文件添加以下行,启用 CommonCryptoLib 跟踪:

    ccl/trace/level=5
    ccl/trace/directory=<drive>:\logs\sectrace
    
  2. ccl/trace/directory 选项更改为经过身份验证的用户组的成员可以写入的位置。

  3. 或者,创建一个新的 .ini 文件来更改此行为。 在与sapcrypto.ini和sapcrypto.dll相同的目录中,创建包含以下内容的名为sectrace.ini的文件。 将 DIRECTORY 选项替换为计算机上经过身份验证的用户组的成员可以写入的位置:

    LEVEL = 5
    DIRECTORY = <drive>:\logs\sectrace
    
  4. 重现问题,并验证“目录”指向的位置是否包含跟踪文件

  5. 完成后,关闭 CPIC 和 CCL 跟踪。

    有关 CommonCryptoLib 跟踪的详细信息,请参阅 SAP 备注 2491573(需要 SAP 用户)。

模拟

本部分介绍模拟问题的疑难解答症状和解决步骤。

症状:查看 GatewayInfo[date].log 时,会发现类似于以下内容的条目:即将模拟用户 DOMAIN\User (IsAuthenticated: True, ImpersonationLevel: Impersonation)。 如果 ImpersonationLevel 的值不同于模拟,则模拟不会正确发生。

解决方法:按照授予网关计算机上的网关服务帐户本地策略权限一文中的步骤操作。 更改配置后重启网关服务。

验证:刷新或创建报告并收集 GatewayInfo[date].log。 打开最新的 GatewayInfo 日志文件,并再次检查“关于模拟用户 DOMAIN\User”的字符串(IsAuthenticated: True,ImpersonationLevel: Impersonation: Impersonation),以确保 ImpersonationLevel 的值与模拟匹配

委托

委派问题通常以一般性错误形式出现在 Power BI 服务中。 若要确定委派是否是问题所在,建议收集 Wireshark 跟踪并使用 Kerberos 作为筛选器。 有关 Kerberos 错误参考,请参阅 此博客文章。 本节其余部分介绍委派问题的疑难解答症状和解决步骤。

症状:在Power BI 服务中,可能会遇到类似于以下屏幕截图中的错误。 在 GatewayInfo[date].log你将看到 [DM.GatewayCore] 在 clientPipelineIdADO 查询执行尝试期间引入异常,并且导入 [0D_NW_CHANN] 与不导出匹配。

无帮助错误的屏幕截图

在 Mashup[date].log 中,会看到一般错误 GSS-API(maj):未提供凭据。

查看 CPIC 跟踪(sec-Microsoft.Mashup.trc*),你将看到类似于以下内容的内容:

[Thr 4896] *** ERROR => SncPEstablishContext() failed for target='p:CN=BW5' [sncxxall.c 3638]
[Thr 4896] *** ERROR => SncPEstablishContext()==SNCERR_GSSAPI [sncxxall.c 3604]
[Thr 4896] GSS-API(maj): No credentials were supplied
[Thr 4896] Unable to establish the security context
[Thr 4896] target="p:CN=BW5"
[Thr 4896] <<- SncProcessOutput()==SNCERR_GSSAPI
[Thr 4896]
[Thr 4896] LOCATION CPIC (TCP/IP) on local host HNCL2 with Unicode
[Thr 4896] ERROR GSS-API(maj): No credentials were supplied
[Thr 4896] Unable to establish the security context
[Thr 4896] target="p:CN=BW5"
[Thr 4896] TIME Thu Oct 15 20:49:31 2020
[Thr 4896] RELEASE 721
[Thr 4896] COMPONENT SNC (Secure Network Communication)
[Thr 4896] VERSION 6
[Thr 4896] RC -4
[Thr 4896] MODULE sncxxall.c
[Thr 4896] LINE 3604
[Thr 4896] DETAIL SncPEstablishContext
[Thr 4896] SYSTEM CALL gss_init_sec_context
[Thr 4896] COUNTER 3
[Thr 4896]
[Thr 4896] *** ERROR => STISEND:STISncOut failed 20 [r3cpic.c 9834]
[Thr 4896] STISearchConv: found conv without search

该错误在网关计算机 sec-Microsoft.Mashup.Con-[].trc 的 sectraces 中变得更加清晰:

[2020.10.15 20:31:38.396000][4][Microsoft.Mashup.Con][Kerberos ][ 3616] AcquireCredentialsHandleA called successfully.
[2020.10.15 20:31:38.396000][2][Microsoft.Mashup.Con][Kerberos ][ 3616] InitializeSecurityContextA returned -2146893053 (0x80090303). Preparation for kerberos failed!
[2020.10.15 20:31:38.396000][2][Microsoft.Mashup.Con][Kerberos ][ 3616] Getting kerberos ticket for 'SAP/BW5' failed (user name is affonso_v@HANABQ.COM)
[2020.10.15 20:31:38.396000][2][Microsoft.Mashup.Con][Kerberos ][ 3616] Error for requested algorithm 18: 0/C000018B The security database on the server does not have a computer account for this workstation trust relationship.
[2020.10.15 20:31:38.396000][2][Microsoft.Mashup.Con][Kerberos ][ 3616] Error for requested algorithm 17: 0/C000018B The security database on the server does not have a computer account for this workstation trust relationship.
[2020.10.15 20:31:38.396000][2][Microsoft.Mashup.Con][Kerberos ][ 3616] Error for requested algorithm 23: 0/C000018B The security database on the server does not have a computer account for this workstation trust relationship.
[2020.10.15 20:31:38.396000][2][Microsoft.Mashup.Con][Kerberos ][ 3616] Error for requested algorithm 3: 0/C000018B The security database on the server does not have a computer account for this workstation trust relationship.

如果查看 WireShark 跟踪,也可看到问题。

显示错误的跟踪程序的屏幕截图

注意

可以放心忽略其他错误 KRB5KDC_ERR_PREAUTH_REQUIRED。

解决方法:必须将 SPN SAP/BW5 添加到服务帐户。 有关详细信息和步骤,请参阅 SAP 文档

可能会遇到 WireShark 跟踪中出现类似但并非完全相同的错误,如以下错误 KRB5KDC_ERR_BADOPTION

显示不同错误的 WireShark 程序的屏幕截图

此错误表示可以找到 SPN SAP/BW5,但它不在网关服务帐户的“委派”选项卡中显示委派凭据的服务下。 要解决此问题,请按照以下步骤配置标准 kerberos 约束委派的网关服务帐户

验证:正确的配置将阻止网关呈现泛型或意外错误。 如果仍出现错误,请检查网关本身的配置或 BW 服务器的配置。

凭据错误

本部分介绍凭据错误问题的疑难解答症状和解决步骤。 你可能还会看到来自Power BI 服务的一般错误,如前面的委派部分所述。

根据你在数据源 (SAP BW) 中看到的症状,可以使用不同的解决方法,下面我们将回顾这两种情况。

症状 1:在 BW 服务器的 sectraces sec-disp+work[].trc 文件中,可以看到类似于以下内容的跟踪:

[2020.05.26 14:21:28.668325][4][disp+work ][SAPCRYPTOLIB][435584] { gss_display_name [2020.05.26 14:21:28.668338][4][disp+work ][GSS ][435584] gss_display_name output buffer (41 bytes) [2020.05.26 14:21:28.668338][4][disp+work ][GSS ][435584] CN=DAVID@XS.CONTOSO.COM@CONTOSO.COM

解决方法:完成配置步骤,以便在网关计算机上设置用户映射配置参数(如有必要)。 即使已配置 Microsoft Entra Connect,也需要完成这些步骤。

验证:你将能够成功在 Power BI 服务中加载报表。 如果无法加载报告,请参阅症状 2 中的步骤。

症状 2:在 BW 服务器的 sectraces sec-disp+work[].trc 文件中,可以看到类似于以下内容的跟踪:

[2020.10.19 23:10:15.469000][4][disp+work.EXE ][SAPCRYPTOLIB][ 4460] { gss_display_name
[2020.10.19 23:10:15.469000][4][disp+work.EXE ][GSS ][ 4460] gss_display_name output buffer (23 bytes)
[2020.10.19 23:10:15.469000][4][disp+work.EXE ][GSS ][ 4460] CN=DAVID@CONTOSO.COM

解决方法:检查用户的 Kerberos 外部 ID 是否与 sectraces 显示的 ID 匹配。

  1. 打开 SAP 登录。
  2. 使用 SU01 事务。
  3. 编辑用户。
  4. 导航到 “SNC”选项卡,验证 SNC 名称是否与日志中显示的名称匹配。

验证:如果正确完成,你将能够创建并刷新报表 Power BI 服务。

有关本地数据网关和 DirectQuery 的详细信息,请参阅以下资源: