共用方式為


SignedCms 訊息

CMS/PKCS #7 提供 SignedCms 類別,讓您為訊息加上數位簽章。

若替訊息進行數位簽章,則可利用套用實體「驗證」和資料「完整性」等安全性服務的方式保護訊息。實體驗證可以高度證實宣稱為訊息作者或傳送者的實體,的確是該實體。實體可以是個人、軟體應用程式或其他任何具有唯一識別的來源。

資料完整性可以高度證實訊息本身未經過任何方式的修改,包括刪除或複製。

請使用 SignedCms 類別對訊息套用這兩個安全性服務之一,或是兩者均套用。如果您的目的是驗證訊息傳送者或作者的高度可能性,或是訊息在儲存或傳輸時未被修改,或兩者都想驗證時,請使用這個類別。

使用 S/MIME 安全性標準的電子郵件,即為使用 SignedCms 類別來提供安全性的一個範例。除了其他安全性服務,S/MIME 還具備確認電子郵件訊息收件者真正身份,以及檢查訊息本身完整性的能力。

一個訊息可以有數個簽章。文件撰寫和閱讀應用程式,即為需要此種能力的應用程式範例。使用 CMS/PKCS #7 支援的多重簽章功能,應用程式便能允許參與文件撰寫的每一位作者都簽署該文件。它也能讓文件閱讀者驗證宣稱為作者的人是否為此文件真正的作者,以及文件簽署之後是否未遭到修改。

請使用 SignedCms 類別的其中一個 ComputeSignature 方法來計算訊息簽章。System.Security.Cryptography.Pkcs.SignedCms.ComputeSignature(System.Security.Cryptography.Pkcs.CmsSigner) 方法要求應用程式必須先設定訊息簽署者的特性,方式為建構 CmsSigner 物件。CmsSigner 類別存放了簽署者的 X509 憑證及其他屬性。System.Security.Cryptography.Pkcs.SignedCms.ComputeSignature 方法會顯示對話方塊,讓使用者選取適當簽署者的憑證。

System.Security.Cryptography.Pkcs.CmsSigner.Certificates 屬性中可以包含完整或部分的簽署者憑證鏈結。設定 System.Security.Cryptography.Pkcs.CmsSigner.IncludeOption 屬性將影響要包括之憑證鏈結的多寡。

SignedCms 訊息可以是「非分離」或「分離」的。Boolean 屬性 System.Security.Cryptography.Pkcs.SignedCms.Detached 決定訊息是否為分離訊息。非分離的 SignedCms 訊息中含有已簽署的訊息。分離的 SignedCms 訊息中則沒有已簽署訊息,但含有訊息的其他所有屬性,例如簽章和屬性 (Attribute)。文件閱讀應用程式即為可能使用分離之 SignedCms 訊息的範例之一。此時請儘量不要複製大型已簽署文件的存放區,切勿使它除了主要儲存位置之外,還另外儲存在 SignedCms 訊息中。簽署大量內容的應用程式較常使用分離的 SignedCms 訊息。

CMS/PKCS #7 支援「副署」功能。副署是指另一個數位簽章的數位簽章。因此,它只證明簽章 (而非訊息內容) 的真實性。數位簽章可以由多位副署者副署。然而,CMS/PKCS #7 只支援單一層級的副署。副署本身不能再被副署。數位公證服務即為可能使用副署之應用程式的範例之一。

請使用 SignerInfo 類別的其中一個 ComputeCounterSignature 方法來計算副署。System.Security.Cryptography.Pkcs.SignedCms.SignerInfos 屬性是簽署訊息時所產生之 SignerInfo 物件的集合。ComputeCounterSignature 方法的作用方式類似 SignedCms 類別的 ComputeSignature 方法。

SignedCms 訊息可以具有關聯的簽章特定屬性。這些屬性可以是已簽署或未簽署。

簽署的屬性 (Attribute) 放入訊息內的方式,是將它設定到適當簽署者的 System.Security.Cryptography.Pkcs.CmsSigner.SignedAttributes 屬性 (Property) 中。簽署者的簽章計算出來之後,簽署的屬性便會加上此簽章以及 System.Security.Cryptography.Pkcs.SignedCms.ContentInfo 屬性的內部內容。當訊息在 System.Security.Cryptography.Pkcs.SignerInfo.SignedAttributes 屬性 (Property) 中為來自 System.Security.Cryptography.Pkcs.SignedCms.SignerInfos 屬性 (Property) 的適用簽署者進行簽署之後,即有簽署的屬性 (Attribute) 可用。Pkcs9SigningTime 簽署時間屬性即為有用之簽署屬性的範例之一。這個屬性含有簽署訊息的時間。

未簽署的屬性 (Attribute) 放入訊息內的方式,是將它設定到適當簽署者的 System.Security.Cryptography.Pkcs.CmsSigner.UnsignedAttributes 屬性 (Property) 中。這些屬性並沒有簽署,因此無法視為具有真實性或完整性。當訊息在 System.Security.Cryptography.Pkcs.SignerInfo.UnsignedAttributes 屬性 (Property) 中為來自 System.Security.Cryptography.Pkcs.SignedCms.SignerInfos 屬性 (Property) 的適用簽署者進行簽署之後,即有未簽署的屬性 (Attribute) 可用。副署即為 CMS/PKCS #7 內部使用之未簽署屬性的範例之一。由於它已是一種類型的簽章,因此不需要再簽署一次。另一個未簽署屬性的例子是文件描述,它可以在 Pkcs9DocumentDescription 類別中找到。

請使用 SignedCms 類別的其中一個 CheckSignature 方法,來驗證訊息簽章、副署和簽署屬性。SignedCms 訊息含有驗證所需的簽署者憑證。簽章驗證可以驗證或不驗證簽署者的憑證,視這些方法之 verifySignatureOnly 參數的值而定。

若要驗證分離的 SignedCms 訊息,請先將訊息內容關聯到 SignedCms 訊息。方式是以訊息內容建構 ContentInfo 物件,然後再以它建構 SignedCms 物件,例如您可以使用 SignedCms 建構函式來建構。將第二個參數設為 true,指出該訊息為分離訊息。將編碼後的 SignedCms 訊息解碼,以便使用 Decode 方法進行驗證。最後,請以先前所述的方式檢查簽章。

如需使用 SignedCms 訊息的程式碼範例,請參閱使用 System.Security.Cryptography.Pkcs

請參閱

工作

HOW TO:由一位簽署者簽署訊息
HOW TO:由多位簽署者簽署一個訊息
HOW TO:副署訊息

參考

CmsSigner
SignedCms
SignerInfo

概念

HOW TO:簽署和封套訊息
CMS/PKCS #7 訊息的類型

Footer image

Copyright © 2007 by Microsoft Corporation. All rights reserved.