我觉得我一直在看这个问题。
背景: 我必须打电话给安全的第三方网络服务。正文和标题块都需要使用客户端证书进行签名。 如果我禁用Rampart并使用tcpmon并捕获传出信封,我可以配置SOAPUI来发送消息(通过配置SOAPUI以使用cert来签署前面讨论的重要部分)。这告诉我信息不是问题。
如果我启用Rampart并捕获外发消息,它看起来是正确的(两个元素都已签名,安全元素都已到位)。
当我尝试使用Rampart调用服务时,我得到以下堆栈:
org.apache.axis2.AxisFault: Missing wsse:Security header in request
at org.apache.rampart.handler.RampartReceiver.setFaultCodeAndThrowAxisFault(RampartReceiver.java:166)
at org.apache.rampart.handler.RampartReceiver.invoke(RampartReceiver.java:99)
at org.apache.axis2.engine.Phase.invoke(Phase.java:318)
at org.apache.axis2.engine.AxisEngine.invoke(AxisEngine.java:254)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:160)
at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:364)
at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:417)
at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229)
at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165)
at org.apache.axis2.axis2userguide.RetrieveCurrentBidResults_v20090801ServiceStub.retrieveCurrentBidResults_v20090801(RetrieveCurrentBidResults_v20090801ServiceStub.java:225)
at org.transalta.weezer.soap.client.RetrieveCleanBidsClient.main(RetrieveCleanBidsClient.java:64)
这是我正在使用的policy.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<wsp:Policy wsu:Id="SigEncr"
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:WssX509V1Token10 />
</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: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:Header Name="CAISOWSHeader" Namespace="http://www.caiso.com/soa/2006-09-30/CAISOWSHeader.xsd" />
</sp:SignedParts>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
所以我想知道的是Rampart试图告诉我的是什么?我知道它认为存在的组件是否存在。
答案 0 :(得分:0)
我通过修改rampart模块来跳过“安全”阶段以及流入后的所有阶段来解决这个问题。
private static void modifyRampartModule(ServiceClient serviceClient) {
AxisConfiguration axisConfig = serviceClient.getAxisConfiguration();
List<Phase> phases = axisConfig.getInFlowPhases();
List<Phase> newPhases = new ArrayList<Phase>();
for (Phase phase : phases) {
if (!phase.getName().equalsIgnoreCase("security"))
newPhases.add(phase);
if (phase.getName().equalsIgnoreCase("security"))
break;
}
axisConfig.setInPhasesUptoAndIncludingPostDispatch(newPhases);
}
答案 1 :(得分:0)
如果您已经发布了一条捕获的请求 - 响应消息,那就更好了。由于您说的是策略中定义的预期元素已被烧录,请检查请求消息中是否存在TimeStamp元素。如果时间戳在那里,那么它也必须签名,在这种情况下,这可能是失败的原因。
答案 2 :(得分:0)
我在代码中应用了“ Tambu”的“ modifyRampartModule”方法,该方法开始正常工作。我曾尝试通过axis2.xml中的配置执行相同的操作,但是我应该做错了,因为对我而言,它不起作用。
关键是,标头必须在请求中也必须在响应中传播...但是,如果您有“解决方案提供者”,则可能会从响应中删除标头...而您将面临此问题。>