技術交流

淺談 Web Service Security(WSS)

更新於

Web Service 可以透過網路以 HTTP 傳送 SOAP 訊息封包的方式提供跨平台、跨語言的系統整合。在一般的使用情境中,Web Service 提供者會在 UDDI 註冊其服務,並使用 WSDL 描述 Web Service 的呼叫使用細節。而用戶端則從 UDDI 尋找所需的 Web Service,將 SOAP 訊息封包發送到佈署在 URI 資源所在的服務端點(即 Web Service),經過相關邏輯處理之後,Web Service 會以 SOAP 訊息封包回應給用戶端處理結果或者錯誤訊息。

uddi

名詞解釋

SOAP

SOAP 是一個協定規範,定義傳遞 XML 資料的方法,也定義了使用 HTTP 作為底層通訊協定時執行遠端呼叫(RPC)的方法。SOAP 是在 2000 年由 IBM、Microsoft、UserLand 和 DevelopMentor 共同提交給 W3C,SOAP 未來的發展規劃目前是由 W3C 的 XML 協議小組來負責制定,這也確定 SOAP 將會是一個業界通用的規範。

UDDI(Universal Description, Discovery and Integration Service)

UDDI 是提供用戶端在網路上動態尋找其他 Web Service 的機制,使用 UDDI 介面,商務處理可以動態的連接到外部合作者所提供的服務,UDDI 的註冊有點類似 CORBA 的 trader 機制,我們也可以把它想像成商業應用程式上的 DNS 服務,而 UDDI 的註冊分為兩種:一種是要發佈服務的客戶,另一種則是想要取得服務的客戶。

WSDL

WSDL 是一種 Web 服務定義語言,WSDL 為服務提供者提供描述在不同協定或編碼方式上呼叫 Web Service 的方法,簡單的說,WSDL 就是用來描述一個 Web Service 能做什麼?位置在哪?如何呼叫?

雖然 Web Service 具有低耦合度(loose-coupled)、跨語言、跨平台、方便傳輸等優點,但要作為一個成功的應用,卻仍有不足。其中最重要的一環,就是如何達到安全的通訊需求?然而,原有的 SOAP 規範中,針對安全問題並沒有提出解決方案。雖然 SSL 或 IPSec 等技術可以提供點對點的傳輸層安全保障,但如果考慮到傳輸可能經過代理(Proxy)轉送,這樣的傳輸層加密保護,就顯得不夠穩固了。如此一來,如何處理訊息層級的機密性並確保其完整性,便成了亟待解決的重要課題。因此,WS-Security 提出的解決方案,便應運而生。

WS-Security

WS-Security 最初是由 IBM、微軟、VeriSign 和 Forum Systems 開發的,現在協議由 Oasis-Open 組織的一個委員會開發,官方名稱為 WSS。一種提供在 Web Service 安全應用的網路傳輸協議。2004 年 4 月 19 日,OASIS 組織發佈了 WS-Security 標準的 1.0 版本。2006 年 2 月 17 日,發布了 1.1 版本。

協議內容包含了如何在 Web Service 的 SOAP 訊息層級保證其完整性和機密性的規約。WSS 協議包括 SAML、Kerberos 和認證憑證格式(如 X.509)的詳細使用規範。WS-Security 描述了如何將簽章和加密標頭(Header)加入 SOAP 訊息。包括如何在 SOAP 訊息中加入安全字串(token)的機制,不限純文字也包括二進制的安全字串,例如 X.509 憑證和 Kerberos 門票(ticket)。

WS-Security 將安全特性放入 SOAP 訊息的標頭中,在應用層作處理。這樣的協議保證了端到端的安全,補足了僅使用 SSL 或 IPSec 確保點對點傳輸安全的不足。下圖說明了 WS-Security 在既有的 SOAP 訊息封包所增加的安全性內容。

SOAP
以一個傳遞 Hello World! 訊息的 SOAP 封包舉例,原始的 SOAP 訊息封包

< SOAP-ENV:Envelopexmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
< SOAP-ENV:Body >
  < sayHello xmlns="http://jeffhanson.com/services/helloworld" >
    < value xmlns="">
      Hello world!
    < /value>
  < /sayHello >
< /SOAP-ENV:Bdy >
< /SOAP-ENV:Envelope >

當加上 WS-Security 的安全性標頭內容,新的 SOAP 訊息封包如下:


< SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
< SOAP-ENV:Header >
  < wsse:Security SOAP-ENV:mustUnderstand="true"xmlns:wsse="http://docs.oasis-open.org/...-wss-wssecurity-secext-1.0.xsd">
    < ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
       < ds:SignedInfo >
       < ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
       < ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#dsa-sha1"/>
       < ds:Reference URI="#id-1281123" >
          < ds:Transforms >
          < ds:Transform Algorithm=" http://www.w3.org/2001/10/xml-exc-c14n#"/>
          < /ds:Transforms >
          < ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
          < ds:DigestValue>wLumPkKZ+X48rjao/XUUQDp0xk0=< /ds:DigestValue >
      < /ds:Reference >
      < /ds:SignedInfo >
      < ds:SignatureValue >a56OxPcKr8LJnIFgRyMQej5/ZkUjkV9V9rmn+queMKzJ3GYpMiXpjQ==< /ds:SignatureValue >
      < ds:KeyInfo Id="KeyId-30752603" >
          < wsse:SecurityTokenReference wsu:Id="STRId-2545159" xmlns:wsu="http://docs...-200401-wss-wssecurity-utility-1.0.xsd" >
             < ds:X509IssuerSerial >
             < ds:X509IssuerName >CN=pubcert< /ds:X509IssuerName >
             < ds:X509SerialNumber>1140726843< /ds:X509SerialNumber >
             < /ds:X509IssuerSerial >
           < /wsse:SecurityTokenReference >
      < /ds:KeyInfo >
      < /ds:Signature >
< /wsse:Security >
< /SOAP-ENV:Header >
< SOAP-ENV:Body wsu:Id="id-1281123" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
   < sayHello xmlns="http://jeffhanson.com/services/helloworld" >
      < value xmlns="">Hello world!< /value >
   < /sayHello >
< /SOAP-ENV:Body >
< /SOAP-ENV:Envelope >

當 Web Service 的用戶端透過實作標準的 WS-Security,把安全性字串或簽章內容加到原本的 SOAP 訊息標頭,Web Service 即可取出這些安全性內容進行身份驗證、授權、訊息解密以及訊息完整性檢核等工作。

secure soap

因此,實務的應用上,Web Service 的用戶端和伺服端都必須有 WS-Security 的相關實作,才能完成整個安全機制的運作。在開發上,目前存在著各式的工具可提供相關的協助,各種應用系統伺服器也多有提供各種 WS-Security Policy 的支援。更進階的內容,請參閱參考資料。

參考資料

Tags:WSSSOAPUDDIWSDL
閱讀更多