public class XmlSignerProcessor extends XmlSignatureProcessor
In the enveloped XML signature case, the method
XmlSignerConfiguration.getParentLocalName()
must not return
null
. In this case the parent element must be contained in the
XML document provided by the message body and the signature element is added
as last child element of the parent element. If a KeyInfo instance is
provided by the KeyAccessor
and
XmlSignerConfiguration.getAddKeyInfoReference()
is true
,
then also a reference to the KeyInfo element is added. The generated XML
signature has the following structure:
<[parent element]>
...
<Signature Id="[signature_id]">
<SignedInfo>
<Reference URI="">
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
(<Transform>)*
<DigestMethod>
<DigestValue>
</Reference>
(<Reference URI="#[keyinfo_Id]">
<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<DigestMethod>
<DigestValue>
</Reference>)?
<!-- further references possible, see XmlSignerConfiguration#setProperties(XmlSignatureProperties) -->
</SignedInfo>
<SignatureValue>
(<KeyInfo Id="[keyinfo_id]">)?
<!-- Object elements possible, see XmlSignerConfiguration#setProperties(XmlSignatureProperties) -->
</Signature>
</[parent element]>
In the enveloping XML signature case, the generated XML signature has the following structure:
<Signature Id="[signature_id]">
<SignedInfo>
<Reference URI="#[object_id]" type="[optional_type_value]">
(<Transform>)*
<DigestMethod>
<DigestValue>
</Reference>
(<Reference URI="#[keyinfo_id]">
<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<DigestMethod>
<DigestValue>
</Reference>)?
<!-- further references possible, see XmlSignerConfiguration#setProperties(XmlSignatureProperties) -->
</SignedInfo>
<SignatureValue>
(<KeyInfo Id="[keyinfo_id]">)?
<Object Id="[object_id]"/>
<!-- further Object elements possible, see XmlSignerConfiguration#setProperties(XmlSignatureProperties) -->
</Signature>
In the enveloping XML signature case, also message bodies containing plain
text are supported. This must be indicated via the header
XmlSignatureConstants.HEADER_MESSAGE_IS_PLAIN_TEXT
or via the
configuration XmlSignerConfiguration.getPlainText()
.
Detached signatures where the signature element is a sibling element to the
signed element are supported. Those elements can be signed which have ID
attributes. The elements to be signed must be specified via xpath expressions
(see XmlSignerConfiguration.setXpathsToIdAttributes(List)
) and the
XML schema must be provided via the schema resource URI (see method
XmlSignatureConfiguration.setSchemaResourceUri(String)
. Elements with
deeper hierarchy level are signed first. This procedure can result in nested
signatures.
In all cases, the digest algorithm is either read from the configuration
method XmlSignerConfiguration.getDigestAlgorithm()
or calculated from
the signature algorithm (
XmlSignerConfiguration.getSignatureAlgorithm()
. The optional
transforms are read from XmlSignerConfiguration.getTransformMethods()
.
In all cases, you can add additional references and objects which contain
properties for the XML signature, see
XmlSignerConfiguration.setProperties(XmlSignatureProperties)
.
Constructor and Description |
---|
XmlSignerProcessor(XmlSignerConfiguration config) |
Modifier and Type | Method and Description |
---|---|
protected Reference |
createKeyInfoReference(XMLSignatureFactory fac,
String keyInfoId,
String digestAlgorithm) |
protected Reference |
createReference(XMLSignatureFactory fac,
String uri,
String type,
SignatureType sigType,
String id,
org.apache.camel.Message message) |
protected SignedInfo |
createSignedInfo(XMLSignatureFactory fac,
List<? extends Reference> refs) |
protected XMLObject |
createXMLObject(XMLSignatureFactory fac,
Node node,
String id) |
XmlSignerConfiguration |
getConfiguration() |
protected String |
getContentReferenceType(org.apache.camel.Message message) |
protected List<String> |
getContentReferenceUris(org.apache.camel.Message message,
SignatureType signatureType,
Node messageBodyNode) |
protected String |
getDigestAlgorithmUri() |
protected Node |
getMessageBodyNode(org.apache.camel.Message message) |
protected String |
getMessageEncoding(org.apache.camel.Message inMessage) |
protected List<? extends XMLObject> |
getObjects(XmlSignatureProperties.Input input,
XmlSignatureProperties.Output properties) |
protected Element |
getParentForEnvelopedCase(Document doc,
org.apache.camel.Message inMessage) |
protected Element |
getParentOfSignature(org.apache.camel.Message inMessage,
Node messageBodyNode,
String contentReferenceURI,
SignatureType sigType) |
protected List<? extends Reference> |
getReferences(XmlSignatureProperties.Input input,
XmlSignatureProperties.Output properties,
String keyInfoId) |
protected Schema |
getSchemaForSigner(org.apache.camel.Message message,
org.apache.camel.processor.validation.ValidatorErrorHandler errorHandler) |
protected XmlSignatureProperties.Output |
getSignatureProperties(XmlSignatureProperties.Input input) |
protected List<XPathFilterParameterSpec> |
getXpathToIdAttributes(org.apache.camel.Message message) |
protected Boolean |
isPlainText(org.apache.camel.Message message) |
protected Boolean |
omitXmlDeclaration(org.apache.camel.Message message) |
protected Document |
parseInput(InputStream is,
Boolean disallowDoctypeDecl,
Schema schema,
ErrorHandler errorHandler) |
void |
process(org.apache.camel.Exchange exchange) |
protected void |
setOutputEncodingToMessageHeader(org.apache.camel.Message message) |
protected Document |
sign(org.apache.camel.Message out) |
clearMessageHeaders, getSchema, getSchemaResourceUri, setCryptoContextProperties
public XmlSignerProcessor(XmlSignerConfiguration config)
public XmlSignerConfiguration getConfiguration()
getConfiguration
in class XmlSignatureProcessor
protected List<XPathFilterParameterSpec> getXpathToIdAttributes(org.apache.camel.Message message)
protected XmlSignatureProperties.Output getSignatureProperties(XmlSignatureProperties.Input input) throws Exception
Exception
protected Boolean omitXmlDeclaration(org.apache.camel.Message message)
protected SignedInfo createSignedInfo(XMLSignatureFactory fac, List<? extends Reference> refs) throws Exception
Exception
protected Node getMessageBodyNode(org.apache.camel.Message message) throws Exception
Exception
protected Schema getSchemaForSigner(org.apache.camel.Message message, org.apache.camel.processor.validation.ValidatorErrorHandler errorHandler) throws XmlSignatureException, SAXException, IOException
protected Boolean isPlainText(org.apache.camel.Message message)
protected Element getParentOfSignature(org.apache.camel.Message inMessage, Node messageBodyNode, String contentReferenceURI, SignatureType sigType) throws Exception
Exception
protected Element getParentForEnvelopedCase(Document doc, org.apache.camel.Message inMessage) throws Exception
Exception
protected List<? extends Reference> getReferences(XmlSignatureProperties.Input input, XmlSignatureProperties.Output properties, String keyInfoId) throws Exception
Exception
protected List<? extends XMLObject> getObjects(XmlSignatureProperties.Input input, XmlSignatureProperties.Output properties) throws Exception
Exception
protected String getMessageEncoding(org.apache.camel.Message inMessage)
protected Document parseInput(InputStream is, Boolean disallowDoctypeDecl, Schema schema, ErrorHandler errorHandler) throws ParserConfigurationException, IOException, XmlSignatureFormatException
protected Reference createReference(XMLSignatureFactory fac, String uri, String type, SignatureType sigType, String id, org.apache.camel.Message message) throws InvalidAlgorithmParameterException, XmlSignatureException
protected String getContentReferenceType(org.apache.camel.Message message)
protected List<String> getContentReferenceUris(org.apache.camel.Message message, SignatureType signatureType, Node messageBodyNode) throws XmlSignatureException, XPathExpressionException
protected XMLObject createXMLObject(XMLSignatureFactory fac, Node node, String id)
protected String getDigestAlgorithmUri() throws XmlSignatureException
XmlSignatureException
protected Reference createKeyInfoReference(XMLSignatureFactory fac, String keyInfoId, String digestAlgorithm) throws Exception
Exception
protected void setOutputEncodingToMessageHeader(org.apache.camel.Message message)
Apache Camel