【发布时间】:2016-04-08 01:37:26
【问题描述】:
我正在创建一个 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):
public static synchronized void init() {
if (!staticallyInitialized) {
if (addJceProviders) {
setXmlSecIgnoreLineBreak();
AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
public Boolean run() {
addXMLDSigRI(); <-- this line causes the problem
addJceProvider("BC", "org.bouncycastle.jce.provider.BouncyCastleProvider");
Security.removeProvider("STRTransform");
appendJceProvider(
"STRTransform", new org.apache.ws.security.transform.STRTransformProvider()
);
return true;
}
});
}
staticallyInitialized = true;
}
}
addXMLDsigRI() 在当前提供程序配置 (java.security) 中不存在 ApacheXMLDSig 提供程序时将其添加到位置 2。默认的 XMLDSig jdk 提供程序位于第 8 位。
在 WSS4J 初始化之后,xml 数字签名的创建发生了变化,客户说“数字签名错误”。
当我在位置 2 手动注册 ApacheXMLDSig 提供程序时,我可以重现客户错误。如果我在位置 10(在 jdk 提供程序之后)添加提供程序,它会再次工作。
版本:
- xml 安全 1.5.6
- wss4j 1.6.10
- jdk1.7.0_13
- tomcat 7 应用服务器
我明确使用 jdk 提供程序: org.jcp.xml.dsig.internal.dom.XMLDSigRI
为什么注册 apache 提供程序会“破坏” jdk 提供程序的功能,我该如何解决?
【问题讨论】:
标签: java xml-signature wss4j xml-dsig xmlsec