【问题标题】:Is xmldsig apache santuario provider incompatible with jdk provider?xmldsig apache santuario 提供程序与 jdk 提供程序不兼容吗?
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      您可以通过调用以下方法禁用 Apache Santuario 提供程序在 WSS4J 中的注册:

      WSSConfig.setAddJceProviders(false);

      看这里:

      https://svn.apache.org/repos/asf/webservices/wss4j/tags/1_6_10/src/main/java/org/apache/ws/security/WSSConfig.java

      【讨论】:

      • 是的,这是可能的。但这真的是没有副作用的解决方案吗?我的意思是这是 wss4j 的默认行为,所以我不知道改变这种行为是否是一个好的解决方案。我也想知道为什么不兼容。
      猜你喜欢
      • 2013-08-07
      • 2022-06-16
      • 2018-06-04
      • 2021-03-29
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多