首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Web 服務:Metro 框架下的 WS-Security 實戰

     編輯:Java 相關知識

Metro 將 JAXB 2.x、JAX-WS 2.x 參考實現與 WSIT(Web Services Interoperability Technologies)整合,提供企業級 WS-* 支援。WSIT 處理策略配置,XWSS 執行實際安全運算。本文以圖書館服務為例,示範 UsernameToken、簽名加密的完整配置與互操作性驗證。

WSIT 配置基礎

WSIT 從 WSDL 讀取 WS-Policy/WS-SecurityPolicy,並透過自定義擴展元素注入金鑰庫路徑、密碼回調類等部署資訊。客戶端固定讀取類路徑下的 wsit-client.xml;伺服器端在 WEB-INF/sun-jaxws.xml 指定的 WSDL 中內嵌配置。擴展命名空間不同:

  • 客戶端:https://schemas.sun.com/2006/03/wss/client
  • 伺服器:https://schemas.sun.com/2006/03/wss/server

UsernameToken 純文本範例

WSDL 策略宣告

<wsp:Policy wsu:Id="UsernameToken">
  <wsp:ExactlyOne>
    <wsp:All>
      <sp:SupportingTokens>
        <wsp:Policy>
          <sp:UsernameToken sp:IncludeToken=".../AlwaysToRecipient"/>
        </wsp:Policy>
      </sp:SupportingTokens>
    </wsp:All>
  </wsp:ExactlyOne>
</wsp:Policy>

客戶端 WSIT 擴展(wsit-client.xml)

<wssc:CallbackHandlerConfiguration>
  <wssc:CallbackHandler name="usernameHandler"
      classname="com.example.UserPassCallbackHandler"/>
  <wssc:CallbackHandler name="passwordHandler"
      classname="com.example.UserPassCallbackHandler"/>
</wssc:CallbackHandlerConfiguration>

回調類實作 javax.security.auth.callback.CallbackHandler,依請求類型設定用戶名/密碼。亦可直接在 XML 用 default="value" 硬編碼(僅測試用)。

伺服器端 WSIT 擴展

<wsss:ValidatorConfiguration>
  <wsss:Validator name="usernameValidator"
      classname="com.example.PasswordValidator"/>
</wsss:ValidatorConfiguration>

驗證器實作 PasswordValidationCallback.PasswordValidator,可對接資料庫或 LDAP。

簽名與加密(非對稱綁定)

策略包含 AsymmetricBinding、SignedParts、EncryptedParts。關鍵差異:Metro 預設用 SKI(Subject Key Identifier)引用憑證,Axis2/Rampart 預設用 Thumbprint。為互操作需在 InitiatorToken 加入 <sp:RequireThumbprintReference/>。

客戶端金鑰庫配置

<wssc:KeyStore alias="clientkey" keypass="clientpass"
    location="client.keystore" storepass="nosecret"/>
<wssc:TrustStore location="client.keystore" peeralias="serverkey"
    storepass="nosecret"/>

金鑰庫檔案置於類路徑 META-INF/ 下,或用絕對路徑。密碼亦可改用回調類。

伺服器端金鑰庫配置

<wsss:KeyStore alias="serverkey"
    keypass="com.example.KeystoreAccess"
    location="server.keystore" storepass="nosecret"/>
<wsss:TrustStore location="server.keystore" storepass="nosecret"/>

keypass 指定回調類 KeystoreAccess 實作 CallbackHandler 動態提供私鑰密碼。

建構工具:MergeTool

專案提供 com.sosnoski.ws.MergeTool,在建構期將 WSIT 配置合併至基礎 WSDL,避免手工維護龐大 XML。build.xml 呼示範:

<java classname="com.sosnoski.ws.MergeTool">
  <arg value="base.wsdl"/>
  <arg value="client-wsit.xml"/>
  <arg value="merged-client.wsdl"/>
</java>

互操作性驗證與已知問題

Metro 1.5 與 Axis2/Rampart 1.5.x 互測大多數訊息通過,但 Rampart 1.5 引入的簽名驗證缺陷會導致特定請求(如重複 ISBN 新增書目)失敗。Metro 端無此問題,後續版本將修復。

總結

Metro/WSIT 提供靈活的聲明式安全配置:支援直接配置、回調注入、容器整合驗證。多組件整合(JAX-WS + WSIT + XWSS)避免了 Axis2/Rampart 版本鎖定問題。缺點是獨立使用文檔較少,多集中於 NetBeans/Glassfish 生態。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved