Java xmldsig apache santuario提供程序是否与jdk提供程序不兼容?
我创建xml数字签名的方式与我发现的几乎所有示例中提到的方式相同: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
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());