Axis 2 и Rampart — почему служба возвращает заголовок wsse: Security в запросе?

Я подключаюсь к защищенному сервису.

У меня есть проект пользовательского интерфейса SOAP, настроенный на использование файла jks для предоставления сертификата вместе с соответствующими настройками безопасности, чтобы я мог получить действительный ответ.

Я использовал AXIS 2 и Rampart для создания запроса SOAP из проекта JAVA. Используя TCPMon, мне удалось получить запрос SOAP.

Когда запрос выполняется в проекте JAVA, я просто получаю ответ:

org.apache.axis2.AxisFault: отсутствует заголовок wsse:Security в запросе

но если я возьму тот же запрос, захваченный в TCPMon, и помещу его в проект пользовательского интерфейса SOAP, я успешно получу ответ.

У кого-нибудь есть идеи?

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">  <soapenv:Header>  
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"  
soapenv:mustUnderstand="1">  
  <wsu:Timestamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"  
  wsu:Id="Timestamp-1">  
    <wsu:Created>2012-06-01T15:09:12.520Z</wsu:Created>  
    <wsu:Expires>2012-06-01T15:14:12.520Z</wsu:Expires>  
  </wsu:Timestamp>  
  <wsse:BinarySecurityToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"  
  EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary"  
  ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"  
  wsu:Id="CertId-ECDB0E....01">  
  MIID4DCCA0mgAwIBAgIBFjAN....</wsse:BinarySecurityToken>  
  <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"  
  Id="Signature-2">  
    <ds:SignedInfo>  
      <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />  
      <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />  
      <ds:Reference URI="#Id-15..93">  
        <ds:Transforms>  
          <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />  
        </ds:Transforms>  
        <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />  
        <ds:DigestValue>  
        3wgvhJ8SI2soC..IA=</ds:DigestValue>  
      </ds:Reference>  
      <ds:Reference URI="#Timestamp-1">  
        <ds:Transforms>  
          <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />  
        </ds:Transforms>  
        <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />  
        <ds:DigestValue>  
        VlzDT69YEl..qTlbj0=</ds:DigestValue>  
      </ds:Reference>  
    </ds:SignedInfo>  
    <ds:SignatureValue>  
    ZCRypw/..=</ds:SignatureValue>  
    <ds:KeyInfo Id="KeyId-ECD..2">  
      <wsse:SecurityTokenReference xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"  
      wsu:Id="STRId-ECDB0E6..6193">  
        <wsse:Reference URI="#CertId-ECDB0E..01"  
        ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" />  
      </wsse:SecurityTokenReference>  
    </ds:KeyInfo>  
  </ds:Signature>  
</wsse:Security></soapenv:Header><soapenv:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="Id-15..3"><ns2:ProductSearchV2Request xmlns:ns2="http://product.webservice.sxc.com">   
  <ns2:Strength>900</ns2:Strength>  
  <ns2:MaximumResultSetInd>true</ns2:MaximumResultSetInd>  
  <ns2:MaximumResultSet>100</ns2:MaximumResultSet>  
</ns2:ProductSearchV2Request>  


Это документ WS-POLICY, который я использую:

<?xml version="1.0" encoding="UTF-8"?>  
<!--  
 !  
 ! Copyright 2006 The Apache Software Foundation.  
 !  
 ! Licensed under the Apache License, Version 2.0 (the "License");  
 ! you may not use this file except in compliance with the License.  
 ! You may obtain a copy of the License at  
 !  
 !      http://www.apache.org/licenses/LICENSE-2.0  
 !  
 ! Unless required by applicable law or agreed to in writing, software  
 ! distributed under the License is distributed on an "AS IS" BASIS,  
 ! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
 ! See the License for the specific language governing permissions and  
 ! limitations under the License.  
 !-->  
<wsp:Policy wsu:Id="SigOnly"  
            xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"  
            xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">  
    <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:RequireThumbprintReference/>  
                                    <sp:WssX509V3Token10/>  
                                </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:RequireThumbprintReference/>  
                                    <sp:WssX509V3Token10/>  
                                </wsp:Policy>  
                            </sp:X509Token>  
                        </wsp:Policy>  
                    </sp:RecipientToken>  
                    <sp:AlgorithmSuite>  
                        <wsp:Policy>  
                            <sp:TripleDesRsa15/>  
                        </wsp:Policy>  
                    </sp:AlgorithmSuite>  
                    <sp:Layout>  
                        <wsp:Policy>  
                            <sp:Strict/>  
                        </wsp:Policy>  
                    </sp:Layout>  
                    <sp:IncludeTimestamp/>  
                    <sp:OnlySignEntireHeadersAndBody/>  
                </wsp:Policy>  
            </sp:AsymmetricBinding>  
            <sp:Wss10 xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">  
                <wsp:Policy>  
                    <sp:MustSupportRefKeyIdentifier/>  
                    <sp:MustSupportRefIssuerSerial/>  
                </wsp:Policy>  
            </sp:Wss10>  
            <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">  
                <sp:Body/>  
            </sp:SignedParts>  
            <ramp:RampartConfig xmlns:ramp="http://ws.apache.org/rampart/policy">  
                <ramp:user>ctr</ramp:user>  
                <ramp:encryptionUser>ctr</ramp:encryptionUser>  
                <ramp:passwordCallbackClass>com.gtnet.rampart.PWCBHandler  
                </ramp:passwordCallbackClass>  

                <ramp:signatureCrypto>  
                    <ramp:crypto provider="org.apache.ws.security.components.crypto.Merlin">  
                        <ramp:property name="org.apache.ws.security.crypto.merlin.keystore.type">JKS</ramp:property>  
                        <ramp:property name="org.apache.ws.security.crypto.merlin.file">build\resources\qa.jks</ramp:property>  
                        <ramp:property name="org.apache.ws.security.crypto.merlin.keystore.password">123123</ramp:property>  
                    </ramp:crypto>  
                </ramp:signatureCrypto>  
            </ramp:RampartConfig>  

        </wsp:All>  
    </wsp:ExactlyOne>  
</wsp:Policy>  

Спасибо Алан


person Gribbler    schedule 01.06.2012    source источник
comment
Я начинаю подозревать, что это может быть как-то связано с реакцией. Я пытался использовать wireshark для проверки HTTP-запроса, но, поскольку он зашифрован и у меня нет закрытого ключа, я не могу найти способ подтвердить, что отправляется и принимается из приложения Java. Запрос сверху был перехвачен с помощью TCPMon и направлен на локальный http-порт.   -  person Gribbler    schedule 05.06.2012


Ответы (3)


Похоже, что ошибка не с исходящим запросом, а с обработкой ответа. В ответе нет заголовка безопасности, и когда мы пытаемся его расшифровать, возникает исключение.

Мне нужно каким-то образом изменить конфигурацию Rampart, чтобы обеспечить безопасность только для исходящего трафика, а не для входящего.

Я отчитаюсь :)


Хорошо, проблема была в том, что когда Rampart задействован, он ожидает, что ответ будет иметь тот же заголовок безопасности. Я решил проблему, удалив обработчик безопасности Inflow в файле Rampart.mar.

Я не уверен, что это лучшее решение, но оно сработало для нас.

Чтобы удалить обработчик притока: Распакуйте файл Rampart.mar.

Закомментируйте раздел Inflow

Заархивируйте папку META_INF. Затем переименуйте файл .zip в .mar.

Теперь, когда вы используете это, поскольку для притока не определены обработчики, он просто будет использовать стандартный обработчик ответов Axis2.

Я предполагаю, что если бы у вас было несколько проектов, использующих Rampart, где у некоторых был заголовок безопасности в ответе, а у некоторых нет, вам нужен был бы другой подход.


Другой подход подробно описан здесь. Вероятно, это лучший подход:

http://blog.rampartfaq.com/2009/11/how-to-generate-non-secure-response-to.html

Исключение:

org.apache.axis2.AxisFault: отсутствует заголовок wsse:Security в запросе на org.apache.rampart.handler.RampartReceiver.setFaultCodeAndThrowAxisFault(RampartReceiver.java:180) на org.apache.rampart.handler.RampartReceiver.invoke(RampartReceiver.java :99) в org.apache.axis2.engine.Phase.invoke(Phase.java:318) в org.apache.axis2.engine.AxisEngine.invoke(AxisEngine.java:251) в org.apache.axis2.engine. AxisEngine.receive(AxisEngine.java:160) в org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:364) в org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:417) в org .apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229)

person Gribbler    schedule 05.06.2012

После долгих поисков и чтения одних и тех же страниц несколько раз я наконец нашел решение, которое меня удовлетворило.

Из предыдущего поста я цитирую: «Хорошо, проблема была в том, что когда Rampart задействован, он ожидает, что ответ будет иметь тот же заголовок безопасности». (как просьба) Это абсолютно верно!

Я считаю, что лучший подход можно найти по следующей ссылке: http://xacmlinfo.org/2012/11/09/disabling-ws-security-for-in-or-out-messages-in-axis2/

Однако в моем случае я не хотел создавать новый модуль, поэтому решил эмулировать модуль в своем коде. Я попытался объяснить это в три шага.

  1. (Во-первых) я использовал политику по умолчанию (взять из предыдущей ссылки) в качестве метода в моем коде. (Это работает для Axis 1.6.2 и совместимой версии Rampart)

частная строка getPolicy () {возврат «xml для политики» }

Важно: метод должен возвращать следующий xml в виде строки (лучшее чтение)

<wsp:Policy wsu:Id="emptryPolicy" 
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsp:ExactlyOne>
<wsp:All>
<sp:TransportBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy"> 
<wsp:Policy>
</wsp:Policy>
</sp:TransportBinding>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
  1. (Второе) Я создал политику (объект) на основе предыдущего метода.

Поток InputStream = новый ByteArrayInputStream(getPolicy().getBytes());

Политика p = PolicyEngine.getPolicy(stream);

  1. (Третий) Я использовал свойства KEY_RAMPART_IN_POLICY и KEY_RAMPART_OUT_POLICY.

Stub._getServiceClient().getOptions().setProperty(RampartMessageData.KEY_RAMPART_OUT_POLICY, политика безопасности веб-службы);

Stub._getServiceClient().getOptions().setProperty(RampartMessageData.KEY_RAMPART_IN_POLICY, p);

Важно Политика безопасности веб-службы зависит от безопасности, которую использует веб-служба... Если бы ваш провайдер предоставил политику в wsdl, вам не пришлось бы с этим бороться... но в других случаях вы просто используете политики Rampart. На сайте валов очень четко описаны примеры для каждого типа политики безопасности. (Аутентификация UsernameToken, асимметричная привязка и т. д.)

В этом примере создается запрос с защитой и ответ без защиты. Меня устраивает!

person JippyJoe    schedule 08.10.2019

В моем случае та же проблема, но я получил успешный ответ, изменив uri пространства имени версии запроса мыла в заглушке. я изменил uri пространства имен с "http://www.w3.org/2003/05/soap-envelope" на "http://schemas.xmlsoap.org/soap/envelope/".

person user5359099    schedule 21.09.2015
comment
Это является спецификацией, которую использует OP. - person Jan Doggen; 21.09.2015