iT邦幫忙

2025 iThome 鐵人賽

DAY 16
0
Security

江湖在走,數位憑證要懂,懂得天天吃滷肉飯系列 第 16

第16天,S/MIME數位簽章格式解析 / 新港鴨肉羹 (新北新莊)| 30天滷肉飯

  • 分享至 

  • xImage
  •  

太好了,上一篇你已經把 PKCS#7 的結構逐層拆解清楚,這一篇要介紹 S/MIME 的數位簽章格式,其實就是把剛剛學到的 PKCS#7 結構放進電子郵件的 MIME 框架裡。下面我幫你整理一篇「延續上一篇」的鐵人賽文章草稿:


S/MIME 數位簽章格式解析

在上一篇,我們透過 ASN.1 解構了 PKCS#7 signedData 的細節,了解簽章檔案如何封裝。今天要進一步看看它在 電子郵件 (MIME) 世界裡是如何呈現的:這就是 S/MIME


S/MIME 是什麼?

S/MIME (Secure/Multipurpose Internet Mail Extensions) 是電子郵件的安全標準,主要提供兩大功能:

  1. 數位簽章:確認郵件是否來自某人,內容有無被竄改。
  2. 加密:保護郵件內容不被中途竊聽。

今天我們聚焦在「數位簽章」。


範例結構

這是一份簽章後的 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 的角色

boundary 是 MIME 協議中用來 分隔多個部件 的特殊字串。
在這個範例中,boundary="----F585C540A9C01DC66E646772D6F39AB0"

用法規則是:

  1. 每個部件的開頭要加上:

    ------F585C540A9C01DC66E646772D6F39AB0
    
  2. 最後一個部件結束時,要加上結尾標記(多兩個 --):

    ------F585C540A9C01DC66E646772D6F39AB0--
    

這樣郵件客戶端就能正確把 MIME 區塊切開,知道哪些是原文、哪些是簽章檔。


multipart/signed 的兩個部件

  1. 原始內容 (原文)

    123
    

    這就是被簽章的訊息,保持原樣。

  2. 簽章檔 (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 在哪?

前一篇我們提到 PKCS#7 signedData 有這些元素:

  • digestAlgorithms:雜湊演算法(這裡是 SHA-256)。
  • encapContentInfo:被簽內容。
  • certificates:憑證。
  • signerInfos:簽章人與簽章值。

在 S/MIME 裡,這些東西都塞進 smime.p7s 這個附件中。換句話說,S/MIME 就是「MIME + PKCS#7」 的結合。


micalg 與 protocol

Content-Type: multipart/signed 裡有兩個重要參數:

  • protocol="application/x-pkcs7-signature"
    → 指定簽章部件的格式。
  • micalg="sha-256"
    → 表示簽章所用的雜湊演算法。

這些資訊可以幫助郵件用戶端正確解析並驗證簽章。


總結

S/MIME 數位簽章的結構,可以簡單理解為:

  1. MIME 外框:multipart/signed,分兩段。
  2. 原文:第一段,保持不動。
  3. 簽章檔 (smime.p7s):第二段,內含 PKCS#7 signedData。

如此一來,收件者可以同時讀到原文,並驗證其真實性與完整性。

新港鴨肉羹

  • 店名:新港鴨肉羹
  • 地址:新北市新莊區中和街175巷6號
  • 營業時間:一到五 11:30–14:30 16:30–20:00
  • Google Maps
  • 本系列地圖

https://ithelp.ithome.com.tw/upload/images/20250930/201634165O1Qo2zd6I.jpg

這家滷肉飯是全瘦的,對我來說還好,不過鴨肉羹超級好喝,甜甜的南部口味

https://ithelp.ithome.com.tw/upload/images/20250930/20163416VYqHJFvKRO.jpg


上一篇
第15天,PKCS#7數位簽章結構解析 / 央二巷滷肉飯 (新北土城) | 30天滷肉飯
下一篇
第17天,資料加密介紹與應用 / 海洋台南意麵(台北中正)| 30天滷肉飯
系列文
江湖在走,數位憑證要懂,懂得天天吃滷肉飯19
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言