Как добавить <keyvalue> перед <x509data> в подписанном XML
Теперь я программирую с цифровой подписью, и у меня есть проблема, когда я генерирую подпись. Сначала я добавил 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>
Кто может мне помочь. Спасибо вам большое!
2 ответа
В Чили у внутренней налоговой службы такая же проблема. Сбой при проверке, когда KeyValue находится после сертификата x509. Хотя он не должен иметь порядок в соответствии с XSD, его можно решить с помощью другой реализации списка, используйте упорядоченный список.
Вам нужно изменить
List x509list = new ArrayList();
в
LinkedList x509list = new LinkedList();
и инвертировать порядок при добавлении элементов
if(keyValue != null){
items.add(keyValue);
}
items.add(x509Data);
Вы не должны рассматривать порядок между <X509Data>
а также <KeyValue>
, 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>