Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.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 xmldsig apache santuario提供程序是否与jdk提供程序不兼容?_Java_Xml Signature_Wss4j_Xml Dsig_Xmlsec - Fatal编程技术网

Java xmldsig apache santuario提供程序是否与jdk提供程序不兼容?

Java xmldsig apache santuario提供程序是否与jdk提供程序不兼容?,java,xml-signature,wss4j,xml-dsig,xmlsec,Java,Xml Signature,Wss4j,Xml Dsig,Xmlsec,我创建xml数字签名的方式与我发现的几乎所有示例中提到的方式相同: String providerName = System.getProperty("jsr105Provider", "org.jcp.xml.dsig.internal.dom.XMLDSigRI"); XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", (Provider) Class.forName(providerName).newInsta

我创建xml数字签名的方式与我发现的几乎所有示例中提到的方式相同:

String providerName = System.getProperty("jsr105Provider",
"org.jcp.xml.dsig.internal.dom.XMLDSigRI");

XMLSignatureFactory fac =
XMLSignatureFactory.getInstance("DOM",
(Provider) Class.forName(providerName).newInstance());
...and so on...
我们将结果xml文件发送给验证此签名的客户。到目前为止,所有的测试都通过了,一切都很好

在生产系统中,我们的客户突然发回“数字签名错误”。重新启动应用程序服务器后,一切似乎都恢复正常,客户已成功验证了一些文件。但几分钟/小时后,客户再次发送回“数字签名错误”。只有重新启动应用程序服务器才能暂时解决问题

我发现是什么导致了这个问题,但我不明白。 在使用WSS4J的应用程序中,初始化如下所示(org.apache.ws.security.WSSConfig):

公共静态同步void init(){
如果(!staticallyInitialized){
如果(添加jceProviders){
setXmlSecIgnoreLineBreak();
AccessController.doPrivileged(新的PrivilegedAction(){
公共布尔运行(){

addXMLDSigRI();您可以通过调用以下命令禁用在WSS4J中注册Apache Santuario提供程序:

WSSConfig.setAddJceProviders(false)

请看这里:


JDK注册自己版本的xml安全提供程序,当Wss4j初始化时,XMLSignatureFactory从JDK版本获取,而不是从Xmlsec jar获取。 在Wss4j的较新版本中,“addXMLDSigRI()”中对此进行了修复,如下所示:

    Security.removeProvider("ApacheXMLDSig");
    addJceProvider("ApacheXMLDSig", SantuarioUtil.getSantuarioProvider());

Ie-首先删除JDK注册的提供程序版本,然后注册自己的版本。这可以防止在使用来自不同提供程序(如Azul JDK)的JDK时引起的类加载问题.

是的,这是可能的。但这真的是一个没有副作用的解决方案吗?我的意思是,这是wss4j的默认行为,所以我不知道改变这种行为是否是一个好的解决方案。我还想知道为什么它不兼容。
    Security.removeProvider("ApacheXMLDSig");
    addJceProvider("ApacheXMLDSig", SantuarioUtil.getSantuarioProvider());