2013-10-25 2 views
19

Edit:Rampart PostDispatchVerificationHandler: InvalidSecurity - политика безопасности не найдена

Я отлажена конфигурация Rampart немного, и я теперь застрял в другой точке.

В Rampart's PostDispatchVerificationHandler выбрано исключение, поскольку заголовок безопасности не был обработан.

// If a security header is there and Rampart is engaged, it has to be processed. 
// If it is not processed, there must have been a problem in picking the policy 

SOAPHeaderBlock secHeader = getSecurityHeader(msgContext); 
if (secHeader != null && (secHeader.isProcessed() == false)) { 
    throw new AxisFault("InvalidSecurity - Security policy not found"); 
} 

Вход:

[DEBUG] [MessageContext: logID=a5012f2f13095af97123a192575c50a7f727850f3a9ecfc5] Invoking Handler 'HTTPLocationBasedDispatcher' in Phase 'Dispatch' 
[DEBUG] [MessageContext: logID=a5012f2f13095af97123a192575c50a7f727850f3a9ecfc5] Invoking Handler 'Post dispatch security verification handler' in Phase 'Dispatch' 
[ERROR] InvalidSecurity - Security policy not found 
org.apache.axis2.AxisFault: InvalidSecurity - Security policy not found 
    at org.apache.rampart.handler.PostDispatchVerificationHandler.invoke(PostDispatchVerificationHandler.java:189) 
    at org.apache.axis2.engine.Phase.invokeHandler(Phase.java:340) 
    at org.apache.axis2.engine.Phase.invoke(Phase.java:313) 
    at org.apache.axis2.engine.AxisEngine.invoke(AxisEngine.java:262) 
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:168) 
    at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:364) 
    at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:421) 
    at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229) 
    at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165) 
    at webservices.chargepoint.com.dictionary.ChargepointservicesStub.getCPNInstances(ChargepointservicesStub.java:5361) 
    at webservices.chargepoint.com.dictionary.Chargepoint.<init>(Chargepoint.java:180) 
    at webservices.chargepoint.com.dictionary.Chargepoint.main(Chargepoint.java:81) 
[DEBUG] [MessageContext: logID=a5012f2f13095af97123a192575c50a7f727850f3a9ecfc5] Invoking flowComplete() in Phase "Dispatch" 

... 

org.apache.axis2.AxisFault: InvalidSecurity - Security policy not found 
    at org.apache.rampart.handler.PostDispatchVerificationHandler.invoke(PostDispatchVerificationHandler.java:189) 
    at org.apache.axis2.engine.Phase.invokeHandler(Phase.java:340) 
    at org.apache.axis2.engine.Phase.invoke(Phase.java:313) 
    at org.apache.axis2.engine.AxisEngine.invoke(AxisEngine.java:262) 
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:168) 
    at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:364) 
    at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:421) 
    at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229) 
    at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165) 
    at webservices.chargepoint.com.dictionary.ChargepointservicesStub.getCPNInstances(ChargepointservicesStub.java:5361) 
    at webservices.chargepoint.com.dictionary.Chargepoint.<init>(Chargepoint.java:180) 
    at webservices.chargepoint.com.dictionary.Chargepoint.main(Chargepoint.java:81) 

Это заголовок безопасности:

<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" soapenv:mustUnderstand="1"> 
<wsu:Timestamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
<wsu:Created>2013-12-16T23:07:03.868Z</wsu:Created> 
<wsu:Expires>2013-12-16T23:12:03.868Z</wsu:Expires> 
</wsu:Timestamp> 
</wsse:Security> 

Это файл политики Рампарт в:

<wsp:Policy wsu:Id="UsernameToken" 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:SupportingTokens xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy"> 
     <wsp:Policy> 
      <sp:UsernameToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient"/> 
     </wsp:Policy> 
     </sp:SupportingTokens> 
    </wsp:All> 
    </wsp:ExactlyOne> 
</wsp:Policy> 

Учетные данные пользователя устанавливаются в Java код:

Options options = stubWeb._getServiceClient().getOptions(); 
try 
{ 
    options.setProperty(RampartMessageData.KEY_RAMPART_POLICY, 
         loadPolicy("policy.xml")); 
} 
catch (XMLStreamException e1) 
{ 
    // TODO Auto-generated catch block 
    e1.printStackTrace(); 
} 
options.setUserName("xxx"); 
options.setPassword("yyy"); 

stubWeb._getServiceClient().setOptions(options); 
stubWeb._getServiceClient().engageModule("rampart"); 

Оригинал сообщения:

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

Код генерируется Axis2 для SOAP веб-сервиса на основе этого WSDL: https://webservices.chargepoint.com/cp_api_4.1.wsdl

С SoapUI все работает хорошо, и я могу также получить некоторые ложные ответы с моим кодом от моего локального сервера Tomcat. При попытке подключиться к веб-сервиса с моим клиентом Java я всегда получаю эту ошибку:

org.apache.axis2.AxisFault: Must Understand check failed for header http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd : Security

Это мой код (имя пользователя и пароль скрыты):

public static void main(String[] args) 
{ 
    log4j.getRootLogger().setLevel(Level.DEBUG); 
    GetCPNInstancesResponse resp = new GetCPNInstancesResponse(); 

    ChargepointservicesStub stubWeb = null; 
    try 
    { 
     ConfigurationContext ctx = ConfigurationContextFactory.createConfigurationContextFromFileSystem("/Users/jonas/projects/workspace_openHAB/axis2-1.6.2_clean/repository", null); 
     stubWeb = new ChargepointservicesStub(ctx);  
     GetCPNInstances cpn = new GetCPNInstances();   
     SOAPFactory sfac = OMAbstractFactory.getSOAP11Factory(); 
     stubWeb._getServiceClient().engageModule("rampart"); 

     OMFactory omFactory = OMAbstractFactory.getOMFactory(); 
     OMNamespace wsseNamespace = omFactory.createOMNamespace("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wsse"); 
     OMElement omSecurityElement = omFactory.createOMElement("Security", wsseNamespace); 
//   omSecurityElement.addAttribute("soapenv:mustUnderstand", "1", null); 
//   OMNamespace soapenv = omFactory.createOMNamespace("http://schemas.xmlsoap.org/soap/envelope/", "soapenv"); 
//   omSecurityElement.addAttribute("mustUnderstand", "1", soapenv); 

     OMElement omusertoken = omFactory.createOMElement("UsernameToken", wsseNamespace); 
     OMElement omuserName = omFactory.createOMElement("Username", wsseNamespace); 
     omuserName.setText("yyy"); 
     OMElement omPassword = omFactory.createOMElement("Password", wsseNamespace); 
     omPassword.setText("xxx"); 
     omPassword.addAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText", null); 

     omusertoken.addChild(omuserName); 
     omusertoken.addChild(omPassword); 
     omSecurityElement.addChild(omusertoken); 

     SOAPHeaderBlock block = ElementHelper.toSOAPHeaderBlock(omSecurityElement, sfac); 
     block.setMustUnderstand(true); 
     stubWeb._getServiceClient().addHeader(block); 

     resp = stubWeb.getCPNInstances(cpn); 
    } catch (Exception e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

Это создает этот запрос:

[DEBUG] >> "<?xml version='1.0' encoding='UTF-8'?> 
<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"> 
     <wsse:UsernameToken> 
     <wsse:Username>yyy</wsse:Username> 
     <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">xxx</wsse:Password> 
     </wsse:UsernameToken> 
    </wsse:Security> 
    </soapenv:Header> 
    <soapenv:Body> 
    <ns1:getCPNInstances xmlns:ns1="urn:dictionary:com.chargepoint.webservices" /> 
    </soapenv:Body> 
</soapenv:Envelope>" 

Точный же запрос работает с soapUI.

Я также получить правильный ответ на сервер с моим кодом:

<?xml version='1.0' encoding='utf-8'?> 
<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:Created>2013-10-25T16:54:30.767Z</wsu:Created> 
      <wsu:Expires>2013-10-25T16:59:30.767Z</wsu:Expires></wsu:Timestamp> 
     </wsse:Security> 
    </soapenv:Header> 
    <soapenv:Body> 
     <ns1:getCPNInstancesResponse xmlns:ns1="urn:dictionary:com.chargepoint.webservices"> 
      <CPN> 
       <cpnID>1</cpnID> 
       <cpnName>USA</cpnName> 
       <cpnDescription>ChargePoint Operations</cpnDescription> 
      </CPN> 
      <CPN> 
       <cpnID>2</cpnID> 
       <cpnName>EU</cpnName> 
       <cpnDescription>ChargePoint Europe</cpnDescription> 
      </CPN> 
      <CPN> 
       <cpnID>3</cpnID> 
       <cpnName>AU</cpnName> 
       <cpnDescription>ChargePoint Australia</cpnDescription> 
      </CPN> 
     </ns1:getCPNInstancesResponse> 
    </soapenv:Body> 
</soapenv:Envelope> 

Но тогда модуль безопасности портит что-то.

Это часть журнала отладки:

[DEBUG] XMLStreamWriter is org.apache.axiom.util.stax.dialect.WoodstoxStreamWriterWrapper 
[DEBUG] Calling MTOMXMLStreamWriter.flush 
[DEBUG] forceExpand: expanding element {http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}Security 
[DEBUG] forceExpand stack java.lang.Exception: Debug Stack Trace  
at org.apache.axiom.om.impl.llom.OMSourcedElementImpl.forceExpand(OMSourcedElementImpl.java:264)  
at org.apache.axiom.om.impl.llom.OMSourcedElementImpl.getAttribute(OMSourcedElementImpl.java:416) 
at org.apache.axiom.soap.impl.llom.SOAPHeaderBlockImpl.setAttribute(SOAPHeaderBlockImpl.java:91)  
at org.apache.axiom.soap.impl.llom.soap11.SOAP11HeaderBlockImpl.setMustUnderstand(SOAP11HeaderBlockImpl.java:105) 
at chargepoint.com.dictionary.Chargepoint.main(Chargepoint.java:74) 

Когда я использую

omSecurityElement.addAttribute("soapenv:mustUnderstand", "1", null);

вместо

block.setMustUnderstand(true);

Исключение выше ушла, и я получаю эту ошибку:

[DEBUG] serialize OutputStream optimisation: false [DEBUG] getReader [DEBUG] 
XMLStreamReader is org.apache.axiom.util.stax.dialect.WoodstoxStreamReaderWrapper 
org.apache.axiom.om.OMException: com.ctc.wstx.exc.WstxParsingException: Undeclared namespace prefix "soapenv" (for attribute "mustUnderstand") at [row,col {unknown-source}]: [1,137] 
at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:296) 
at org.apache.axiom.om.impl.llom.OMDocumentImpl.buildNext(OMDocumentImpl.java:153) 
at org.apache.axiom.om.impl.llom.OMDocumentImpl.getFirstOMChild(OMDocumentImpl.java:242) 
at org.apache.axiom.om.impl.llom.OMDocumentImpl.getChildren(OMDocumentImpl.java:204) 

С этим кодом ошибка исчезла, но проблема остается.

OMNamespace soapenv = omFactory.createOMNamespace("http://schemas.xmlsoap.org/soap/envelope/", "soapenv"); 
omSecurityElement.addAttribute("mustUnderstand", "1", soapenv); 

Это наиболее интересные детали из журнала отладки:

[DEBUG] [MessageContext: logID=ca3f0db9a4fb557a33edc579a48f31508ff1f2b457c617f6] Invoking phase "Security" 
[DEBUG] [MessageContext: logID=ca3f0db9a4fb557a33edc579a48f31508ff1f2b457c617f6] Invoking Handler 'SecurityOutHandler' in Phase 'Security' 
[DEBUG] WSDoAllReceiver: enter invoke() 
[DEBUG] Signature crypto property file is not set. Property file key - signaturePropFile 
[DEBUG] Signature crypto property file is not set. Property file key - signaturePropFile 
[DEBUG] WSDoAllReceiver: exit invoke() 

... 

[DEBUG] [MessageContext: logID=ba3f0db9a4fb557a33edc579a48f31508ff1f2b457c617f6] Checking post-conditions for phase "OperationInPhase" 
[DEBUG] MustUnderstand header not processed or registered as understood{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}Security 
[DEBUG] org.apache.axis2.i18n.resource::handleGetObject(mustunderstandfailed) 
[ERROR] Must Understand check failed for header http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd : Security 
org.apache.axis2.AxisFault: Must Understand check failed for header http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd : Security 
    at org.apache.axis2.engine.AxisEngine.checkMustUnderstand(AxisEngine.java:105) 

Здесь вы можете увидеть весь журнал отладки: https://drive.google.com/file/d/0B_iw7qzMyYhOSDNEMW5oOHgzY0k/edit?usp=sharing

Если у вас есть какие-либо советы, как решить эту проблему, я был бы очень благодарен.

+1

Я угадал h_t_t_p вместо HTTP не опечатка, а потому, что вы слишком низкую репутацию, чтобы иметь возможность размещать links =) –

+0

Подключен ли ваш валовой модуль к клиенту? Не могли бы вы опубликовать содержимое файла политики валового сервера? – vzamanillo

+0

Привет, Rampart обращается к клиенту, и я также добавил файл политики к моему вопросу. – Jonas

ответ

1

Признаюсь, я не знаком с этими технологиями, но я нашел Javadoc для SOAPHeaderBlock.setProcessed интересных:.

"Мы должны знать, все ли заголовки MustUnderstand были обработаны узлом Это будет сделано путем для этого все обработчики, которые обрабатывают определенный блок заголовка, должны явно сказать, что он обрабатывает [sic] заголовок, вызывая setProcessed() «

Так что, возможно, что-то подобное произойдет?

SOAPHeaderBlock block = ElementHelper.toSOAPHeaderBlock(omSecurityElement, sfac); 
block.setProcessed(); 

Другая возможность можно найти here, где плакат изменяет содержимое файла конфигурации Rampart META-INF/module.xml, добавив следующее:

<InFaultFlow> 
    <handler name="PolicyBasedSecurityInHandler" class="org.apache.rampart.handler.RampartReceiver"> 
     <order phase="Security" phaseFirst="true"/> 
    </handler> 
    <handler name="SecurityInHandler" class="org.apache.rampart.handler.WSDoAllReceiver"> 
     <order phase="Security"/> 
    </handler> 
    <handler name="PostDispatchVerificationHandler" class="org.apache.rampart.handler.PostDispatchVerificationHandler"> 
     <order phase="Dispatch" phaseLast="true"/> 
    </handler> 
</InFaultFlow> 

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

Удачи.

+0

Спасибо за ваш вклад!Второе решение не помогло, к сожалению, но теперь я застрял в том месте, которое, как вы подозревали, ошибается в первую очередь. Вы предлагаете изменить исходный код Rampart или Axis или как вы перехватите ответ сервера? – Jonas

+0

Как я уже сказал, я немного выхожу из своей глубины и просто бросаю вещи туда. Я определенно не думаю, что вы должны изменить источник, но проверьте конфигурацию [здесь] (http://www.javaranch.com/journal/200709/Journal200709.jsp#a3). Обратите внимание на различные конфигурации. Кроме того, по моим наблюдениям, эта ошибка может произойти, если что-то глупое похоже на попытку доступа к неправильному URL. Поэтому убедитесь, что все настроено так, как вы ожидаете, - эквивалент «Убедитесь, что машина подключена» от технической поддержки. – Vidya

1

Это не может быть решением проблемы. У меня была такая же ситуация, когда я использовал заглушку, созданную с помощью инструмента wsdl2java. Заголовки безопасности не были включены, когда я отправляю запросы. Поэтому я создал запрос с использованием класса ServiceClient, а затем импортировал политику. Это выглядит вещь, как это

ConfigurationContext ctx = ConfigurationContextFactory.createConfigurationContextFromFileSystem("clientrepo", null); 

ServiceClient sc = new ServiceClient(ctx, null); 
sc.engageModule("rampart"); 

     // create option object 
Options opts = new Options(); 
     // setting target EPR 
opts.setTo(new EndpointReference(serviceUrl); 

opts.setAction("urn:something"); 

try { 
    opts.setProperty(RampartMessageData.KEY_RAMPART_POLICY, 
          loadPolicy("policy.xml")); 
    } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
    } 
sc.setOptions(opts); 
OMElement res = sc.sendReceive(payload); 

И загрузить политику

public Policy loadPolicy(String xmlPath) throws Exception { 

    StAXOMBuilder builder = new StAXOMBuilder(xmlPath); 
    Policy policy = PolicyEngine.getPolicy(builder.getDocumentElement()); 

    RampartConfig rc = new RampartConfig(); 
    rc.setUser(username); 
    rc.setPwCbClass(PWDCallBackHandler.class.getName()); 

    CryptoConfig sigCryptoConfig = new CryptoConfig(); 
    sigCryptoConfig.setProvider("org.apache.ws.security.components.crypto.Merlin"); 

    Properties prop1 = new Properties(); 
    prop1.put("org.apache.ws.security.crypto.merlin.keystore.type", "JKS"); 
    prop1.put("org.apache.ws.security.crypto.merlin.file", AppConstants.KEYSTORE); 
    prop1.put("org.apache.ws.security.crypto.merlin.keystore.password", 
       password); 
    sigCryptoConfig.setProp(prop1); 

    rc.setSigCryptoConfig(sigCryptoConfig); 
    policy.addAssertion(rc); 
    return policy; 
} 
Смежные вопросы