太好了,上一篇你已經把 PKCS#7 的結構逐層拆解清楚,這一篇要介紹 S/MIME 的數位簽章格式,其實就是把剛剛學到的 PKCS#7 結構放進電子郵件的 MIME 框架裡。下面我幫你整理一篇「延續上一篇」的鐵人賽文章草稿:
在上一篇,我們透過 ASN.1 解構了 PKCS#7 signedData 的細節,了解簽章檔案如何封裝。今天要進一步看看它在 電子郵件 (MIME) 世界裡是如何呈現的:這就是 S/MIME。
S/MIME (Secure/Multipurpose Internet Mail Extensions) 是電子郵件的安全標準,主要提供兩大功能:
今天我們聚焦在「數位簽章」。
這是一份簽章後的 S/MIME 郵件:
MIME-Version: 1.0
Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg="sha-256"; boundary="----F585C540A9C01DC66E646772D6F39AB0"
This is an S/MIME signed message
------F585C540A9C01DC66E646772D6F39AB0
123
------F585C540A9C01DC66E646772D6F39AB0
Content-Type: application/x-pkcs7-signature; name="smime.p7s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7s"
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
------F585C540A9C01DC66E646772D6F39AB0--
可以看到它是 multipart/signed 格式,由兩個部分組成。
boundary
是 MIME 協議中用來 分隔多個部件 的特殊字串。
在這個範例中,boundary="----F585C540A9C01DC66E646772D6F39AB0"
。
用法規則是:
每個部件的開頭要加上:
------F585C540A9C01DC66E646772D6F39AB0
最後一個部件結束時,要加上結尾標記(多兩個 --
):
------F585C540A9C01DC66E646772D6F39AB0--
這樣郵件客戶端就能正確把 MIME 區塊切開,知道哪些是原文、哪些是簽章檔。
原始內容 (原文)
123
這就是被簽章的訊息,保持原樣。
簽章檔 (smime.p7s)
Content-Type: application/x-pkcs7-signature
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7s"
MIIGGgYJKoZIhvcNAQcCoIIGCzCCBgcCAQExDzANBglghkgBZQMEAgEFADALBgkq...
這裡是一個 Base64 編碼的 PKCS#7 檔案,結構與上一篇解析的 signedData 一樣。只是這次沒有內嵌原文,而是「外掛」方式:簽章僅針對原文 "123"
,然後一起包裝在 MIME 裡。
前一篇我們提到 PKCS#7 signedData 有這些元素:
在 S/MIME 裡,這些東西都塞進 smime.p7s
這個附件中。換句話說,S/MIME 就是「MIME + PKCS#7」 的結合。
在 Content-Type: multipart/signed
裡有兩個重要參數:
protocol="application/x-pkcs7-signature"
micalg="sha-256"
這些資訊可以幫助郵件用戶端正確解析並驗證簽章。
S/MIME 數位簽章的結構,可以簡單理解為:
如此一來,收件者可以同時讀到原文,並驗證其真實性與完整性。
這家滷肉飯是全瘦的,對我來說還好,不過鴨肉羹超級好喝,甜甜的南部口味