gpt4 book ai didi

java - 服务主体名称 (SPN) 是否绑定(bind)到特定计算机?

转载 作者:行者123 更新时间:2023-11-30 12:01:41 25 4
gpt4 key购买 nike

目前,我的 GSS 演示应用程序(在服务器端)收到 KrbException:解密字段的完整性检查失败 (31)。现在我正在寻找这个的原因。我怀疑,这是因为

  1. 客户端和服务器应用程序在同一台机器上运行(本地主机)和/或
  2. SPN 是为另一台机器(计算机)生成的

第二个表示服务主体是为一台机器 xxx0815.domain.net 生成的,所以 SPN 是 HTTP/xxx0815.domain.net@DOMAIN.NET。而我的机器不是那个,但是我有keytab文件所以服务器的登录方法成功。

我的怀疑是正确的还是我犯了另一个错误?

服务器配置和源代码:
服务器配置文件

Server { 
com.sun.security.auth.module.Krb5LoginModule
required
isInitiator=false
doNotPrompt=true
useKeyTab=true
keyTab="gssdemo.keytab"
storeKey=true
principal="HTTP/xxx0815.domain.net@DOMAIN.NET"
debug=true;
};

GSSServer.java(省略了样板文件)

    GSSManager manager = GSSManager.getInstance();
GSSName serverName = manager.createName(getServerName(), null);
GSSCredential serverCred = manager.createCredential(serverName,
GSSCredential.INDEFINITE_LIFETIME,
createKerberosOid(),
GSSCredential.ACCEPT_ONLY);
GSSContext context = manager.createContext(serverCred);
System.out.println("Context created successfully. Now incoming tokens could be accepted.");

ServerSocket serverSocket = new ServerSocket(55555);
SocketAdapter ca = new SocketAdapter(serverSocket.accept());

while (!context.isEstablished()) {
byte[] inToken = ca.readToken();
byte[] outToken = context.acceptSecContext(inToken, 0, inToken.length);

if (outToken != null) {
ca.sendToken(outToken);
}
}

System.out.println("Context established");
System.out.println("Connected user is: " + context.getSrcName());
context.dispose();

客户端配置和源代码:
客户端.conf

Client {
com.sun.security.auth.module.Krb5LoginModule
required
useTicketCache=true
debug=true;
};

GssClient.java(省略样板文件)

    GSSManager manager = GSSManager.getInstance();
GSSName clientName = manager.createName(getClientName(), null);
GSSCredential clientCred = manager.createCredential(clientName,
8 * 3600,
createKerberosOid(),
GSSCredential.INITIATE_ONLY);
GSSName serviceName = manager.createName("HTTP/xxx0815.domain.net@DOMAIN.NET", null);

GSSContext context = manager.createContext(serviceName,
createKerberosOid(),
clientCred,
GSSContext.DEFAULT_LIFETIME);
context.requestMutualAuth(true);
context.requestConf(false);
context.requestInteg(true);

System.out.println("Establishing context");
SocketAdapter ca = new SocketAdapter(new Socket("localhost", 55555));

byte[] inToken = new byte[0];
while (true) {
byte[] outToken = context.initSecContext(inToken, 0, inToken.length);

if (outToken != null) {
ca.sendToken(outToken);
}

if (context.isEstablished()) {
break;
}

inToken = ca.readToken();
}

System.out.println("Context established: " + context.isEstablished());

context.dispose();

我已经检查了传出和传入的网络数据 - 双方都相同,所以我可以排除那里的问题(我对输出进行了 BASE64 编码,然后通过流发送它。我认为没有太多那里可能会出错...)。

我得到的异常:

Caused by: GSSException: Failure unspecified at GSS-API level (Mechanism level: Integrity check on decrypted field failed (31))
at sun.security.jgss.krb5.Krb5Context.acceptSecContext(Krb5Context.java:741)
at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:323)
at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:267)
at de.westlb.mrm.sandbox.gss.GssServer.acceptAndEstablish(GssServer.java:88)
at de.westlb.mrm.sandbox.gss.GssServer.run(GssServer.java:66)
... 4 more
Caused by: KrbException: Integrity check on decrypted field failed (31)
at sun.security.krb5.internal.crypto.DesCbcEType.decrypt(DesCbcEType.java:154)
at sun.security.krb5.internal.crypto.DesCbcMd5EType.decrypt(DesCbcMd5EType.java:33)
at sun.security.krb5.internal.crypto.DesCbcEType.decrypt(DesCbcEType.java:125)
at sun.security.krb5.internal.crypto.DesCbcMd5EType.decrypt(DesCbcMd5EType.java:33)
at sun.security.krb5.EncryptedData.decrypt(EncryptedData.java:168)
at sun.security.krb5.KrbApReq.authenticate(KrbApReq.java:267)
at sun.security.krb5.KrbApReq.<init>(KrbApReq.java:134)
at sun.security.jgss.krb5.InitSecContextToken.<init>(InitSecContextToken.java:79)
at sun.security.jgss.krb5.Krb5Context.acceptSecContext(Krb5Context.java:724)
... 8 more

最佳答案

如果完整性检查失败,表明数据没有被正确发送/接收(这是一个不正确的错误消息)。换句话说,发生了一些修改。

我知道您说您已检查发送的数据是否与网络级别的接收数据匹配,但是您确定它在发送之前或接收之后没有损坏吗?我建议您先检查您的代码。

编辑:在回答您的问题时,可以将服务主体(实际上是任何票证)绑定(bind)到特定机器,但这通常是根据 IP 地址来完成的。在任何情况下,类似的事情都会导致不同的更高级别的错误。

您收到的错误听起来像是首先无法解密票证。一个可能的原因是它使用了错误的 key ,这可能与您复制 key 表有关。使用错误的票证也可能导致错误的 key (因为 kerberos 基本上提供了 key 管理协议(protocol))。您是否缓存了一张旧的/不正确的票?

关于java - 服务主体名称 (SPN) 是否绑定(bind)到特定计算机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/435091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com