java spring spring-ws x509

java - Soporte para X509PKIPathv1 en xws-security para Spring-WS



spring boot ssl (2)

Estoy tratando de enviar una solicitud a un servicio web existente. Este servicio web no está gobernado por mí. La política de seguridad de este servicio web requiere que envíe mi cadena de certificados completa en mi solicitud SOAP. Mi cadena de certificados contiene 3 certificados. No hay problemas con la configuración de la cadena de certificados, ya que puedo probar su validez (y lo he hecho).

La configuración de seguridad para esta configuración (= envío de la cadena de certificados completa en la solicitud) es:

<xwss:Sign id="signature"> <xwss:X509Token certificateAlias="alias" keyReferenceType="Direct" valueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509PKIPathv1" /> </xwss:Sign>

Estoy tratando de lograr esto a través de Spring-WS . Spring-WS usa spring-ws-security para seguridad. Spring-ws-security delega a xws-security.

<dependency> <groupId>org.springframework.ws</groupId> <artifactId>spring-ws-security</artifactId> <version>2.1.0.RELEASE</version> <exclusions> <exclusion> <groupId>org.apache.ws.security</groupId> <artifactId>wss4j</artifactId> </exclusion> <exclusion> <groupId>com.sun.xml.wsit</groupId> <artifactId>xws-security</artifactId> </exclusion> </exclusions> </dependency>

Xws-security viene en 2 sabores:

<dependency> <groupId>com.sun.xml.wsit</groupId> <artifactId>xws-security</artifactId> <version>1.3.1</version> </dependency>

y

<dependency> <groupId>com.sun.xml.wss</groupId> <artifactId>xws-security</artifactId> <version>3.0</version> </dependency>

El primero es utilizado por Spring WS Security. El segundo es legado.

La aplicación de mi configuración XWSS en xws-security se realiza en una clase llamada BinarySecurityToken. BinarySecurityToken tiene un campo llamado

valueType

El JavaDoc de valueType dice que tiene soporte para X509PKIPathv1 (entre otros). Sin embargo, no lo hace, como lo establece este colocador:

protected void setValueType(String valueType) { if (!(MessageConstants.X509v3_NS.equals(valueType)||MessageConstants.X509v1_NS.equals(valueType))) { log.log(Level.SEVERE,"WSS0342.valtype.invalid"); throw new RuntimeException("Unsupported value type: " + valueType); } this.valueType = valueType; }

La clase MessageConstants no (incluso) tiene una estática para X509PKIPathv1. Cuando ejecuto mi código, obtengo el resultado esperado:

Unsupported value type: http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509PKIPathv1

Pude ver el código fuente del legacy com.sun.xml.wss.xws-security:3.0 . A pesar de mis esfuerzos, no he encontrado el código fuente de com.sun.xml.wsit.xws-security-1.3.1 . Sin embargo, creo que el código es el mismo. Intenté ambas bibliotecas y ambas me dieron la misma excepción. Lo probé utilizando la seguridad spring-ws predeterminada y el uso de declaraciones de dependencia explícitas en ambas bibliotecas (una a la vez).

Mis preguntas:

  1. ¿Alguien ha podido usar xws-security para generar una firma X509 con un valueType de X509PKIPathv1 y un keyReferenceType directo?
  2. ¿Existen otras implementaciones de xws-security que ofrecen esto? ¿O debería considerar un enfoque completamente diferente como Wss4j?

He considerado volver a escribir BinarySecurityToken, pero eso probablemente también implicaría reescribir la firma X509 de SignatureProcessor en DSIG.


El valueType puede ser # X509v3, # X509PKIPathv1

Eso se encuentra aquí XWS-SecurityIntro4 ¿Has probado esos valores específicamente en lugar de una URL?


Problema interesante que tienes allí.

Por lo que pude decir con mi Google-fu, existe soporte para # X509PKIPathv1 en algunos proyectos (por ejemplo, XMLSec de Oracle o Open SAML ), sin embargo, no está muy extendido e incluso aplicaciones como Soap UI no lo soportan para SOAP- WS.

No solo eso, sino que otros lenguajes / frameworks tienen la misma falta de soporte, como Delphi y .NET , IBM JRE .

Lo que podría hacer, basado en este SO y especialmente este SO, es implementar su propio WebServiceTemplate / WebServiceMessageSender.