К счастью, мне удалось это выяснить!
Spring WS предоставляет очень удобный способ получения сертификата X509.
Обычно у вас есть конечная точка, подобная этой:
@Endpoint
public class CountryEndpoint {
private static final String NAMESPACE_URI = "http://spring.io/guides/gs-producing-web-service";
...
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "getCountryRequest")
@ResponsePayload
public GetCountryResponse getCountry(@RequestPayload GetCountryRequest request) {
//method body here
return response;
}
}
Однако Spring позволяет добавлять дополнительные параметры методом, аннотированным как @ PayloadRoot . Это может быть MessageContext экземпляр.
public GetCountryResponse getCountry(@RequestPayload MessageContext context, @RequestPayload GetCountryRequest request)`
Тогда Вы сможете получить заголовок wsse:Security
следующим образом:
WebServiceMessage webServiceMessageRequest = context.getRequest();
SaajSoapMessage saajSoapMessage = (SaajSoapMessage) webServiceMessageRequest;
SOAPMessage doc = saajSoapMessage.getSaajMessage();
Element elem = WSSecurityUtil.getSecurityHeader(doc.getSOAPPart(), "");
Теперь получите правильное содержимое тега BinarySecurityToken
:
String binarySecurityToken = elem.getElementsByTagName("BinarySecurityToken").item(0).getTextContent();
В конце вы должны воссоздать X509Certificate, передав в качестве параметра конструктора binarySecurityToken. Позже вы можете извлечь CN разными способами, например, с помощью LDAP utlis.