時間戳驗證簽章
Microsoft Authenticode 簽章提供二進位數據的撰寫和完整性保證。 Authenticode 時間戳是以標準 PKCS #7 計數器為基礎。 Microsoft簽署工具可讓開發人員在貼上 Authenticode 簽章的同時貼上時間戳。 時間戳可讓 Authenticode 簽章在用於簽章的憑證過期之後進行驗證。
Authenticode 簡介
Authenticode 會套用數位簽名技術,以確保二進位數據的作者和完整性,例如可安裝的軟體。 用戶端網頁瀏覽器或其他系統元件可以使用 Authenticode 簽章,在下載或安裝軟體時驗證數據的完整性。 Authenticode 簽章可以搭配許多軟體格式使用,包括.cab、.exe、.ocx 和 .dll。
Microsoft維護公開 證書頒發機構單位 (CA) 的清單。 Authenticode 憑證的簽發者目前包括 SSL.com、Digicert、Sectigo(Comodo)和 GlobalSign。
關於密碼編譯時間戳
過去,已提出各種密碼編譯時間戳方法。 例如,請參閱《密碼編譯雜誌》(1991年)和貝納洛和德瑪律《單向累積器:分散式數字簽名替代方法》,在《計算機科學》第765卷(EUROCRYPT '93)中參閱 Haber 和 Stornetta《如何時間戳數字檔》。 本文的延伸摘要可從 Microsoft Research 取得。 (某些語言和國家或地區可能無法使用這些資源。由於時間是實體,而不是數學數量,因此這些方法通常涉及如何連結物件,以便判斷其建立順序,或如何有效率地群組對象,這些物件全都可以描述為同時建立。
據稱要驗證時間作為數量的系統一律需要某種形式的信任。 在強對抗設定中,可以使用複雜的通訊協議來確保某種程度的同步處理。 不過,這些通訊協定需要受影響合作對象之間的廣泛互動。 在實務上,如果只有一個需要來自受信任來源的時間認證,則來源只需提供在指定時間提交簽章的已簽署聲明(認證)即可做為公證員。
以下實作時間戳的反簽署方法允許在簽署憑證過期或撤銷之後驗證簽章。 時間戳可讓驗證器可靠地知道簽章所貼上的時間,並在該時間有效時信任簽章。 時間戳器應該具有可靠且受保護的時間來源。
PKCS #7 簽署的檔和反簽署
PKCS #7 是密碼編譯數據的標準格式,包括已簽署的數據、憑證和 證書吊銷清單 (CRL)。 時間戳內容中特定 PKCS #7 感興趣的類型是簽署數據,對應至 PKCS #7 定義的 SignedData 內容類型。
PKCS #7 套件是由 SignedData 所組成,可識別其實際內容及其特定資訊,以及 SignerInfo 簽章區塊。 SignerInfo 本身可能包含反符號,遞歸為另一個 SignerInfo。 原則上,可能會有一連串這類反符號。 countersignature 是 SignerInfo 中籤章的未經驗證屬性;也就是說,它可能會在原始簽章之後貼上。 在大綱表單中:
SignedData (PKCS #7)
- 版本 (PKCS #7,通常是第 1 版)
- DigestAlgorithms (SignerInfo 簽章區塊用於優化處理的所有演算法集合)
- ContentInfo (contentType 等於 SignedData,加上內容或內容的參考)
- 選擇性憑證 (使用的所有憑證集合)
- 選擇性 CRL (所有 CRL 的集合)
- SignerInfo 簽章區塊(實際簽章,由一或多個 SignerInfo 簽章區塊組成)
SignerInfo (簽章區塊)
- 版本 (PKCS #7,通常是第 1 版)
- 憑證(用來唯一識別 SignedData 中簽署者憑證的簽發者和序號)
- DigestAlgorithm 加上 DigestEncryptionAlgorithm 加上 Digest (hash),加上 EncryptedDigest (實際簽章)
- OPTIONAL AuthenticatedAttributes (例如,由此簽署者簽署)
- OPTIONAL UnauthenticatedAttributes (例如,未由此簽署者簽署)
已驗證屬性的範例是簽署時間(OID 1.2.840.113549.1.9.5),因為它是時間戳服務簽署的一部分。 未驗證屬性的範例是計數器符號(OID 1.2.840.113549.1.9.6),因為它可以在簽署之後貼上。 在此情況下,SignerInfo 本身會包含 SignerInfo (Countersignature)。
注意
在計數器簽署的對像是原始簽章(也就是原始 SignerInfo 的 EncryptedDigest)。
SignTool 和 Authenticode 進程
SignTool 適用於 Authenticode 簽署和時間戳二進位數據。 此工具會安裝在 Microsoft Windows 軟體開發工具包 (SDK) 安裝路徑的 \Bin 資料夾中。
使用 SignTool 簽署和時間戳二進位數據相當簡單。 發行者必須從商業程式代碼簽署 CA 取得程式碼簽署憑證。 為了方便起見,Microsoft發佈及更新公用 CA 清單,包括發行 Authenticode 憑證的 CA。 準備好發佈時,物件檔案會使用適當的命令行參數搭配 SignTool 工具簽署和時間戳。 任何 SignTool 作業的結果一律為 PKCS #7 格式 SignedData。
SignTool 接受輸入要簽署的原始二進位數據及時間戳,或先前簽署的二進位數據要加上時間戳。 先前簽署的數據可以使用 signtool timestamp 命令來時間戳。
Argument | 描述 |
---|---|
/t HTTPAddress | 表示檔案要加上時間戳。 必須提供指定時間戳伺服器位址的 URL。 /t 可以搭配 signtool sign 和 signtool timestamp 命令使用。 |
如需此內容中可能有用的工具詳細資訊,請參閱 密碼編譯工具和 SignTool。
實作詳細數據和連線格式
SignTool 依賴 Windows Authenticode 實作來建立和時間戳簽章。 Authenticode 會在二進位檔上運作,例如.cab、.exe、.dll或 .ocx。 Authenticode 會先建立簽章,併產生 PKCS #7 SignedData。 這是 必須反簽署的 SignedData ,如 PKCS #9 中所述。
反簽署程式會以四個步驟進行:
- 從 PKCS #7 SignedData 的 SignerInfo 複製簽章 (也就是 encryptedDigest)。
- 建構時間戳要求,其內容為原始簽章。 將此值傳送至編碼為 TimeStampRequest 的時間戳伺服器 Abstract Syntax Notation One (ASN.1)。
- 接收時間戳,格式為第二個 PKCS #7 SignedData,從時間戳伺服器傳回。
- 將 SignerInfo 從時間戳直接複製到原始 PKCS #7 SignedData,作為 PKCS #9 計數器符號(也就是原始的 SignerInfo 中未經驗證的屬性)。
時間戳要求
時間戳要求會在 HTTP 1.1 POST 訊息內傳送。 在 HTTP 標頭中,CacheControl 指示詞會設定為 no-cache,而 Content-Type 指示詞會設定為 application/octet-stream。 HTTP 訊息的本文是時間戳要求之 可辨別編碼規則 (DER) 編碼的base64編碼方式。
雖然目前未使用,但 Content-Length 指示詞也應該用於建構 HTTP 訊息,因為它有助於時間戳伺服器找出要求位於 HTTP POST 內的位置。
其他 HTTP 標頭也可能存在,如果要求者或時間戳伺服器無法理解,則應該忽略它們。
時間戳要求是 ASN.1 編碼的訊息。 要求的格式如下。
TimeStampRequest ::= SEQUENCE {
countersignatureType OBJECT IDENTIFIER,
attributes Attributes OPTIONAL,
content ContentInfo
}
countersignatureType 是 對象標識碼 (OID),會將它識別為時間戳計數器,而且應該是確切的 OID 1.3.6.1.4.1.311.3.2.1。
時間戳要求中目前未包含任何屬性。
內容是 PKCS #7 所定義的 ContentInfo。 內容是要簽署的數據。 對於簽章時間戳,ContentType 應該是 Data,而內容應該是 PKCS #7 內容的 SignerInfo 中要加上時間戳的 encryptedDigest (signature)。
時間戳回應
時間戳回應也會在 HTTP 1.1 訊息內傳送。 在 HTTP 標頭中,Content-Type 指示詞也會設定為 application/octet-stream。 HTTP 訊息本文是時間戳回應 DER 編碼的base64編碼方式。
時間戳回應是由時間戳器簽署的 PKCS #7 簽署訊息。 PKCS #7 訊息的 ContentInfo 與時間戳中所收到的 ContentInfo 相同。 PKCS #7 內容包含已驗證的簽署時間屬性(定義於 PKCS #99、OID 1.2.840.113549.9.5 中)。
在 Authenticode 從伺服器收到時間戳之後,Authenticode 會將時間戳併入原始 PKCS #7 SignedData 做為反符號。 為了達成此目的,會捨棄所傳回 PKCS #7 SignedData 的 ContentInfo,而傳回時間戳的 SignerInfo 會複製成原始 PKCS #7 SignedData 的 SignerInfo。 時間戳的憑證鏈結也會複製到原始 PKCS #7 SignedData 中的憑證,做為原始簽署者的未驗證屬性。