无法从 docker Linux 上的 javaKerberos Sql Server 连接找到默认领域

问题描述 投票:0回答:1

我正在尝试通过 javaKerberos 连接到 sql server 实例。我可以让它在 Windows(非 docker)和非 docker Linux 实例上工作,但我在 Linux docker 上不断收到“无法找到默认领域”错误。请注意,我正在运行 Amazon Linux docker 映像,因为最终我试图让它在 ECS 上运行,尽管目前我正在 Windows 的 Docker 桌面上测试它。

你们有什么建议可以尝试吗?我已经尝试了 krb5.conf 和各种 java 命令行标志的许多组合,但还没有任何效果。

下面是我一直在使用的所有相关的 kerberos 配置项。

在 docker 实例上运行 jar 的命令

java -jar app.jar  -Djava.security.krb5.conf=/opt/krb5.conf  -Djava.security.auth.login.config=/opt/jaas.conf -Djavax.security.auth.useSubjectCredsOnly=false

例外

Caused by: org.ietf.jgss.GSSException: Invalid name provided (Mechanism level: KrbException: Cannot locate default realm)
        at sun.security.jgss.krb5.Krb5NameElement.getInstance(Krb5NameElement.java:129) ~[na:1.8.0_252]
        at sun.security.jgss.krb5.Krb5MechFactory.getNameElement(Krb5MechFactory.java:95) ~[na:1.8.0_252]
        at sun.security.jgss.GSSManagerImpl.getNameElement(GSSManagerImpl.java:203) ~[na:1.8.0_252]
        at sun.security.jgss.GSSNameImpl.getElement(GSSNameImpl.java:477) ~[na:1.8.0_252]
        at sun.security.jgss.GSSNameImpl.init(GSSNameImpl.java:201) ~[na:1.8.0_252]
        at sun.security.jgss.GSSNameImpl.<init>(GSSNameImpl.java:170) ~[na:1.8.0_252]
        at sun.security.jgss.GSSNameImpl.<init>(GSSNameImpl.java:151) ~[na:1.8.0_252]
        at sun.security.jgss.GSSManagerImpl.createName(GSSManagerImpl.java:128) ~[na:1.8.0_252]
        at com.microsoft.sqlserver.jdbc.KerbAuthentication.intAuthInit(KerbAuthentication.java:58) ~[mssql-jdbc-7.4.1.jre8.jar!/:na]

krb5.conf

[libdefaults]
default_realm = US.TEST.COM
dns_lookup_kdc = true
dns_lookup_realm = true
ticket_lifetime = 86400
renew_lifetime = 604800
forwardable = true
default_tgs_enctypes = rc4-hmac
default_tkt_enctypes = rc4-hmac
permitted_enctypes = rc4-hmac
udp_preference_limit = 1

[realms]
US.TEST.COM = {
kdc = crldap1.us.test.com
admin_server =crldap1.us.test.com
}

[domain_realm]
 .us.test.com = US.TEST.COM
 us.test.com = US.TEST.COM

 

[default_realm]
 .us.test.com = US.TEST.COM
 us.test.com = US.TEST.COM

jaas.conf

Client {
  com.sun.security.auth.module.Krb5LoginModule required
  useKeyTab=false
  useTicketCache=true
  doNotPrompt=true;
};

连接字符串

spring.datasource.url =jdbc:sqlserver://DBSERVER\\SERVER_DEV;databaseName=DB1;authenticationScheme=JavaKerberos;integratedSecurity=true;[email protected];password=P@SSW0RD
java sql-server docker jdbc kerberos
1个回答
0
投票

您始终可以检查的一件事是 krb5.conf 文件的编码。

我们在将编码自动设置为

UTF-8-BOM
时遇到了麻烦。 显然有些系统无法处理该问题,因此无法读取 krb5.conf。这将触发
KrbException: Cannot locate default realm

将编码更改为

UTF-8
对我来说很有效。

如果这不起作用,我建议检查 krb5.conf 文件是否因其他原因无法读取。根据我的经验,这个错误通常是由读取文件时出现问题引起的。

© www.soinside.com 2019 - 2024. All rights reserved.