2016-05-13 39 views
-1

我們試圖使用CXF向IRS發送簽名的,部分加密的SOAP消息。我們認爲我們正在遵循他們的所有指示,但有些含糊不清。一些Signature和Encryption屬性可以通過幾種方式設置,但我嘗試過的所有排列都沒有讓我們通過可怕的「TPE1122」錯誤(WS Security Header invalid)。如果有人成功地做到了這一點,是否有一些我們未能設置的屬性?我特別不確定加密算法的設置,以及整個元素是否應該被加密,或者只是其中的3個頭元素。謝謝。是否正確設置了這些cxf/ws-security屬性? (獲得TPE1122錯誤,「WS安全頭無效」)

BulkRequestTransmitterService ss = new BulkRequestTransmitterService(wsdlURL, SERVICE_NAME); 
    BulkRequestTransmitterPortType port = ss.getBulkRequestTransmitterPort(); 

    org.apache.cxf.endpoint.Client client = ClientProxy.getClient(port); 

    // set up MTOM 
    Binding binding = ((BindingProvider)port).getBinding(); 
    ((SOAPBinding)binding).setMTOMEnabled(true); 

    // set output properties 
    Map<String, Object> outProps = new HashMap<String, Object>(); 
    outProps.put("action", "Timestamp Signature Encrypt"); 
    outProps.put("passwordType", "PasswordDigest"); 
    outProps.put("signatureUser", "[REDACTED]"; 
    outProps.put(WSHandlerConstants.SIG_KEY_ID, "X509KeyIdentifier"); 
    outProps.put("passwordCallbackClass", "UTPasswordCallback"); 
    outProps.put("encryptionUser", "irs"); 
    outProps.put("encryptionPropFile", "encryption.properties"); 
    outProps.put("encryptionKeyIdentifier", "DirectReference"); 
    outProps.put("encryptionKeyTransportAlgorithm", "http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p"); 

    // ENC_SYM_ALGO: what is the default? what should correct value be? and are these two lines equivalent? 
    outProps.put(WSHandlerConstants.ENC_SYM_ALGO, WSConstants.TRIPLE_DES); 
    outProps.put("encryptionSymAlgorithm", "http://www.w3.org/2001/04/xmlenc#tripledes-cbc"); 

    // do we encrypt each of the three signed headers, or entire Signature element? have tried it both ways 
    outProps.put("encryptionParts", 
     //"{Element}{" + WSU_NS + "}Timestamp;" 
     //+"{Element}{urn:us:gov:treasury:irs:ext:aca:air:7.0}ACATransmitterManifestReqDtl;" 
     //+"{Element}{urn:us:gov:treasury:irs:ext:aca:air:7.0}ACABusinessHeader;"); 
     "{Element}{http://www.w3.org/2000/09/xmldsig#}Signature;"); 

    outProps.put("signaturePropFile", "signature.properties"); 
    outProps.put("signatureAlgorithm", "http://www.w3.org/2000/09/xmldsig#rsa-sha1"); 
    outProps.put("signatureParts", 
      "{Element}{" + WSU_NS + "}Timestamp;" 
      + "{Element}{urn:us:gov:treasury:irs:ext:aca:air:7.0}ACATransmitterManifestReqDtl;" 
      + "{Element}{urn:us:gov:treasury:irs:ext:aca:air:7.0}ACABusinessHeader;"); 
    outProps.put(WSHandlerConstants.SIG_C14N_ALGO, "http://www.w3.org/2001/10/xml-exc-c14n#WithComments"); 

    // is "Direct Reference" preferable? have tried it both ways 
    outProps.put(WSHandlerConstants.ENC_KEY_ID, "X509KeyIdentifier"); 

    outProps.put("timeToLive", "600"); // = 10 min 
    outProps.put(WSHandlerConstants.MUST_UNDERSTAND, "false"); 

    WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps); 
    client.getOutInterceptors().add(wssOut); 

    // add gzip interceptor 
    GZIPOutInterceptor gz = new GZIPOutInterceptor(); 
    gz.setForce(true); 
    client.getOutInterceptors().add(gz); 

    [ create & populate Manifest Detail here] 

    Header detailHeader = new Header(new QName("urn:us:gov:treasury:irs:ext:aca:air:7.0", "ACATransmitterManifestReqDtl"), aCATrnsmtManifestReqDtlType, 
      new JAXBDataBinding(ACATrnsmtManifestReqDtlType.class)); 
    headers.add(detailHeader); 

    Header businessHeader = new Header(new QName("urn:us:gov:treasury:irs:ext:aca:air:7.0", "ACABusinessHeader"), aCABulkBusinessHeaderRequestType, 
            new JAXBDataBinding(ACABulkBusinessHeaderRequestType.class)); 
    headers.add(businessHeader); 

    // add headers to Request 
    client.getRequestContext().put(Header.HEADER_LIST, headers); 

    // add namespaces: 
    Map<String, String> nsMap = new HashMap<>(); 
    nsMap.put("soapenv", "http://schemas.xmlsoap.org/soap/envelope/"); 
    nsMap.put("urn", "urn:us:gov:treasury:irs:ext:aca:air:7.0"); 
    nsMap.put("urn1", "urn:us:gov:treasury:irs:common");   
    nsMap.put("urn2", "urn:us:gov:treasury:irs:msg:acabusinessheader"); 
    nsMap.put("urn3", "urn:us:gov:treasury:irs:msg:irsacabulkrequesttransmitter"); 
    nsMap.put("urn4", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"); 
    client.getRequestContext().put("soap.env.ns.map", nsMap); 

    // then transmit, get TPE1122 error in Response 
+0

如果您正在與IRS ACA服務接口,則必須非常小心。您需要查看他們提供給您的模式,因爲他們所做的是覆蓋衆所周知的ws安全模式。許多運行時不會讓你這樣做,你最終不得不推出自己的產品。你必須確保你有一切正確的順序來完全匹配他們重寫的wssec模式,它們不一定符合我們習慣的。沒有更多,沒有更多。從我一起工作過的每個人,都需要很多工作才能做到最好。 –

回答

1

CXF安全中的Bulit在IRS提交中不起作用。您需要爲攔截器編寫符合IRS要求的代碼。

我有一個示例項目準備好了,它可以提交和狀態請求。這絕不是一個產品代碼,但也可以是一個起點

https://github.com/sangramjadhav/irsclient

請參閱application.yml文件。您需要提供密鑰庫和其他配置以提交給IRS

0

感謝兩位響應者的反饋意見。我們現在開始工作,主要問題是我們不應該使用加密。我發佈的示例中的所有內容都工作過(包括使用CXF簽署標頭的某些部分),但加密必須刪除。

傳輸到IRS AIR系統時,確保所有事情都確實相當困難。下一個障礙是通過更改wsdl生成的文件之一中的名稱空間解決的,然後它通過了,但是他們的Linux系統的文件大小值比我們的Windows系統的值小2個字符 - 罪魁禍首是最後的CRLF。

如果有人像我們一樣嘗試使用Java,Apache-CXF和Windows來做這件事,我會很樂意回答具體的問題。

相關問題