我注意到在我的使用 xades4j 会签的文档中,会签签名的参考中没有 Type="..CountersignedSignature" 。document.signed.bes.cs.xml 中的 xades4j 单元测试也是如此。
另一方面,xades4j.properties.CounterSignatureProperty
我可以看到定义了以下属性:
public String COUNTER_SIGNATURE_TYPE_URI = "http://uri.etsi.org/01903#CountersignedSignature";
如何强制 xades 使用该属性?如果缺少 type 属性,我在其他 3rd 方软件中验证文档时遇到问题。
我使用了用 SignerBESTest 编写的代码。
Document doc = getTestDocument();
Element elemToSign = doc.getDocumentElement();
XadesBesSigningProfile profile = new XadesBesSigningProfile(keyingProviderMy);
final XadesSigner counterSigner = profile.newSigner();
profile.withSignaturePropertiesProvider(new SignaturePropertiesProvider() {
@Override
public void provideProperties(final SignaturePropertiesCollector signedPropsCol) {
signedPropsCol.addCounterSignature(new CounterSignatureProperty(counterSigner));
signedPropsCol.setSignerRole(new SignerRoleProperty("CounterSignature"));
}
});
final XadesSignatureFormatExtender extender = new XadesFormatExtenderProfile().getFormatExtender();
final List<UnsignedSignatureProperty> unsignedProps = new ArrayList<UnsignedSignatureProperty>();
unsignedProps.add(new CounterSignatureProperty(counterSigner));
org.apache.xml.security.Init.init();
final Element sigElem = (Element) documentSource.getElementsByTagName("ds:Signature").item(0);
final XMLSignature xmlSig = new XMLSignature(sigElem, documentSource.getBaseURI());
extender.enrichSignature(xmlSig, new UnsignedProperties(unsignedProps));
提前致谢!
Edit1: 我会补充一点,我通过修改 xades4j 源来了解解决方案,但我会对只能在我的源代码中应用的解决方案更感兴趣。