簡體   English   中英

使用CXF和WSS4J創建信封簽名

[英]Create Enveloped Signature with CXF and WSS4J

目前,我正在Apache CXF的幫助下以Java創建SOAP客戶端。

我已經從給定的WSDL生成了Service類,並以編程方式配置了客戶端。(請明確地說,我沒有使用Spring配置)。

我正在調用的服務要求我發送的每個請求都需要簽名。

到目前為止,我所做的是創建我的客戶端並添加WSS4JOutInterceptor以便對消息進行簽名。

Client client = ClientProxy.getClient(soapService.getRawSoapInterface());

//Actually not sure if this is really needed?
QName signatureQName = new QName("http://www.w3.org/2000/09/xmldsig#", "Signature");
Map<String, Object> properties = new HashMap<String, Object>();
Map<QName, Object> processorMap = new HashMap<QName, Object>();
processorMap.put(WSSecurityEngine.SIGNATURE, signatureQName);
properties.put("wss4j.processor.map", processorMap);
properties.put(WSHandlerConstants.USER, "clientSignatureAlias");
properties.put(WSHandlerConstants.PW_CALLBACK_CLASS, MyPwCallback.class.getName());
properties.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
properties.put(WSHandlerConstants.ACTION, WSHandlerConstants.SIGNATURE);
properties.put(WSHandlerConstants.SIG_PROP_FILE, "client.properties");
properties.put(WSHandlerConstants.ENC_KEY_ID, "X509KeyIdentifier");

WSS4JOutInterceptor wssOutInterceptor = new WSS4JOutInterceptor(properties);

我的client.properties包含:

org.apache.wss4j.crypto.provider=org.apache.wss4j.common.crypto.Merlin
org.apache.wss4j.crypto.merlin.keystore.type=jks
org.apache.wss4j.crypto.merlin.keystore.password=secret
org.apache.wss4j.crypto.merlin.keystore.alias=cert_sig
org.apache.wss4j.crypto.merlin.keystore.file=clientCerts.jks

到目前為止一切順利,每個消息都已簽名。

讓我們來解決這個問題:問題是,攔截器正在將這些安全頭放入Soap-Request中。

<SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" 
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" soap:mustUnderstand="1">

起初我不是他們,第二點是我正在呼叫的服務不了解他們,因此正在例外地回答。

目前,我找不到辦法避免這種情況,有什么建議嗎?

據我了解,WSS4J根本無法創建信封簽名!

因此,我轉向了另一個方向。 我使用Apache Santuario來為我的消息創建一個簽名。

我使用CXF的Intercepor機制創建了自己的攔截器,此處提供了該用例的抽象類: 如何修改出站CXF請求的Raw XML消息?

在這里,我能夠調用Santuario STAX-API來創建有效的簽名,下面的博客對此進行了很好的描述: http : //coheigea.blogspot.ie/2014/03/apache-santuario-xml-security-for -java.html

由於我對請求進行了進一步的修改,因此我能夠修改原始String。

謝天謝地,SOAP是標准化的協議,每個人都在做他想做的...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM