關於 XML 簽名

Adobe AIR 1.5 以及更新的版本

XML 簽名是以 XML 語法表示的數位簽名。XML 簽名中的資料可用來驗證資訊是否自簽署後未曾遭到竄改。此外,如果簽署憑證是由受信任的憑證授權單位所核發,則簽署者的身分可透過公開金鑰基礎結構進行驗證。

XML 簽名可套用至任何類型的數位資料 (二進位或 XML 格式皆可)。XML 簽名的用途一般為:

  • 檢查外部資源或已下載資源是否遭到修改

  • 驗證訊息是否來自已知的來源

  • 驗證應用程式的授權或訂閱權限

支援的 XML 簽名語法

AIR 可支援下列來自 W3C 建議事項之「XML 簽名語法及處理」(XML Signature Syntax and Processing) 的元素:

  • 所有的核心簽名語法元素 (W3C 建議事項文件的第 4 節)—除了 KeyInfo 元素未完全受到支援以外

  • KeyInfo 元素必須只包含 X509Data 元素

  • X509Data 元素必須只包含 X509Certificate 元素

  • SHA256 摘要方法

  • RSA-SHA1 (PKCS1) 簽署演算法

  • 「不含註解、規範化的 XML」規範化方法與轉換

  • 封內簽名轉換

  • 時間戳記

下列文件說明何謂典型的 XML 簽名 (為了簡化範例,其中的大部分密碼編譯簽名資料皆已移除):

<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
    <SignedInfo> 
        <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> 
        <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> 
        <Reference URI="URI_to_signed_data"> 
            <Transforms> 
                <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>            </Transforms> 
            <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> 
            <DigestValue>uoo...vY=</DigestValue> 
        </Reference> 
    </SignedInfo> 
    <SignatureValue>Ked...w==</SignatureValue> 
    <KeyInfo> 
        <X509Data> 
            <X509Certificate>i7d...w==</X509Certificate> 
        </X509Data> 
    </KeyInfo> 
</Signature>

構成簽名的關鍵元素為:

  • SignedInfo — 內有簽署資料的參照與簽署時所算出的摘要值。簽署資料本身可能與 XML 簽名位於同一份文件內,也可能位於外部。

  • SignatureValue — 其中含有 SignedInfo 元素的摘要,此摘要以簽署者的私密金鑰進行加密。

  • KeyInfo — 其中含有簽署憑證,以及用以建立信任鍊結所需的所有額外憑證。請注意,雖然 KeyInfo 元素屬於選擇性元素,但如果未將其包含在內,AIR 便無法驗證簽名。

XML 簽名有三種一般類型:

  • 封內簽名 — 簽名被包在所簽署的 XML 資料中。

  • 封外簽名 — 簽署的 XML 資料包含在 Signature 元素中的 Object 元素之內。

  • 分離簽名 — 簽署資料與 XML 簽名是分離的。可能位於某個外部檔案內。或者,簽署資料也可能與簽名位於同一份 XML 文件內,但不是位於 Signature 元素的父元素或子元素內。

XML 簽名會使用 URI 來參照簽署資料。負責簽署與驗證的應用程式都必須使用相同的慣例來解析這些 URI。當您使用 XMLSignatureValidator 類別時,必須提供 IURIDereferencer 介面的實作。這份實作應負責解析 URI 並將簽署資料以 ByteArray 物件傳回。接著會以當初在簽名內用來產生摘要的演算法,為所傳回的 ByteArray 物件產生摘要。

憑證和信任

憑證的組成包括一個公開金鑰、識別資訊,並可能包括一或多個屬於核發商憑證授權單位的憑證。

有兩種方法可以在憑證中建立信任。若要建立信任,您可以直接向簽署者取得一份憑證,例如從實體媒體或透過安全的數位傳輸 (例如 SSL 交易) 取得。您也可以依賴憑證授權單位來判斷簽署憑證是否可靠。

若要依賴憑證授權單位,則核發簽署憑證的授權單位必須受到當初對簽名進行驗證的電腦所信任。大多數的作業系統製造商會將某些憑證授權單位的根憑證放到作業系統信任儲存區中。使用者也可以在該儲存區中進行憑證的新增和移除。

即使憑證是由受信任的憑證授權單位所核發,您也必須判斷那是不是自己信任的核發單位。在許多使用案例中,這項判斷是由使用者決定。例如,安裝 AIR 應用程式時,AIR 安裝程式會顯示發行者憑證中的識別資訊,並要求使用者確認是否要安裝此應用程式。在其它情況下,您可能必須將公開金鑰或其它憑證資訊拿來與一份可接受的金鑰清單進行比對 (這份清單必須安全無虞,可以透過本身的簽名加以保護,或是將清單儲存在 AIR 加密本機儲存區中,以免遭到竄改)。

備註: 您雖然可以選擇信任未經獨立驗證的簽署憑證 (例如當簽名屬於「自我簽署」的性質時),但驗證這樣的簽名並不能讓您安心多少。如果不知道簽名的建立者是誰,即使確定簽名未曾遭到竄改也沒有太大意義。簽名可能是一份簽署有效的偽造簽名。

憑證到期和撤銷

所有憑證都會過期。憑證也可能受到核發商憑證授權單位的撤銷,例如當憑證的私密金鑰遭到竄改或竊取時。如果簽名是某個已過期或已撤銷的憑證所簽署,該簽名就會回報為無效,除非簽名中含有時間戳記。如果有時間戳記,則只要憑證在當初簽署時為有效,XMLSignatureValidator 類別就會驗證簽名。

時間戳記是來自時間戳記服務的經過簽署的數位訊息,該項服務可證明某資料在某個日期和時間確實受到簽署。時間戳記是由時間戳記授權單位所核發,且由該單位本身的憑證所簽署。時間戳記所內嵌之時間戳記授權單位憑證必須受目前電腦所信任,時間戳記才可視為有效。XMLSignatureValidator 並不提供 API 來指定使用其它憑證來驗證時間戳記。