WSS4J, The signature or decryption was invalid

Securizar un servicio web con WS-Security es sencillo gracias a bilbiotecas como WSS4J.

Pero a veces hay problemas no muy claros, por ejemplo el siguiente (Axis2+Rampart+WSS4J):

Caused by: org.apache.ws.security.WSSecurityException: The signature or decryption was invalid
    at org.apache.ws.security.processor.SignatureProcessor.verifyXMLSignature(SignatureProcessor.java:419)
    at org.apache.ws.security.processor.SignatureProcessor.handleToken(SignatureProcessor.java:111)
    at org.apache.ws.security.WSSecurityEngine.processSecurityHeader(WSSecurityEngine.java:328)
    at org.apache.ws.security.WSSecurityEngine.processSecurityHeader(WSSecurityEngine.java:245)
    at org.apache.rampart.RampartEngine.process(RampartEngine.java:166)
    at org.apache.rampart.handler.RampartReceiver.invoke(RampartReceiver.java:92)

Si se descarta que un componente intermedio (log, proxy o similar) esté invalidando la firma, es necesario comprobar qué elementos de WSS se están incluyendo en la cabecera, porque la presencia de unos u otros cambia el comportamiento de WSS4J durante la validación.

La cabecera SOAP  puede incluir un elemento KeyInfo con un KeyIdentifier de tipo Thumbprint:

<ds:KeyInfo Id="KeyId-EFBB394B0359AF8F6014944252328742">
	<wsse:SecurityTokenReference xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="STRId-EFBB394B0359AF8F6014944252328753">
		<wsse:KeyIdentifier EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#ThumbprintSHA1">
			UtpMmW1PU5txR/SS4casZT2JqP4=
		</wsse:KeyIdentifier>
	</wsse:SecurityTokenReference>
</ds:KeyInfo>

En el keyidentifier se incluye la huella o hash SHA-1 del certificado firmante; esta huella será buscada conmparándola con las huellas de los certificados que figuran en el almacén de certificados de confianza, y si no se encuentra fallará la validación de la firma por no confiar la JVM receptora en el certificado del remitente.

En el caso de remitirse la clave pública del certificado firmante dentro de un BinarySecurityToken, en el elemento keyinfo se hará referencia a ese certificado y no a su thumbprint u otras propiedades. Con este método la validación de la firma se produce correctamente, siempre que dicho certificado o su cadena de emisores se encuentren en el almacén de certificados de confianza.

<wsse:BinarySecurityToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" wsu:Id="CertId-27DB4ED1B">
MIIIRzCCBi+[…]
</wsse:BinarySecurityToken>
[…]
<ds:KeyInfo Id="KeyId-27DB4ED1B">
	<wsse:SecurityTokenReference xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="STRId-27DB4ED1BDF">
		<wsse:Reference URI="#CertId-27DB4ED1BDF0" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" />
	</wsse:SecurityTokenReference>
</ds:KeyInfo>

Para conseguir que WSS4J incluya el binarysecuritytoken será necesario modificar el policy.xml o similar del servicio:

[...]
<sp:InitiatorToken>
	<wsp:Policy>
		<!-- CONFIGURACIÓN para keyidentifier thumbprint -->
		<!--sp:X509Token sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient"-->
		<sp:X509Token sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/Always">
			<wsp:Policy>
				<sp:RequireThumbprintReference />
					<sp:WssX509V1Token10 />
			</wsp:Policy>
		</sp:X509Token>
	</wsp:Policy>
</sp:InitiatorToken>
<sp:RecipientToken>
	<wsp:Policy>
		<!-- CONFIGURACIÓN para keyidentifier thumbprint -->
		<!--sp:X509Token sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/Never"-->
		<sp:X509Token sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/Always">
			<wsp:Policy>
				<sp:RequireThumbprintReference />
				<sp:WssX509V3Token10 />
			</wsp:Policy>
		</sp:X509Token>
	</wsp:Policy>
</sp:RecipientToken>
[...]

 

Los pingbacks están cerrados.

Los comentarios están deshabilitados.