2013-04-30 60 views
1

我必須調用客戶提供的Web服務(由於此原因,以下某些信息被屏蔽)。我已經提供了一個java密鑰庫,其中包含我需要用來生成簽名以包含在我的請求的WSSecurity頭中的私鑰。使用Apache Rampart簽署JKS和二進制安全令牌密鑰標識

此外,我已經發送了一個可用的SoapUI項目,該項目使用適當的安全配置來實現此服務。 soapUI中的傳出安全配置將「密鑰標識符類型」設置爲「二進制安全令牌」

我想在使用Apache Rampart的Java應用程序中設置此調用。我注意到在OutflowSecurity配置中沒有與「二進制安全令牌」關鍵字標識符等效的內容,所以我嘗試了以下內容。下面是我的axis2.xml文件中的相關片段:

<module ref="rampart" /> 
<parameter name="OutflowSecurity"> 
    <action> 
     <items>Signature</items> 
     <user>*******</user> 
     <passwordCallbackClass>*******.PWCBHandler</passwordCallbackClass> 
     <signaturePropFile>crypto.properties</signaturePropFile> 
     <signatureKeyIdentifier>DirectReference</signatureKeyIdentifier> 
    </action> 
</parameter> 

這裏是我的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=C:/rampart/*****.jks 
org.apache.ws.security.crypto.merlin.keystore.alias=****** 
org.apache.ws.security.crypto.merlin.alias.password=********** 
org.apache.ws.security.crypto.merlin.keystore.password=********* (same as above) 

的問題是,當我嘗試與執行服務此配置,我收到以下錯誤:

org.apache.axis2.AxisFault: Error during Signature: 
at org.apache.rampart.handler.WSDoAllSender.processMessage(WSDoAllSender.java:75) 
at org.apache.rampart.handler.WSDoAllHandler.invoke(WSDoAllHandler.java:72) 
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.send(AxisEngine.java:427) 
at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:406) 
at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229) 
at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165) 
... (removed) 
Caused by: org.apache.ws.security.WSSecurityException: Error during Signature: 
at org.apache.ws.security.action.SignatureAction.execute(SignatureAction.java:64) 
at org.apache.ws.security.handler.WSHandler.doSenderAction(WSHandler.java:202) 
at org.apache.rampart.handler.WSDoAllSender.processBasic(WSDoAllSender.java:212) 
at org.apache.rampart.handler.WSDoAllSender.processMessage(WSDoAllSender.java:72) 
... 13 more 
Caused by: org.apache.ws.security.WSSecurityException: Signature creation failed 
at org.apache.ws.security.message.WSSecSignature.computeSignature(WSSecSignature.java:558) 
at org.apache.ws.security.message.WSSecSignature.computeSignature(WSSecSignature.java:478) 
at org.apache.ws.security.message.WSSecSignature.build(WSSecSignature.java:384) 
at org.apache.ws.security.action.SignatureAction.execute(SignatureAction.java:61) 
... 16 more 
Caused by: org.apache.ws.security.WSSecurityException: General security error (The private key for the supplied alias does not exist in the keystore) 
at org.apache.ws.security.components.crypto.Merlin.getPrivateKey(Merlin.java:725) 
at org.apache.ws.security.message.WSSecSignature.computeSignature(WSSecSignature.java:501) 
... 19 more 
Caused by: java.security.UnrecoverableKeyException: Cannot recover key 
at sun.security.provider.KeyProtector.recover(Unknown Source) 
at sun.security.provider.JavaKeyStore.engineGetKey(Unknown Source) 
at sun.security.provider.JavaKeyStore$JKS.engineGetKey(Unknown Source) 
at java.security.KeyStore.getKey(Unknown Source) 
at org.apache.ws.security.components.crypto.Merlin.getPrivateKey(Merlin.java:711) 
... 20 more 

我試過所有不同的signatureKeyIdentifiers選項沒有任何運氣。任何人都可以幫我解決這個問題嗎?

謝謝!

回答

0

固定。我的密碼回調處理程序中有錯誤的用戶名。它無法找到用於訪問密鑰的密碼..感謝您的幫助。抱歉回覆晚了。我把它作爲對之前的原始問題的評論。

2

我不確定您的整體配置,但顯而易見的問題是您用來從密鑰庫加載密鑰的別名無效。也許你使用一些公鑰的別名而不是私有的?當沒有提供別名本身時,Rampart將使用用戶作爲別名,因此我將確保在服務配置中的用戶和屬性中的別名被設置爲相同的值。

您可以通過驗證利用上市從密鑰工具JDK密鑰庫中的內容要使用哪一個:

JDK/bin/keytool -list -keystore path/to/keystore 

它應該打印:

alias1, 13-May-2013, trustedCertEntry, (public key only, used to verify signature) 
Certificate fingerprint (SHA1): ***** 
alias2, 13-May-2013, PrivateKeyEntry, (private/public key pair, used to sign messages) 
Certificate fingerprint (SHA1): ***** 
1

問題: 1.我們需要做任何其他策略文件以外的配置。 2.如果是這樣,我們需要添加它。 3.您可以查看策略文件是否適合使用二進制安全令牌的要求。

 <ramp:RampartConfig xmlns:ramp="http://ws.apache.org/rampart/policy"> 
      <ramp:user>***</ramp:user> 
      <ramp:passwordCallbackClass>com.sosnoski.ws.library.adb.PWCBHandler</ramp:passwordCallbackClass> 

      <ramp:signatureCrypto> 
       <ramp:crypto provider="org.apache.ws.security.components.crypto.Merlin"> 
        <ramp:property name="org.apache.ws.security.crypto.merlin.keystore.type">JKS</ramp:property> 
        <ramp:property name="org.apache.ws.security.crypto.merlin.file">com/sosnoski/ws/library/adb/***.jks</ramp:property> 
        <ramp:property name="org.apache.ws.security.crypto.merlin.keystore.password">******</ramp:property> 
       </ramp:crypto> 
      </ramp:signatureCrypto> 
     </ramp:RampartConfig> 
    </wsp:All> 
</wsp:ExactlyOne> 

相關問題