Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用IBM SDK 6.0生成XML签名_Java_Xml_Digital Signature_Xml Signature - Fatal编程技术网

Java 使用IBM SDK 6.0生成XML签名

Java 使用IBM SDK 6.0生成XML签名,java,xml,digital-signature,xml-signature,Java,Xml,Digital Signature,Xml Signature,我在尝试使用IBM的JRE 6.0签署SAML2断言时遇到了一个有趣的问题。如果我在sunjdk下运行代码,它将正确地对断言进行签名,签名将进行验证。如果我在IBMJRE下运行完全相同的代码,则会正确创建断言,但签名不会验证。同样,这是相同的代码,事实上,当它从Jetty运行时,它也是完全相同的Jetty配置和WAR文件。我有两个Jetty实例运行在不同的端口上,具有不同的JRE,但指向同一个Jetty主页。在Sun JRE下生成的签名将进行验证,但在IBM JRE下生成的签名不会进行验证。坦率

我在尝试使用IBM的JRE 6.0签署SAML2断言时遇到了一个有趣的问题。如果我在sunjdk下运行代码,它将正确地对断言进行签名,签名将进行验证。如果我在IBMJRE下运行完全相同的代码,则会正确创建断言,但签名不会验证。同样,这是相同的代码,事实上,当它从Jetty运行时,它也是完全相同的Jetty配置和WAR文件。我有两个Jetty实例运行在不同的端口上,具有不同的JRE,但指向同一个Jetty主页。在Sun JRE下生成的签名将进行验证,但在IBM JRE下生成的签名不会进行验证。坦率地说,我被难住了,没有什么可以尝试的了,所以任何建议都会有帮助。

几年后,但我会自己回答这个问题。问题是DOM1(非名称空间感知)和DOM2+(名称空间感知)调用的混合。通过将所有内容转移到支持名称空间的DOM2+调用,问题就解决了。

好的,解决了这个问题。事实证明,XML Dsig的Sun实现比Xerces/XML安全性和IBM的实现更宽容。DOM1和DOM2调用混合在一起会导致问题,而URI的取消引用方式也会导致问题。将所有DOM1调用(没有名称空间的DOM调用)替换为DOM2调用,并在DOMSignContext上设置id信息,解决了这个问题,它现在可以在两个JVM下工作。嘿,你能进一步解释一下你在评论中做了什么吗?必须改变的是Xerces的实施方式,对吗?最好的方法是什么?我尝试更改父类加载程序,但出现Servlet类路径错误。所以我想避免这样做,基本上我只是确保每个DOM调用都使用一个名称空间值。因此,我使用Document.createElement()代替Document.createElements()。通过确保所有内容都定义了名称空间,它清除了错误。无需更改Xerces实现,只是不要在同一文档上混合使用DOM1(不支持命名空间)和DOM2+(支持命名空间)调用。