Задать вопрос
  • Как создать Web сервис на технологии CXF с WS-Security?

    @crowar Автор вопроса
    Разработчик ну что тут ещё сказать =)
    Для создания сервиса, пришлось изучить документацию от апача, в целом как оказалось все не так сложно.
    Для начала создал обычные сервисы на CXF, затем сохранил WSDL файл и начал его править.
    В блок wsdl:binding добавил блок
    <wsp:PolicyReference URI="#SecurityServiceSignThenEncryptPolicy"/>

    и в wsdl:definitions
    <wsp:Policy wsu:Id="SecurityServiceSignThenEncryptPolicy"
                    xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
            <wsp:ExactlyOne>
                <wsp:All>
                    <sp:AsymmetricBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
                        <wsp:Policy>
                            <sp:InitiatorToken>
                                <wsp:Policy>
                                    <sp:X509Token
                                            sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient">
                                        <wsp:Policy>
                                            <sp:WssX509V1Token11/>
                                        </wsp:Policy>
                                    </sp:X509Token>
                                </wsp:Policy>
                            </sp:InitiatorToken>
                            <sp:RecipientToken>
                                <wsp:Policy>
                                    <sp:X509Token
                                            sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/Never">
                                        <wsp:Policy>
                                            <sp:WssX509V1Token11/>
                                        </wsp:Policy>
                                    </sp:X509Token>
                                </wsp:Policy>
                            </sp:RecipientToken>
                            <sp:AlgorithmSuite>
                                <wsp:Policy>
                                    <sp:TripleDesRsa15/>
                                </wsp:Policy>
                            </sp:AlgorithmSuite>
                            <sp:Layout>
                                <wsp:Policy>
                                    <sp:Lax/>
                                </wsp:Policy>
                            </sp:Layout>
                            <sp:IncludeTimestamp/>
                            <sp:EncryptSignature/>
                            <sp:OnlySignEntireHeadersAndBody/>
                            <sp:SignBeforeEncrypting/>
                        </wsp:Policy>
                    </sp:AsymmetricBinding>
                    <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
                        <sp:Body/>
                    </sp:SignedParts>
                    <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
                        <sp:Body/>
                    </sp:EncryptedParts>
                    <sp:Wss10 xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
                        <wsp:Policy>
                            <sp:MustSupportRefIssuerSerial/>
                        </wsp:Policy>
                    </sp:Wss10>
                </wsp:All>
            </wsp:ExactlyOne>
        </wsp:Policy>


    После этого создал пары ключей
    keytool -genkey -keyalg RSA -sigalg SHA1withRSA -validity 730 -alias myservicekey -keypass skpass -storepass sspass -keystore serviceKeystore.jks -dname "cn=localhost"
    keytool -genkey -keyalg RSA -sigalg SHA1withRSA -validity 730 -alias myclientkey  -keypass ckpass -storepass cspass -keystore clientKeystore.jks -dname "cn=clientuser"
    
    keytool -export -rfc -keystore clientKeystore.jks -storepass cspass -alias myclientkey -file MyClient.cer
    keytool -export -rfc -keystore serviceKeystore.jks -storepass sspass -alias myservicekey -file MyService.cer
    
    keytool -import -trustcacerts -keystore serviceKeystore.jks -storepass sspass -alias myclientkey -file MyClient.cer -noprompt
    keytool -import -trustcacerts -keystore clientKeystore.jks -storepass cspass -alias myservicekey -file MyService.cer -noprompt


    После этого оставалось только все настроить и собрать в одну кучу.
    Создаем файл с настройками server.properties в него помешаем следующие настройки
    org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin
    org.apache.ws.security.crypto.merlin.keystore.type=jks
    org.apache.ws.security.crypto.merlin.keystore.password=sspass
    org.apache.ws.security.crypto.merlin.keystore.alias=myservicekey
    org.apache.ws.security.crypto.merlin.file=serviceKeystore.jks

    На реализацию интерфейса добавляем несколько аннотаций
    @EndpointProperties(value = {
            @EndpointProperty(key = SecurityConstants.SIGNATURE_PROPERTIES, value = "server.properties"),
            @EndpointProperty(key = SecurityConstants.ENCRYPT_PROPERTIES, value = "server.properties"),
            @EndpointProperty(key = SecurityConstants.SIGNATURE_USERNAME, value = "myservicekey"),
            @EndpointProperty(key = SecurityConstants.ENCRYPT_USERNAME, value = "myclientkey"),
            @EndpointProperty(key = SecurityConstants.CALLBACK_HANDLER, value = "org.company.wsse.handler.KeystorePasswordCallback")
    })
    @WebService(portName = "hwPort",
            serviceName = "hw",
            wsdlLocation = "WEB-INF/wsdl/hw.wsdl",
            targetNamespace = "http://wsssampl.company.org/",
            endpointInterface = "org.company.wsse.IHelloWorld")
    public class HelloWorldImpl implements IHelloWorld {
    }


    После этого остается только создать клиента и радоваться.
    Привет рабочего сервиса и клиента взять тут https://github.com/crowar/cxf-ws-security
    Ответ написан
    Комментировать