spnego.jar从Java 7切换到Java 8时出现类型转换异常。

4
我正在使用dfelix的spnego.jar作为Glassfish 4.1中web.xml的过滤器。我在项目论坛上提出了问题,但没有得到回复。
我想从Java 1.7.0_45切换到1.8.0_45(也尝试其他1.8版本)。在测试环境中切换后,我收到了下面显示的错误。我还尝试了一个简单的Java案例,也收到了相同的异常。
我正在使用与1.7相同的krb5.conf(如下所示),login.conf和keytab文件。
它是否与Java 1.8不兼容?
[glassfish 4.1] [SEVERE] [] [javax.enterprise.web] [tid: _ThreadID=16 _ThreadName=RunLevelControllerThread-1431425761516] [timeMillis: 1431425776202] [levelValue: 1000] [[ WebModule[/ax]启动过滤器SpnegoHttpFilter时发生异常
java.lang.InstantiationException at org.apache.catalina.core.ApplicationFilterConfig.(ApplicationFilterConfig.java:135)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:5329)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:5943) at com.sun.enterprise.web.WebModule.start(WebModule.java:691)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1041)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:1024)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:747)
at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:2286)
at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1932)
at com.sun.enterprise.web.WebApplication.start(WebApplication.java:139)
at org.glassfish.internal.data.EngineRef.start(EngineRef.java:122)
at org.glassfish.internal.data.ModuleInfo.start(ModuleInfo.java:291)
at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:352)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:500)
at com.sun.enterprise.v3.server.ApplicationLoaderService.processApplication(ApplicationLoaderService.java:406)
at com.sun.enterprise.v3.server.ApplicationLoaderService.postConstruct(ApplicationLoaderService.java:243)
at org.jvnet.hk2.internal.ClazzCreator.postConstructMe(ClazzCreator.java:329)
at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:377)
at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:461)
at org.glassfish.hk2.runlevel.internal.AsyncRunLevelContext.findOrCreate(AsyncRunLevelContext.java:227)
at org.glassfish.hk2.runlevel.RunLevelContext.findOrCreate(RunLevelContext.java:84)
at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2258)
at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:105)
at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:87)
at org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.oneJob(CurrentTaskFuture.java:1162)
at org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.run(CurrentTaskFuture.java:1147)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: javax.servlet.ServletException: javax.security.auth.login.LoginException: java.lang.IllegalArgumentException: java.lang.ClassCastException: java.util.Vector cannot be cast to java.util.Hashtable
at sun.security.krb5.Config.get0(Config.java:287)
at sun.security.krb5.Config.getString0(Config.java:268)
at sun.security.krb5.Config.getAll(Config.java:240)
at sun.security.krb5.Config.getKDCList(Config.java:1030)
at sun.security.krb5.KdcComm.send(KdcComm.java:218)
at sun.security.krb5.KdcComm.send(KdcComm.java:200)
at sun.security.krb5.KrbAsReqBuilder.send(KrbAsReqBuilder.java:316)
at sun.security.krb5.KrbAsReqBuilder.action(KrbAsReqBuilder.java:361)
at com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication(Krb5LoginModule.java:776)
at com.sun.security.auth.module.Krb5LoginModule.login(Krb5LoginModule.java:617)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun

login.conf:

    spnego-server {
    com.sun.security.auth.module.Krb5LoginModule required
       useKeyTab=true
       keyTab="ax.keytab"
       principal=development
    storeKey=true;
};

krb5.conf

[libdefaults]
    default_realm = LOC.COM
    default_tkt_enctypes = aes256-cts aes128-cts rc4-hmac des3-cbc-sha1 des-cbc-md5 des-cbc-crc
    default_tgs_enctypes = aes256-cts aes128-cts rc4-hmac des3-cbc-sha1 des-cbc-md5 des-cbc-crc
    permitted_enctypes = aes256-cts aes128-cts rc4-hmac des3-cbc-sha1 des-cbc-md5 des-cbc-crc
    forwardable = true
    udp_preference_limit = 1 

[realms] 
    LOC.COM = { KDC = ax.loc.com default_domain = LOC.COM } 

[domain_realm] 
    .loc.com = LOC.COM
    loc.com = LOC.COM
    ax.loc.com = AX.LOC.COM

抓住我眼球的离题事情:你说你使用的是Glassfish v4.1,但堆栈跟踪中提到的是Glassfish v3。这似乎有些可疑。 - Gimby
你是在说 com.sun.enterprise.v3.server 吗? - jareeq
是的,我确实这么认为。我对Glassfish不是很了解,所以也许这很正常,但对我来说似乎有些奇怪。如果您在包名称中放置服务器的主要版本,我会假设在运行Glassfish 4.x时会得到一个带有v4的包。如果我得到一个带有v3包的代码,我会开始怀疑是否使用了过时的服务器库。 - Gimby
这是正常的,它也会出现在Glassfish 4.0和4.1中。 - jareeq
1个回答

3

您需要按以下方式重新格式化krb5.conf文件中的[realms]部分:

[realms] 
    LOC.COM = {
        KDC = ax.loc.com
        default_domain = LOC.COM
    }

在JDK8中,krb5.conf的解析方式有所改变,JDK-7184246 : Simplify Config.get() of krb5 看起来很有趣。通过diff可以看到对krb5.conf逐行处理的显着更改。这似乎使得在JDK7下可解析的文件,在JDK8下不可解析。现在它似乎想要在单独的行上看到闭合括号。

我认为krb5.conf没有严格的规范,但大多数示例都显示括号在自己的行上,每行只有一个赋值。


1
它起作用了!实际上,查看错误堆栈,发现有 sun.security.krb5.Config.get0,但我没有意识到正确格式化它 - 看起来在Java 8中格式化krb5.conf至关重要。现在我得到了“检测到缺陷令牌(机制级别:GSSHeader未找到正确的标记)”,但这比以前更接近了。 - jareeq
1
这是关于有缺陷的令牌问题。有两种方法,第一种是将Java降级到1.8.0_31,这是最后一个可用的版本,或者等待修复更新。感谢javabrett在配置文件中帮助解决分隔行问题。 - jareeq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接