6.2 三重隱蔽包裝
6.2.1 基本概念
每項S/MIME增強安全服務的一些特性都采用“三重隱蔽包裝”的概念對報文進行包裝。即一個被三重隱蔽包裝的報文要先被簽名,然后被加密,最后又被簽名。這里,對內部和外部簽名的人可能是不同的實體或是同一個實體。
6.2.2 三重隱蔽包裝的目的
并非所有的報文都需要三重隱蔽包裝。當必須對報文簽名、然后再加密,最后將簽了名的報文屬性裝配到被加密的主體上時,需要使用三重隱蔽包裝。發出報文的人或中間代理可以添加或刪除其外部屬性,且外部屬性也可以被中間代理或最終的收件人簽名。
內部簽名可用于保證內容的完整性、抗抵賴、對信源的鑒別以及將報文的屬性(如安全標簽)捆綁到報文的初始內容中。這些屬性從發件人傳到收件人,無論中間實體(如處理報文的郵件清單代理)有多少個。這種簽名屬性可以用來控制對內部主體的訪問,并且在內部簽名中還帶有發方索要簽名收據的請求。
被加密的主體具有機密性,包括在內部簽名中所攜帶的這些屬性的機密性。
6.2.3 三重隱蔽包裝的步驟
以下是創建一個三重隱蔽包裝報文的步驟:
1)先從報文主體開始,稱“初始內容”。
2)用適當的MIME內容類型(Content-type)頭封裝初始內容,例如“Content-type: text/plain”(內容類型:文本/明文)。此MIME 封裝規則的一個例外是被簽名的收據不放在MIME頭中。
3)給第2步的結果(內部 MIME頭和初始內容)簽名。SignedData encapContentInfo eContentType對象標識符必須是 id-data。如果您在第4步創建的結構是multipart/signed,則不得有 SignedData encapContentInfo eContent。如果您在第4步創建的結構是application/pkcs7-mime,則 SignedData encapContentInfo eContent必須包含上述第2步的結果。SignedData 的結構被內容類型(contentType)為 id-signedData 的 ContentInfo 序列所封裝。
4)按照MSG [MSG]中的定義,將適當的 MIME 結構添加到第3步的被簽名的報文中。所得出的報文稱為“內部簽名”。
——如果您用multipart/signed進行簽名,則添加的 MIME 結構包括帶參數的內容類型multipart/signed、邊界、上述第2步的結果、邊界、內容類型application/pkcs7-signature、可選的MIME頭(如 Content-transfer-encoding 和Content-disposition)以及作為上述第3步的結果的主體部分。
——如果您使用 application/pkcs7-mime 進行簽名,則所添加的 MIME 結構包括帶參數的內容類型application/pkcs7-mime、可選的MIME頭(如 Content-transfer-encoding 和 Content-disposition)以及上述第3步的結果。
5)將第4步的結果作為單個塊進行加密,將它變成一個 application/pkcs7-mime 對象。EnvelopedData encryptedContentInfo 的內容類型(contentType)必須是 id-data。 EnvelopedData 結構被內容類型為id-envelopedData 的 ContentInfo 序列所封裝,并稱為“被加密的主體”。
6)添加適當的MIME頭:帶參數的內容類型 application/pkcs7-mime 和可選的 MIME 頭部,如 Content-transfer-encoding 和 Content-disposition。
7)用與上述第3步相同的邏輯,將第6步的結果(MIME 標題和被加密的主體)作為單個塊進行簽名。
6.2.4 三重隱蔽包裝報文的格式
一個被三重隱蔽包裝的報文具有多層的封裝。其結構會因報文中被簽名的部分的格式的不同而不同。由于MIME封裝數據的方式,這些封裝層不按次序出現,使得“層”的概念變得模糊起來。
由于已知接受方能夠處理S/MIME報文(因為他們解密了中間偽裝器),因此無需在內部簽名中使用 multipart/signed 格式。發送代理了解選擇在外層使用 multipart/signed 格式,這樣,非 S/MIME代理可以知道下一個內層被加密;然而,這沒有什么價值,這是因為收方可以發現報文的其余部分是無法讀的。由于許多發送代理通常使用 multipart/signed 結構,因此所有接收代理必須能夠解釋 multipart/signed 或 application/pkcs7-mime 簽名結構。
采用這兩種簽名用的 multipart/signed 的三重隱蔽包裝報文的格式是:
[第八步] Content-type: multipart/signed;
[第八步] protocol=”application/pkcs7-signature”;
[第八步] boundary=outerboundary
[第八步]
[第八步] –outerboundary
[第六步] Content-type: application/pkcs7-mime; )
[第六步] smime-type=enveloped-data )
[第六步] )
[第四步] Content-type: multipart/signed; | )
[第四步] protocol=”application/pkcs7-signature”; | )
[第四步] boundary=innerboundary | )
[第四步] | )
[第四步] –innerboundary | )
[第二步] Content-type: text/plain % | )
[第二步] % | )
[第一步] Original content % | )
[第四步] | )
[第四步] –innerboundary | )
[第四步] Content-type: application/pkcs7-signature | )
[第四步] | )
[第三步] inner SignedData block (eContent is missing) | )
[第四步] | )
[第四步] –innerboundary– | )
[第八步]
[第八步] –outerboundary
[第八步] Content-type: application/pkcs7-signature
[第八步]
[第七步] outer SignedData block (eContent is missing)
[第八步]
[第八步] –outerboundary–
這里:
% = 這些行表示計算內部簽名。
| = 這些行表示在第5步被加密。加密的結果是不透明的,是 EnvelopedData 塊的一部分。
) = 這些行表示計算外部簽名。
采用這兩種簽名用的 application/pkcs7-mime 的三重隱蔽包裝報文的格式是:
[第八步] Content-type: application/pkcs7-mime;
[第八步] smime-type=signed-data
[第八步]
[第七步] outer SignedData block (eContent is present) O
[第六步] Content-type: application/pkcs7-mime; ) O
[第六步] smime-type=enveloped-data; ) O
[第六步] ) O
[第四步] Content-type: application/pkcs7-mime; | ) O
[第四步] smime-type=signed-data | ) O
[第四步] | ) O
[第三步] inner SignedData block (eContent is present) I | ) O
[第二步] Content-type: text/plain I | ) O
[第二步] I | ) O
[第一步] Original content I | ) O
這里:
I = 這些行是內部 SignedData 塊,不僅是無法理解的,而且包含第2步中用 ASN.1 編碼的結果以及控制信息。
| = 這些行表示在第5步被加密。被加密的結果是無法理解的,是 EnvelopedData 塊的一部分。
) = 這些行表示計算外部簽名。