Metro 將 JAXB 2.x、JAX-WS 2.x 參考實現與 WSIT(Web Services Interoperability Technologies)整合,提供企業級 WS-* 支援。WSIT 處理策略配置,XWSS 執行實際安全運算。本文以圖書館服務為例,示範 UsernameToken、簽名加密的完整配置與互操作性驗證。
WSIT 從 WSDL 讀取 WS-Policy/WS-SecurityPolicy,並透過自定義擴展元素注入金鑰庫路徑、密碼回調類等部署資訊。客戶端固定讀取類路徑下的 wsit-client.xml;伺服器端在 WEB-INF/sun-jaxws.xml 指定的 WSDL 中內嵌配置。擴展命名空間不同:
https://schemas.sun.com/2006/03/wss/clienthttps://schemas.sun.com/2006/03/wss/server<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>
<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" 硬編碼(僅測試用)。
<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 動態提供私鑰密碼。
專案提供 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 生態。