Java 将数字签名cxf wss4j中的X509证书标记值转换为base64二进制编码

Java 将数字签名cxf wss4j中的X509证书标记值转换为base64二进制编码,java,soap,cxf,digital-signature,wss4j,Java,Soap,Cxf,Digital Signature,Wss4j,我使用了CXF 3.0.1实现soap,并使用了wss4j WS-security common 3.0.1和CXF rt WS-security 3.0.1。通过在非spring设置中添加OutiterCeptor以及crypto.merlin属性,我完成了数字签名。 现在,根据获得的输出,我的Web服务提供商请求一个BASE64二进制值X509Data标记。 总而言之,我想替换以下内容: C=…,O=…,CN=。。。。 70391139840...... 关于这一点: MIIE4zCC

我使用了CXF 3.0.1实现soap,并使用了wss4j WS-security common 3.0.1CXF rt WS-security 3.0.1。通过在非spring设置中添加OutiterCeptor以及crypto.merlin属性,我完成了数字签名。 现在,根据获得的输出,我的Web服务提供商请求一个BASE64二进制值X509Data标记。 总而言之,我想替换以下内容:


C=…,O=…,CN=。。。。
70391139840......
关于这一点:


MIIE4zCCA8ugAwIBAgI。。。
我当前的完整输出是:


nIHemuhLTu4c/drCPaK1is/。。。。。
R3BF60QESHFYUF5OP7TCGIWJWNWHUYHWTNUXNRNlZYE6QI0YEVXTWB0WF9NESIZS16Y。。。
C=…,O=…,CN=。。。。
70391139840......
我希望显示的输出:


*
*
...
yPt/HXYJYVI1GFFOB52STWPAQSCONR6QQ2WW。。。。
u+XmtuZRW1pqfnIaExnheNGMgg。。。
MIIE4zCCA8ugAwIBAgI。。。
这是我的Java客户端代码:


org.apache.cxf.endpoint.Client Client=ClientProxy.getClient(ServicesSoap);
client.getoutiterceptor().add(新的SAAJOutInterceptor());
org.apache.cxf.endpoint.endpoint cxfEndpoint=client.getEndpoint();
Map outProps=new HashMap();
WSS4JOutInterceptor wssOut=新的WSS4JOutInterceptor(输出程序);
cxfEndpoint.getOutiterCeptors().add(wssOut);
outProps.put(WSHandlerConstants.ACTION,“签名”);
outProps.put(WSHandlerConstants.USER,“1”);
put(WSHandlerConstants.SIG_PROP_文件,“crypto.properties”);
outProps.put(WSHandlerConstants.PW_回调_类,
ClientPasswordCallback.class.getName());
outProps.put(WSHandlerConstants.SIG_DIGEST_ALGO,“http://www.w3.org/2001/04/xmlenc#sha256");
outProps.put(WSHandlerConstants.MUST_理解“true”);
outProps.put(WSHandlerConstants.SIG_ALGO,“http://www.w3.org/2001/04/xmldsig-more#rsa-sha256”);
outProps.put(WSHandlerConstants.USE_SINGLE_CERTIFICATE,“false”);
put(“SecurityToken”,“wsse:Base64Binary”);
crypto.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.file=/home/...
org.apache.ws.security.crypto.merlin.keystore.alias=1
org.apache.ws.security.crypto.merlin.keystore.password=...

关于这个问题我找了很多。解决此问题的两种方法是使用Apache CXF-SAML,而且如果您想使用wss4j,您可以将您的请求发送给授权您的证书的人,并使用您告诉他们的标签名称。

我不会将此作为答案发布,因为我不知道这是否是您真正需要的。您可能可以将属性配置为适当的值。例如:
outProps.put(wshandlerstants.SIG_KEY_ID,“DirectReference”)。还可以尝试
X509KeyIdentifier
属性值。请看这个或这个。我希望这能有所帮助。@KayvanTehrani Mehdi,你能测试提议的解决方案吗?@jccampanero谢谢你的建议。但这不是我们的问题。正如您在示例代码中看到的,我们希望将X509data标记的内容更改为编码base64,而不更改标记的名称。换句话说,使用SIG_KEY_ID属性和“DirectReference”的值导致更改标记的名称(keyIdentifier)。我理解@mehdihoseini,感谢您的反馈。那么,你可以采取的最好办法是去掉WSS4J,提供一个定制的CXF拦截器(请考虑从Glen Mazza读不寻常的文章),并直接生成XML签名。例如,请参见问题中为Yash提供的答案。如果你需要进一步的信息,请告诉我。