SPNEGO:服务器收到截断的令牌,而不是一个客户端发送的令牌

SPNEGO: Server receiving a truncated token than the one client is sending

我正在尝试与启用了 Kerberos 的 SolrCloud 集群进行交互。我已经使用选项

使用 jaas.confkrb5.conf 文件配置了我的客户端 java 进程
-Djava.security.auth.login.config=<path to jaas.conf>
-Djavax.security.auth.useSubjectCredsOnly=false 
-Djava.security.krb5.conf=<path to krb5.conf>

我在客户端日志中收到禁止错误。服务器日志显示以下错误:

Authentication exception: GSSException: Defective token detected (Mechanism level: Invalid SPNEGO NegTokenInit token : extra data given to DerValue constructor)

在客户端和服务器进程中启用调试日志记录时,我看到服务器收到的令牌比客户端发送的令牌小。 示例:

Found KeyTab solr.keytab for HTTP/<hostname>@REALM
Found KeyTab solr.keytab for HTTP/<hostname>@REALM
Entered SpNegoContext.acceptSecContext with state=STATE_NEW
SpNegoContext.acceptSecContext: receiving token = a0 82 04 b9 30 82 04 b5 a0 0d 30 0b 06 09 2a 86 48 86 f7 12 01 02 02 a1 04 03 02 01 f6 a2 82 04 9c 04 82 04 98 60 82 04 94 06 09 2a 86 
Found KeyTab solr.keytab for HTTP/<hostname>@REALM
Found KeyTab solr.keytab for HTTP/<hostname>@REALM
Entered SpNegoContext.acceptSecContext with state=STATE_NEW
SpNegoContext.acceptSecContext: receiving token = a0 82 04 b9 30 82 04 b5 a0 0d 30 0b 06 09 2a 86 48 86 f7 12 01 02 02 a1 04 03 02 01 f6 a2 82 04 9c 04 82 04 98 60 82 04 94 06 09 2a 86

客户端正在发送一个更长的令牌。我通过发送令牌更长的客户端调试日志以及查看 HTTP 请求 header.

验证了这一点

通过查看源码,我发现错误是由以下几行引起的: https://github.com/frohoff/jdk8u-jdk/blob/master/src/share/classes/sun/security/util/DerValue.java#L383 https://github.com/frohoff/jdk8u-jdk/blob/master/src/share/classes/sun/security/jgss/spnego/NegTokenInit.java#L143 https://github.com/frohoff/jdk8u-jdk/blob/master/src/share/classes/sun/security/jgss/spnego/SpNegoContext.java#L512

我尝试以编程方式连接的相同 SOLR 节点可通过浏览器访问,服务器日志显示它们收到完整令牌。 我正在使用 Java 1.8.0_111 并且还尝试了 Java 1.8.0_11

进行 TCP 转储并查看从客户端发送的请求后,我发现底层 HTTP 客户端库将 base64 编码的 Kerberos 令牌截断为每行 76 个字符,然后添加 CRLF 字符。 this 答案中的更多信息。使用 Apache HttpClient 库使用的较新版本的 commons-codec) 修复了它。