【问题标题】:java - how to append <keyvalue> before <x509data> in signed xmljava - 如何在签名的 xml 中的 <x509data> 之前附加 <keyvalue>
【发布时间】:2017-10-02 09:34:46
【问题描述】:

现在我正在使用数字签名进行编程,但我在生成签名时遇到了问题。我先添加了 KeyValue,然后添加了 X509Data,但标签只是先附加。 我有一个创建 signinfo 的代码:

private KeyInfo createKeyInfo(PublicKey publicKey, X509Certificate x509Certificate) throws KeyException {
    KeyInfoFactory keyInfoFactory = factory.getKeyInfoFactory();
    KeyInfo keyInfo = null;
    KeyValue keyValue = null;
    List items = null;
    //Just with public key
    if(publicKey != null){
        keyValue = keyInfoFactory.newKeyValue(publicKey);
        keyInfo = keyInfoFactory.newKeyInfo(singletonList(keyValue));
    }

    if(x509Certificate != null){
        List x509list = new ArrayList();

        x509list.add(x509Certificate.getSubjectX500Principal().getName());
        x509list.add(x509Certificate);
        X509Data x509Data = keyInfoFactory.newX509Data(x509list);
        items = new ArrayList();

        items.add(x509Data);
        if(keyValue != null){
            items.add(keyValue);
        }
        keyInfo = keyInfoFactory.newKeyInfo(items);
    }

    return keyInfo;
}

结果是:

<KeyInfo>
          <X509Data>
            <X509SubjectName>name</X509SubjectName>
            <X509Certificate>
              base 64 encode
            </X509Certificate>
          </X509Data>
          <KeyValue>
            <RSAKeyValue>
              <Modulus>
               base 64 encode key
              </Modulus>
              <Exponent>AQAB</Exponent>
            </RSAKeyValue>
          </KeyValue>
        </KeyInfo>

我想要的结果是:

<KeyInfo>
          <KeyValue>
            <RSAKeyValue>
              <Modulus>
                base 64 encode
              </Modulus>
              <Exponent>AQAB</Exponent>
            </RSAKeyValue>
          </KeyValue>
          <X509Data>
            <X509SubjectName>Name</X509SubjectName>
            <X509Certificate>
              base 64 endcode
            </X509Certificate>
          </X509Data>
        </KeyInfo>

谁能帮帮我。非常感谢!

【问题讨论】:

    标签: java digital-signature signed signedxml


    【解决方案1】:

    您不应该考虑&lt;X509Data&gt;&lt;KeyValue&gt; 之间的顺序。 XSD 确定它们可以以任何顺序出现

    https://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd#

    <element name="KeyInfo" type="ds:KeyInfoType"/>
    <complexType name="KeyInfoType" mixed="true">
       <choice maxOccurs="unbounded">
          <element ref="ds:KeyName"/>
          <element ref="ds:KeyValue"/>
          <element ref="ds:RetrievalMethod"/>
          <element ref="ds:X509Data"/>
          <element ref="ds:PGPData"/>
          <element ref="ds:SPKIData"/>
          <element ref="ds:MgmtData"/>
          <any processContents="lax" namespace="##other"/>
          <!--  (1,1) elements from (0,unbounded) namespaces  -->
        </choice>
        <attribute name="Id" type="ID" use="optional"/>
    </complexType>
    

    【讨论】:

    • 谢谢,但我签署了我的 xml 文档,然后我验证它,但验证失败。我不知道为什么:(
    • 那我建议用验证问题开一个新问题,因为我担心你的问题不能用我做的其他方式回答。
    【解决方案2】:

    在智利,内部税务服务也存在同样的问题。当 KeyValue 在 x509 证书之后时验证失败。虽然根据 XSD 不应该有顺序,但可以使用另一个列表实现来解决,使用有序列表。

    你需要改变

    List x509list = new ArrayList();

    LinkedList x509list = new LinkedList();
    

    并在添加元素时反转顺序

     if(keyValue != null){
           items.add(keyValue);
     }
     items.add(x509Data);
    

    【讨论】:

      猜你喜欢
      • 2015-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      相关资源
      最近更新 更多