测试设置:
- 在已加入活动目录的 Windows 10 机器上运行的 Weblogic 12.2.1.4
- JVM 1.8.0_281
- Java Web 应用程序使用 Java GSSAPI 通过 Samba 访问文件共享,基本上使用来自https://github.com/hierynomus/smbj/issues/304#issuecomment-375603115的代码
- 这是一个开发者机器——java系统属性“user.name”显示了开发者的windows用户名
- 运行 Red Hat Enterprise Linux 7 的 Linux 文件服务器,配置了 sssd 以连接到 Active Directory
- 运行 Red Hat Enterprise Linux 6 的 Linux 文件服务器,不使用 sssd,不使用 winbind(不清楚为 Active Directory 配置的精确度)
根据我收集到的与系统管理员对话的第三手资料,MIT Kerberos 以某种方式参与了将 linux 服务器连接到 Active Directory 的工作——但我没有更多信息。
(注意:serverfault 存在 markdown 表渲染问题 - 表在预览中显示正常,但在实际发布的问题中显示不正常,因此现在将其包围在代码块中,这样它就不会一起运行)
试验结果
| Source (all on same Windows 10 machine) | Target FileServer | Result |
|------------------------------------------|-----------------------|---------|
| Weblogic application | RHEL 6 | Success |
| Weblogic application | RHEL 7 | **Fail:** Server not found in Kerberos database |
| Windows Explorer | RHEL 6 | Success |
| Windows Explorer | RHEL 7 | Success |
所有测试都使用相同的用户凭据完成。
Weblogic 的跟踪结果(将 java 系统属性设置为 之后sun.security.krb5.debug
)true
是:
KrbAsReqBuild: PREAUTH FAILED/REQ, re-send AS-REQ
Using builtin default etypes for default_tkt_enctypes
default etypes for default_tkt_enctypes: 18 17 16 23
Using builtin default etypes for default_tkt_enctypes
default etypes for default_tkt_enctypes: 18 17 16 23
>>> EType: sun.security.krb5.internal.crypto.Aes256CtsHmacSha1EType
>>> KrbAsReq creating message
getKDCFromDNS using UDP
>>> KrbKdcReq send: kdc=***************. UDP:88, timeout=30000, number of retries =3, #bytes=233
>>> KDCCommunication: kdc=***************. UDP: 88, timeout=30000,Attempt =1, #bytes=233
>>> KrbKdcReq send: #bytes read=100
>>> KrbKdcReq send: kdc=*****************. TCP:88, timeout=30000, number of retires =3, #bytes=233
>>> KDCCommunication: kdc=****************. TCP:88, timeout=30000,Attempt =1, #bytes=233
>>>DEBUG: TCPClient reading 2695 bytes
>>>KrbKdcReq send: #bytes read=2695
>>>KdcAccessibility: remove **********************.:88
>>>Etype: sun.security.krb5.internal.crypto.Aes256CtsHmacSha1EType
>>>KrbAsRep cons in KrbAsReq.getReply ******
Found ticket for ******@******** to go to krbtgt/******@****** expiring on ******
Entered Krb5Context.initSecContext with state=STATE_NEW
Found ticket for ******@******** to go to krbtgt/******@****** expiring on ******
Service ticket not found in the subject
>>> Credentials serviceCredsSingle: same realm
Using builtin default etypes for default_tgs_enctypes
default etypes for default_tgs_enctypes: 18 17 16 23
>>> EType: sun.security.krb5.internal.crypto.Aes256CtsHmacSha1EType
>>> CksumType: sun.security.krb5.internal.crypto.HmacSha1Aes256CksumType
>>> EType: sun.security.krb5.internal.crypto.Aes256CtsHmacSha1EType
getKDCFromDNS using UDP
>>> KrbKdcReq send: kdc=************. TCP:88, timeout=30000, number of retries =3, #bytes=2633
>>> KDCCommunication: kdc=************. TCP:88, timeout=30000,Attempt =1, #bytes=2633
>>>DEBUG: TCPClient reading 104 bytes
>>> KrbKdcReq send: #bytes read=104
>>> KdcAccessibility: remove *************.:88
>>> KDCRep: init() encoding tag is 126 req type is 13
>>>KRBError:
STime is **********
suSec is **********
error code is 7
error Message is Server not found in Kerberos database
sname is cifs/***********@***********
msgType is 30
搜索“在 Kerberos 数据库中找不到服务器”会产生多种可能性(DNS 似乎是最常见的建议,其他答案建议 SPN 注册、TLS 证书、不使用 FQDN、无效的主机到领域映射、主机不是域的一部分, IPV4 与 IPV6)
网络管理员说 DNS 是正确的,这似乎可以通过 Windows 资源管理器可以很好地连接到 RHEL 7 服务器这一事实得到证实。但我也不准备只责备 java 代码,因为它确实成功连接到 RHEL 6 服务器。
我很难清楚地解释需要在哪里配置 Kerberos 条目。
这是 Windows 10 机器、文件服务器或 Active Directory KDC 上的“Kerberos 数据库”吗?或者是否有这个 Kerberos 数据库的多个副本,每个副本都需要条目?
编辑 - 附加细节 我学到了一些新东西,可以提供一些附加细节。
以下内容均来自 Developer 机器上的 Window 命令提示符。
领域由以下因素决定:
C:\>echo %userdnsdomain%
DC1.DC2.DC3
对于成功的连接(RHEL 6 服务器)
C:\>powershell Get-ADComputer server1
DistinguishedName : CN=SERVER1,OU=ou1,OU=ou2,OU=ou3,DC=dc1,DC=dc2,DC=dc3
DNSHostName : server1.dc2.dc3
Enabled : True
Name : SERVER1
ObjectClass : Computer
ObjectGUID : aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
SamAccountName : server1$
SID : ************************************
UserPrincipalName :
C:\>setspn -L server1
Registered ServicePrincipalNames for CN=SERVER1,OU=ou1,OU=ou2,OU=ou3,DC=dc1,DC=dc2, DC=dc3:
HOST/server1.dc2.dc3
HOST/SERVER1
C:\>nslookup server1
Server: aa1.dc2.dc3
Address: 123.456.789.01
Name: server1.dc2.dc3
Address: 123.456.7.890
C:\>nslookup 123.456.7.890
Server: aa1.dc2.dc3
Address: 123.456.789.01
Name: server1.dc2.dc3
Address: 123.456.7.890
对于失败的连接(RHEL 7 服务器)
C:\>powershell Get-ADComputer server2
DistinguishedName : CN=SERVER2,OU=ou4,DC=dc1,DC=dc2,DC=dc3
DNSHostName : server2.dc1.dc2.dc3
Enabled : True
Name : SERVER2
ObjectClass : Computer
ObjectGUID : bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb
SamAccountName : SERVER2$
SID : ************************************
UserPrincipalName :
C:\>setspn -L server2
Registered ServicePrincipalNames for CN=SERVER2,OU=ou4,DC=dc1,DC=dc2,DC=dc3:
RestrictedKrbHost/SERVER2
HOST/SERVER2
RestrictedKrbHost/SERVER2.dc1.dc2.dc3
HOST/SERVER2.dc1.dc2.dc3
C:\>nslookup server2
Server: aa1.dc2.dc3
Address: 123.456.789.01
Name: server2.dc1.dc2.dc3
Address: 12.345.6.78
C:\>nslookup 12.345.6.78
Server: aa1.dc2.dc3
Address: 123.456.789.01
Name: server2.dc2.dc3
Address: 12.345.6.78
比较成功与失败的 Weblogic 跟踪结果:
成功:
>>> DEBUG: ----Credentials----
client: [email protected]
server: cifs/[email protected]
ticket: sname: cifs/[email protected]
失败:
>>>KRBError:
...
error code is 7
error Message is is Server not found in Kerberos database
sname is cifs/[email protected]
msgType is 30
所以我注意几点:
- 成功的(RHEL 6)服务器在许多地方(但不是全部)省略了“dc1”
- 成功和失败
sname
仅在服务器部分有所不同——否则它们会排列在“dc”值上。 - 两台服务器位于不同的组织单位中(尽管我认为这不是问题)
- 命令结果的大小写有一些差异
nslookup
结果似乎有所不同,server2
具体取决于是通过服务器名称(包括dc1
)还是 IP 地址(不包括dc1
)查找