共用方式為


使用數位憑證

為了設計 Windows Communication Foundation (WCF) 安全性,X.509 數位證書通常用於驗證客戶端和伺服器、加密和數位簽署訊息。 本主題簡短說明 X.509 數字證書功能,以及如何在 WCF 中使用它們,並包含進一步說明這些概念或示範如何使用 WCF 和憑證完成一般工作的主題連結。

簡言之,數位證書是 公鑰基礎結構 (PKI)的一部分,它是數位證書、證書頒發機構單位和其他註冊授權單位的系統,可透過公鑰密碼編譯來驗證和驗證參與電子交易的每一方的有效性。 證書頒發機構單位發行憑證,而且每個憑證都有一組字段,其中包含數據,例如 主體 (憑證發行所在的實體)、有效日期(憑證有效時)、簽發者(簽發憑證的實體),以及公鑰。 在 WCF 中,每一個這些屬性都會以 Claim 的形式來處理,而每個宣告會進一步分割成兩種類型:身分識別和許可權。 如需 X.509 憑證的詳細資訊,請參閱 X.509 公鑰憑證。 如需 WCF 中宣告和授權的詳細資訊,請參閱 使用身分識別模型管理宣告和授權。 如需實作 PKI 的詳細資訊,請參閱 使用 Windows Server 2012 R2 Active Directory 憑證服務的企業 PKI

憑證的主要功能是向其他人驗證憑證擁有者的身分識別。 憑證包含擁有者的 公鑰 ,而擁有者則保留私鑰。 公鑰可用來加密傳送至憑證擁有者的訊息。 只有擁有者可以存取私鑰,因此只有擁有者可以解密這些訊息。

憑證必須由證書頒發機構單位發行,這通常是憑證的第三方簽發者。 在 Windows 網域上,包含證書頒發機構單位,可用來將憑證發行給網域上的計算機。

檢視憑證

若要使用憑證,通常必須檢視憑證並檢查其屬性。 這很容易使用 Microsoft Management Console (MMC) 嵌入式管理單元工具來完成。 如需詳細資訊,請參閱 如何:使用 MMC 嵌入式管理單元檢視憑證

證書存儲

憑證可在商店中找到。 目前有兩個主要商店,並進一步劃分為子商店。 如果您是電腦上的系統管理員,您可以使用 MMC 嵌入式管理單元工具來檢視這兩個主要存放區。 非系統管理員只能檢視目前的使用者存放區。

  • 本機電腦存放區。 此內容包含機器程序(如 ASP.NET)所存取的憑證。 使用此位置來儲存向客戶端驗證伺服器的憑證。

  • 目前的使用者資料庫。 互動式應用程式通常會在這裡為計算機的目前使用者放置憑證。 如果您正在建立用戶端應用程式,這通常是您放置憑證以驗證用戶對服務的地方。

這兩家商店進一步分為子商店。 使用 WCF 進行程式設計時,其中最重要的包括:

  • 受信任的根憑證授權單位。 您可以使用此存放區中的憑證來建立憑證鏈結,其可追溯到此存放區中的證書頒發機構單位憑證。

    這很重要

    本地電腦會隱含信任此存放區中的任何憑證,即使憑證不是來自受信任的第三方證書頒發機構。 基於這個理由,除非您完全信任簽發者並瞭解後果,否則請勿將任何憑證放入此存放區。

  • 個人。 此存放區用於與計算機使用者相關聯的憑證。 此存放區通常用於 "受信任的根憑證授權機構" 存放區中其中一個憑證頒發機構所簽發的憑證。 或者,這裡找到的憑證可能是應用程式自我發行和信任的。

如需證書存儲的詳細資訊,請參閱 證書存儲

選擇商店

選取儲存憑證的位置取決於服務或客戶端執行的方式和時機。 適用下列一般規則:

  • 如果 WCF 服務裝載於 Windows 服務中,請使用 本機電腦 存放區。 請注意,需要系統管理員許可權才能將憑證安裝到本機計算機存放區。

  • 如果服務或用戶端是使用者帳戶下執行的應用程式,請使用 目前的使用者 存放區。

訪問商店

市集受到訪問控制清單 (ACL) 的保護,就像計算機上的資料夾一樣。 建立由 Internet Information Services (IIS) 裝載的服務時,ASP.NET 進程會在 ASP.NET 帳戶下執行。 該帳戶必須能夠存取包含服務所使用憑證的存放區。 每個主要商店都受到預設存取清單的保護,但這些清單可以修改。 如果您建立個別的角色來存取商店,則必須授與該角色存取權限。 若要瞭解如何使用 WinHttpCertConfig.exe 工具來修改存取清單,請參閱 如何:建立暫存憑證以供開發期間使用

信任鏈和證書授權機構

憑證會建立在階層中,其中每個個別憑證都會連結到發行憑證的 CA。 此連結是 CA 的憑證。 CA 的憑證接著會連結到發行原始 CA 憑證的 CA。 此過程會重複執行,直到到達根 CA 的憑證為止。 根 CA 的憑證原本就受信任。

數位證書是用來透過依賴此階層來驗證實體,也稱為 信任鏈結。 您可以使用 MMC 嵌入式管理單元來檢視任何憑證的鏈,方法是按兩下任何憑證,然後點選 憑證路徑 索引標籤。如需匯入憑證授權機構的憑證鏈的詳細資訊,請參閱 如何:指定用來驗證簽章的憑證授權機構憑證鏈

備註

任何簽發者都可以透過將簽發者的憑證放置於受信任的根憑證存放庫中,來指定為受信任的根憑證授權機構。

停用鍊式信任

建立新的服務時,您可能會使用不是由受信任的根證書簽發的憑證,或者簽發憑證本身可能不在受信任的根證書授權單位存放區中。 僅供開發之用,您可以暫時停用檢查憑證信任鏈結的機制。 若要這樣做,請將 CertificateValidationMode 屬性設定為 PeerTrustPeerOrChainTrust。 任一模式指定憑證可以是自我發行(對等信任)或信任鏈結的一部分。 您可以在下列任何類別上設定 屬性。

班級 房產
X509ClientCertificateAuthentication X509ClientCertificateAuthentication.CertificateValidationMode
X509PeerCertificateAuthentication X509PeerCertificateAuthentication.CertificateValidationMode
X509ServiceCertificateAuthentication X509ServiceCertificateAuthentication.CertificateValidationMode
IssuedTokenServiceCredential IssuedTokenServiceCredential.CertificateValidationMode

您也可以使用組態來設定 屬性。 下列元素可用來指定驗證模式:

自訂驗證

屬性 CertificateValidationMode 也可讓您自定義憑證的驗證方式。 根據預設,層級會設定為 ChainTrust。 若要使用 Custom 值,您也必須將 CustomCertificateValidatorType 屬性設定為用來驗證憑證的元件和類型。 若要建立自定義驗證程式,您必須繼承自抽象 X509CertificateValidator 類。

建立自定義驗證器時,最重要的方法是覆寫 Validate。 如需自定義驗證的範例,請參閱 X.509 憑證驗證程式 範例。 如需詳細資訊,請參閱 自定義認證和認證驗證

使用 PowerShell New-SelfSignedCertificate Cmdlet 來建置憑證鏈結

PowerShell New-SelfSignedCertificate Cmdlet 會建立 X.509 憑證和私鑰/公鑰組。 您可以將私鑰儲存到磁碟,然後使用它來發行和簽署新的憑證,從而模擬鏈結憑證的階層。 Cmdlet 僅供開發服務時作為協助使用,且絕對不應該用來建立實際部署的憑證。 開發 WCF 服務時,請使用下列步驟來建置與 New-SelfSignedCertificate Cmdlet 的信任鏈結。

  1. 使用 New-SelfSignedCertificate Cmdlet 建立暫存根授權單位(自我簽署)憑證。 將私鑰儲存至磁碟。

  2. 使用新的憑證來發行另一個包含公鑰的憑證。

  3. 將根權威憑證匯入信任的根憑證授權者存儲區。

  4. 如需逐步指示,請參閱 如何:建立暫存憑證以供開發期間使用

要使用哪一個憑證?

憑證的常見問題是應該使用哪種憑證,以及使用它的原因。 答案取決於您是針對客戶端或服務進行程序設計。 下列資訊提供一般指導方針,並非這些問題的詳盡解答。

服務憑證

服務憑證具有向客戶端驗證伺服器的主要工作。 當客戶端驗證伺服器時,其中一個初始檢查是將 [主體 ] 字段的值與用來連絡服務的統一資源標識碼 (URI) 進行比較:兩者的 DNS 必須相符。 例如,如果服務的 URI 是 http://www.contoso.com/endpoint/則 [主旨 ] 欄位也必須包含 值 www.contoso.com

請注意,欄位可以包含數個值,每個值前面都會加上初始化來指出值。 最常見的是,一般名稱的初始化是 “CN”,例如 CN = www.contoso.com。 [ 主體 別名] 字段也可以空白,在此情況下, [主體別名 ] 字段可以包含 DNS 名稱 值。

另請注意,憑證的 [預定用途 ] 字段的值應該包含適當的值,例如「伺服器驗證」或「客戶端驗證」。

客戶端憑證

客戶端憑證通常不會由第三方證書頒發機構單位發行。 相反地,目前使用者位置的個人存放區通常會包含根授權單位所放置的憑證,其目的為「客戶端驗證」。 需要相互驗證時,用戶端可以使用這類憑證。

在線撤銷和離線撤銷

憑證有效性

每個憑證只有效一段時間,稱為 有效期間。 有效期間是由 X.509 憑證的 [有效] 和 [ 有效到 ] 字段所定義。 在驗證期間,會檢查憑證,以判斷憑證是否仍在有效期間內。

憑證撤銷清單

在有效期間的任何時間,證書頒發機構單位都可以撤銷憑證。 這可能會因為許多原因而發生,例如憑證私鑰遭到入侵。

當發生這種情況時,任何從撤銷的憑證遞減的鏈結也無效,而且在驗證程序期間不受信任。 若要找出哪些憑證被撤銷,每個簽發者都會發佈時間及日期戳記 證書吊銷清單 (CRL)。 透過將以下類別的RevocationModeDefaultRevocationMode屬性設定為其中一個X509RevocationMode列舉值,即可使用在線撤銷或離線撤銷來檢查清單:X509ClientCertificateAuthenticationX509PeerCertificateAuthenticationX509ServiceCertificateAuthenticationIssuedTokenServiceCredential類別。 所有屬性預設值為 Online

您也可以在組態中使用revocationMode屬性,為<驗證>(在<serviceBehaviors>的)和<驗證>(在<endpointBehaviors>的)設定模式。

SetCertificate 方法

在 WCF 中,您通常必須指定服務或用戶端用來驗證、加密或數位簽署訊息的憑證或憑證集。 您可以使用代表 X.509 憑證的各種類別方法,以程式設計方式 SetCertificate 執行這項作。 下列類別會使用 SetCertificate 方法來指定憑證。

班級 方法
PeerCredential SetCertificate
X509CertificateInitiatorClientCredential SetCertificate
X509CertificateRecipientServiceCredential SetCertificate
X509CertificateInitiatorServiceCredential
SetCertificate

方法 SetCertificate 的運作方式是指定存放位置和存放區、指定憑證欄位內的「尋找」類型(x509FindType 參數),以及要在欄位中尋找的值。 例如,下列程式代碼會建立ServiceHost實例,並設定用於向客戶端驗證服務的服務憑證,使用SetCertificate方法。

Uri baseAddress = new Uri("http://cohowinery.com/services");
ServiceHost sh = new ServiceHost(typeof(CalculatorService), baseAddress );
sh.Credentials.ServiceCertificate.SetCertificate(
StoreLocation.LocalMachine, StoreName.My,
X509FindType.FindBySubjectName, "cohowinery.com");
Dim baseAddress As New Uri("http://cohowinery.com/services")
Dim sh As New ServiceHost(GetType(CalculatorService), baseAddress)
sh.Credentials.ServiceCertificate.SetCertificate( _
StoreLocation.LocalMachine, StoreName.My, _
X509FindType.FindBySubjectName, "cohowinery.com")

具有相同值的多個憑證

存放區可能包含多個具有相同主體名稱的憑證。 這表示如果您指定 x509FindTypeFindBySubjectNameFindBySubjectDistinguishedName,而且有多個憑證具有相同值,則會擲回例外狀況,因為無法區分所需的憑證。 您可以將 設定 x509FindTypeFindByThumbprint,以減輕這種情況。 指紋欄位包含唯一值,可用來在存放區中尋找特定憑證。 不過,這有自己的缺點:如果憑證被撤銷或更新,則 SetCertificate 方法會失敗,因為指紋也會消失。 或者,如果憑證不再有效,驗證就會失敗。 減輕這種情況的方法,是將 參數設定 x590FindTypeFindByIssuerName ,並指定簽發者的名稱。 如果不需要特定的簽發者,您也可以設定其中一個其他 X509FindType 列舉值,例如 FindByTimeValid

組態中的憑證

您也可以使用組態來設定憑證。 如果您正在建立服務,認證(如憑證)會在 <serviceBehaviors> 中指定。 當您編寫用戶端程式時,憑證會在 <endpointBehaviors> 之下指定。

將憑證對應至用戶帳戶

IIS 和 Active Directory 的一項功能是能夠將憑證對應至 Windows 用戶帳戶。 如需此功能的詳細資訊,請參閱 將憑證對應至用戶帳戶

如需使用 Active Directory 映射的詳細資訊,請參閱 使用目錄服務映射來映射客戶端憑證

開啟此功能後,您可以將 類別的 MapClientCertificateToWindowsAccount 屬性設定X509ClientCertificateAuthenticationtrue。 在組態中,您可以將 mapClientCertificateToWindowsAccount 元素的 < 屬性設定為 >,如下列程式碼所示。

<serviceBehaviors>
 <behavior name="MappingBehavior">
  <serviceCredentials>
   <clientCertificate>
    <authentication certificateValidationMode="None" mapClientCertificateToWindowsAccount="true" />
   </clientCertificate>
  </serviceCredentials>
 </behavior>
</serviceBehaviors>

將 X.509 憑證對應至代表 Windows 用戶帳戶的令牌會被視為提高許可權,因為一旦對應,Windows 令牌就可以用來取得受保護資源的存取權。 因此,網域政策要求 X.509 憑證在映射之前必須符合該政策。 SChannel 安全性套件會強制執行這項需求。

使用 .NET Framework 3.5 或更新版本時,WCF 會先確保憑證符合網域原則,再對應至 Windows 帳戶。

在WCF的第一個版本中,不需要諮詢網域原則,即可完成對應。 因此,如果啟用對應,且 X.509 憑證不符合網域原則,則第一個版本下執行時所使用的舊版應用程式可能會失敗。

另請參閱