如何:创建开发期间使用的临时证书

使用 Windows Communication Foundation (WCF) 开发安全服务或客户端时,经常需要提供 X.509 证书来用作凭据。 该证书通常是证书链的一部分,在计算机的受信任的根证书颁发机构存储区中可找到根证书颁发机构。 拥有一个证书链,使您可以限定一组证书,其中根证书颁发机构通常来自于您的组织或业务单元。 若要在开发时模拟此情况,请创建两个证书以满足安全要求。 第一个证书是自签名证书,放置在受信任的根证书颁发机构存储区中;第二个证书是从第一个证书创建的,放置在本地计算机位置的个人存储区中或当前用户位置的个人存储区中。 本主题将指导完成使用 PowerShell New-SelfSignedCertificate) cmdlet 创建这两个证书的步骤。

重要

New-SelfSignedCertificate cmdlet 生成的证书仅用于测试目的。 部署服务或客户程序时,请确保使用证书颁发机构提供的适当证书。 这可能来自组织或第三方的 Windows Server 证书服务器。

默认情况下,New-SelfSignedCertificate cmdlet 会创建自签名证书,这些证书不安全。 通过将自签名证书放置在受信任的根证书颁发机构存储区中,你可创建一个与你的部署环境更为类似的开发环境。

若要详细了解如何创建和使用证书,请参阅使用证书。 若要详细了解如何将证书用作凭据,请参阅保护服务和客户端。 有关使用 Microsoft Authenticode 技术的教程,请参阅 Authenticode Overviews and Tutorials(Authenticode 概述和教程)。

创建一个自签名根证书颁发机构证书并导出私钥

以下命令在当前用户个人存储中创建一个使用者名称为“RootCA”的自签名证书。

$rootCert = New-SelfSignedCertificate -CertStoreLocation Cert:\CurrentUser\My -DnsName "RootCA" -TextExtension @("2.5.29.19={text}CA=true") -KeyUsage CertSign,CrlSign,DigitalSignature

我们需要将该证书导出到 PFX 文件,以便可将其导入到稍后步骤中需要用到它的位置。 导出带私钥的证书时,需要使用密码来保护它。 我们将密码保存到 SecureString 中,并使用 Export-PfxCertificate cmdlet 将具有关联私钥的证书导出到 PFX 文件。 我们还使用 Export-Certificate cmdlet 仅将公共证书保存到 CRT 文件中。

[System.Security.SecureString]$rootCertPassword = ConvertTo-SecureString -String "password" -Force -AsPlainText
[String]$rootCertPath = Join-Path -Path 'cert:\CurrentUser\My\' -ChildPath "$($rootCert.Thumbprint)"
Export-PfxCertificate -Cert $rootCertPath -FilePath 'RootCA.pfx' -Password $rootCertPassword
Export-Certificate -Cert $rootCertPath -FilePath 'RootCA.crt'

创建一个由根证书颁发机构证书签名的新证书

以下命令使用颁发者的私钥创建一个由 RootCA 签名的证书,其使用者名称为“SignedByRootCA”。

$testCert = New-SelfSignedCertificate -CertStoreLocation Cert:\LocalMachine\My -DnsName "SignedByRootCA" -KeyExportPolicy Exportable -KeyLength 2048 -KeyUsage DigitalSignature,KeyEncipherment -Signer $rootCert

同样,我们将带有私钥的已签名证书保存到 PFX 文件中,仅将公钥保存到 CRT 文件中。

[String]$testCertPath = Join-Path -Path 'cert:\LocalMachine\My\' -ChildPath "$($testCert.Thumbprint)"
Export-PfxCertificate -Cert $testCertPath -FilePath testcert.pfx -Password $rootCertPassword
Export-Certificate -Cert $testCertPath -FilePath testcert.crt

在受信任的根证书颁发机构存储区中安装证书

创建自签名证书后,您可以将它安装到受信任的根证书颁发机构存储区中。 任何使用该证书签名的证书在此处都受计算机的信任。 为此,当您不再需要该证书时可立即将它从存储区中删除。 当您删除此根证书颁发机构证书时,则由它签名的所有其他证书将成为未经授权的。 根证书颁发机构证书只是一种机制,必要时可限定一组证书。 例如,在对等应用程序中,通常不需要根证书颁发机构,因为您只信任由对方提供的证书的个体标识。

在受信任的根证书颁发机构中安装自签名证书

  1. 打开证书管理单元。 有关详细信息,请参阅如何:使用 MMC 管理单元查看证书

  2. 打开要存储证书的文件夹, “本地计算机”“当前用户”

  3. 打开 “受信任的根证书颁发机构” 文件夹。

  4. 右击 “证书” 文件夹,再单击 “所有任务”,然后单击 “导入”

  5. 按照屏幕向导说明,将 RootCA.pfx 导入到存储区中。

在 WCF 中使用证书

一旦安装了临时证书,就可以使用这些证书开发指定证书作为客户端凭据类型的 WCF 解决方案。 例如,下面的 XML 配置指定消息安全模式,并指定证书作为客户端凭据类型。

指定证书作为客户端凭据类型

  1. 在服务的配置文件中,使用下面的 XML 将安全模式设置为消息,并将客户端凭据类型设置为证书。

    <bindings>
      <wsHttpBinding>
        <binding name="CertificateForClient">
          <security>
            <message clientCredentialType="Certificate" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    
  2. 在客户端的配置文件中,使用以下 XML 指定证书位于用户存储区中,且可通过在 SubjectName 字段中搜索“CohoWinery”值找到。

    <behaviors>
      <endpointBehaviors>
        <behavior name="CertForClient">
          <clientCredentials>
            <clientCertificate findValue="CohoWinery" x509FindType="FindBySubjectName" />
          </clientCredentials>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    

有关在 WCF 中使用证书的详细信息,请参阅 Working with Certificates

.NET Framework 安全性

请确保通过右击证书,再单击 “删除” ,从 “受信任的根证书颁发机构”“个人”文件夹中删除所有临时根证书颁发机构证书。

另请参阅