Как получить информацию о сертификате в WebServiceTemplate? - PullRequest
0 голосов
/ 02 ноября 2018

Я хочу получить свойство Common Name (CN) из сертификата клиента в связи SOAP. Я использую Spring WebServiceTemplate для создания моей конечной точки веб-сервиса. Я уже реализовал взаимную аутентификацию WS, следуя примеру .

Есть ли какое-либо решение для получения сведений о сертификате из запроса клиента с помощью WebServiceTemplate или какой-либо другой библиотеки?

1 Ответ

0 голосов
/ 07 ноября 2018

К счастью, мне удалось это выяснить! 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.

...