5.3 創建S/MIME報文(Creating S/MIME Messages)
S/MIME報文是MIME主體和CMS對象的組合,可以使用幾種MIME類型和幾種CMS對象。被保護的數據總是規范的MIME實體,并將MIME實體和其他數據(如證書和算法標識符)交給產生CMS對象的CMS處理設施,CMS對象最終被包裝在MIME中。S/MIME的增強安全服務規范(參見RFC 2634)提供了如何嵌套的實例及構造安全的S/MIME報文的方法。RFC 2634提供了一個如何采用multipart/signed和簽名的application/pkcs7-mime構成一個三重隱蔽包裝的S/MIME報文的實例。S/MIME為enveloped-only數據提供了一種格式,為signed-only數據提供了幾種格式,并為簽名及包裝的數據提供了幾種格式。
5.3.1 準備簽名或包裝用的MIME實體(Preparing the MIME Entity for Signing or Enveloping)
S/MIME被用于安全MIME實體。MIME 實體可能是subpart、或是報文的subparts、或是帶有其所有子部分的整個報文。作為整個報文的MIME實體只能包括MIME頭和MIME主體,而不包括RFC-822的頭。注意,S/MIME還能用于Internet郵件以外的應用所使用的安全MIME實體。本部分描述的安全的MIME實體可認為是“內部”MIME實體,即它可能是大的MIME報文中“最內部”的對象,在5.3.2節、5.3.4節和其他部分描述了將“外部”MIME實體處理為CMS對象。MIME規范給出了準備MIME實體的規程。在簽名時可使用帶有某些附加限制的相同規程。在此重復了MIME規范中的規程描述,本節還描述了一些附加的要求。
對于創建簽名的、包裝的或簽名且包裝的MIME實體應采用單個的規程。為了預防郵件傳輸期間可能出現的已知問題,推薦采用某些附加步驟,這些步驟對于采用multipart/signed格式的清晰簽名尤為重要。建議對包裝的報文或簽名且封裝的報文實施這些附加步驟,以保證該報文能夠無修改地轉發到任何環境。
第一步:依據本地的約定準備MIME實體。
第二步:將MIME實體的葉子部分轉換為規范的形式。
第三步:對離開得MIME實體應用適當的傳送編碼。
當接收到一個S/MIME報文時,要處理對報文所附帶的安全服務,該結果就是MIME實體。該MIME實體將傳遞給具備MIME處理能力的用戶代理,由該代理將該MIME實體進行解碼和表示后提交給用戶或接收應用程序。有關準備簽名或包裝用的MIME實體的詳細要求請參見RFC 2633。
5.3.2 application/pkcs7-mime類型(The application/pkcs7-mime Type)
application/pkcs7-mime類型被用來攜帶幾種類型envelopedData和signedData的CMS對象。本節描述了application/pkcs7-mime類型的一般特性:如果eContentType是id-data,攜帶的CMS對象通常包含了按5.3.1節所描述方式準備的MIME實體;當eContentType包括了不同的值時,可以攜帶其它內容。
由于CMS對象是二進制數據,大多數情況下64基的傳送編碼是適合的,尤其是采用SMTP傳輸方式。所用的傳送編碼依賴于被發送對象的傳輸方式,它不是MIME類型的特征。
注意:本討論涉及的CMS對象或“外部”MIME實體的傳送編碼,它完全不同于由CMS對象保護的MIME實體的傳送編碼,且與其無關。因為application/pkcs7-mime對象有幾種類型,所以發送代理應該盡可能地幫助接收代理在無需對對象的ASN.1進行解碼的條件下就能了解對象的內容。所有的application/pkcs7-mime對象的MIME頭應該包括“smime-type”可選參數。
5.3.3 創建Enveloped-only報文(Creating an Enveloped-only Message)
本節描述了對MIME實體只包裝不簽名的格式。值得注意的是,發送只包裝不簽名的報文不能提供數據完整性,這可能是通過經處理的報文將依然有效而可能改變了其意義的方式來替換密文。
第一步:按照5.3.1條準備將要包裝的MIME實體。
第二步:將MIME實體和其他所需的數據處理為envelopedData類型的CMS對象。除了為每個接收方加密content-encryption密鑰的副本外,還應該為發起方加密內容加密密鑰的副本并將該副本包含于envelopedData中。
第三步:將CMS對象插入到一個application/pkcs7-mime MIME實體中。
enveloped-only報文的smime-type參數為“envelopeddata”,該類型報文的文件擴展是“.p7m”。
5.3.4 創建只有簽名的報文(Creating a Signed-only Message)
對于定義的S/MIME簽名報文存在兩種格式,即帶有SignedData的application/pkcs7-mime和multipart/signed。發送代理應首選multipart/signed格式,但接收代理應都能處理這兩種格式。
5.3.4.1 選擇Signed-only報文格式(Choosing a Format for Signed-only Messages)
當選擇了特定的signed-only格式時,由于該格式取決于所有接收者的能力,同時該格式還取決于帶有能驗證該簽名的S/MIME設施的接收者與不帶有能觀察該報文的S/MIME軟件的接收者的相對重要性,因此不存在嚴格的規則。
不論接收者是否擁有S/MIME軟件,該接收者都能觀察到查看采用multipart/signed格式簽名的報文。無論接收者正使用本地MIME用戶代理或它們擁有由網關所轉換的報文,這些報文還能被觀察到。在該上下文中,“觀察到”表示處理報文的能力,在實質上就像該報文不是一個簽名報文,包含其他MIME結構。接收方不能觀察到采用signedData格式簽名的報文,除非接收方擁有S/MIME設施。但是,如果接收方擁有S/MIME設施,通常能夠驗證這些報文是否在傳輸中沒被更改。
5.3.4.2 采用帶有SignedData的application/pkcs7-mime的簽名(Signing Using application/pkcs7-mime with SignedData)
這種簽名格式使用application/pkcs7-mime MIME類型。創建該格式的步驟如下:
第一步:按照5.3.1條準備MIME實體。
第二步:將MIME實體和其他所需的數據處理為signedData類型的CMS對象。
第三步:將CMS對象插入到一個application/pkcs7-mime MIME實體中。
采用帶有SignedData的application/pkcs7-mime報文的smime-type參數為“signed-data”,該類型報文的文件擴展是“.p7m”。
5.3.4.3 采用multipart/signed格式的簽名(Signing Using the multipart/signed Format)
本格式是清晰簽名格式。不帶有任何S/MIME或CMS處理設施的接收方能夠觀察該報文。它使用了multipart/signed MIME類型。Multipart/signed MIME類型有兩部分。第一部分包含所簽名的MIME實體;第二部分包括“分離簽名”的CMS SignedData對象,該對象中不存在encapContentInfo eContent字段。
5.3.5 簽名和加密(Signing and Encrypting)
為了完成簽名和加密,可以嵌套任何signed-only格式和encrypted-only格式。由于上述的格式全部是MIME實體,并且這些格式都能保護MIME實體,所以允許這種嵌套方式。S/MIME實現方案必須能夠在接收方計算機合理有限的資源內接收和處理任意嵌套的S/MIME。或者首先對報文進行簽名,或者首先對報文進行包裝,由實施者和用戶來決定選擇何種方式。當首先進行簽名時,簽名人就通過包裝被安全地隱藏起來了。當首先進行包裝,簽名人是暴露的,但無需去除包裝就可能驗證簽名。
無論選擇首先簽名還是首先加密都存在安全分歧。對于先加密后簽名報文的接收方能夠確認加密塊沒被改變,但不能確定簽名者和未加密報文內容之間的關系。對于先簽名后加密報文的接收方能夠假設簽名的報文本身未被改變,但是某些細致的攻擊者可能已更改了加密報文的未經鑒別的部分。
5.3.6 創建Certificates-only報文(Creating a Certificates-only Message)
Certificates-only報文或certificates-only MIME實體用來傳輸證書(諸如對注冊請求的響應),這種格式也能夠用來傳輸證書撤銷列表。
第一步:要使生成signedData類CMS對象的CMS生成進程能夠使用證書,signedData encapContentInfo eContent字段必須不存在,并且signerInfos字段必須為空。
第二步:將CMS signedData對象裝入application/pkcs7-mime MIME實體中。
certs-only報文的smime-type參數是“certs-only”。該類型報文的文件擴展是“.p7c”。
5.3.7 注冊請求(Registration Request)
對報文進行簽名的發送代理必須擁有簽名證書,以便接收代理能夠驗證簽名。
5.3.8 標識S/MIME報文(Identifying an S/MIME Message)
因為S/MIME考慮到在非MIME環境中的互操作性,采用了幾種不同的機制來攜帶類型信息,它成為標識S/MIME報文的一點點困難。表1列出了判斷報文是否是S/MIME報文的準則。如果某報文符合下列要求,則它可認為是S/MIME報文。表1中的文件后綴取自內容類型頭中的“名稱”參數或內容安排頭中“文件名”參數,給出文件后綴的這些參數未作為參數段的部分來列出。