@crowar
Разработчик ну что тут ещё сказать =)

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

Час добрый.

Возникла ситуация когда авторизация на веб сервере нужна по сертификату. Начал смотреть в сторону WS-Security, но что-то не могу нормально запустить сервисы.
Используются технологии: Spring, Apache CXF
Все это дело стартует на JBoss (WildFly 8.2.0)

Может кто-то встречал адекватную документацию или пример по данной теме?
Метод WSDL-First как-то не очень охота использовать, много чего придется ломать.
  • Вопрос задан
  • 1345 просмотров
Решения вопроса 1
@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
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы