0

我正在尝试创建一个 X.509 证书文件,该文件将使用smtp4dev项目中的以下代码:

var certificate = new X509Certificate(Settings.Default.SSLCertificatePath);
var clientCertificateRequired = false;
var protocols = SslProtocols.Ssl2 | SslProtocols.Ssl3 | SslProtocols.Tls;
var checkRevocation = false;

var stream = new SslStream(stream);
stream.AuthenticateAsServer(certificate, clientCertificateRequired, protocols, checkRevocation);

Settings.Default.SSLCertificatePath指向 .cer 文件。

无论我尝试什么,都会失败并显示System.NotSupportedException以下消息:

服务器模式 SSL 必须使用具有关联私钥的证书。

我在提升的 PowerShell 会话中使用New-SelfSignedCertificate PowerShell CommandLet 创建了 X509 证书:

New-SelfSignedCertificate `
    -DnsName "localhost" `
    -CertStoreLocation "cert:\CurrentUser\My" `
    -FriendlyName "smtp4dev" `
    -TextExtension "2.5.29.37={text}1.3.6.1.5.5.7.3.1" `
    -KeyUsage DigitalSignature,KeyEncipherment,DataEncipherment `
    -Provider "Microsoft RSA SChannel Cryptographic Provider"

我添加了这些选项以尽可能接近地镜像已存储在我的机器上的证书,该证书由 IIS Express 安装程序生成。因为那个特定的证书确实有效,虽然我不知道为什么。

这两个证书都位于Local Computer > Personal证书存储中。对于这两个证书,证书管理器都提到“您有一个与此证书对应的私钥”。

当我比较这两个证书的属性时,smtp4dev 证书与 IIS Express 开发证书在以下 3 个方面不同(除了指纹和序列号):

  • 密钥用法被标记为关键扩展
  • 具有值的主题备用名称扩展DNS Name=localhost
  • 具有值的主题密钥标识符扩展e7 12 f5 ...

我使用证书管理器将两个证书导出到我的桌面,没有私钥作为“Base-64 编码的 x.509 (.CER)”文件。(包含私钥会将导出格式限制为 smtp4dev 不支持的 PKCS #12 (.PFX)。)

以这种方式导出证书后,当我双击它们时,都不会显示有关拥有私钥的消息。

只有 IIS Express 开发证书适用于本问题开头显示的代码。smtp4dev 没有。

我尝试过的其他事情:

  1. 我经常遇到使用 的教程makecert,但我没有那个程序。

  2. 我尝试使用由生成的自签名证书openssl并且仅将其设置Common Namelocalhost但我得到相同的异常(“服务器模式 SSL 必须使用具有关联私钥的证书”)。

  3. 更改代码以使用 X509Certificate2 不是一种选择,因为要获得另一个应用了补丁的 smtp4dev 版本会很耗时,因为该项目似乎没有得到积极开发。

  4. 尝试不同的证书文件格式(例如 PFX)实际上是可能的,只要我将文件重命名为 .cer,我就可以欺骗 smtp4dev 使用证书。这允许我在证书中包含私钥。它适用于 IIS Express 开发证书的导出,但不适用于 smtp4dev 证书的导出。

4

1 回答 1

2

我只想到一件事:密钥提供程序兼容性。似乎SslStream不支持 CNG KSP(密钥存储提供程序),它是 New-SelfSignedCertificate` cmdlet 的默认密钥提供程序类型。

我建议在 PowerShell 调用中明确指定任何旧提供程序:

New-SelfSignedCertificate `
    -DnsName "localhost" `
    -CertStoreLocation "cert:\LocalMachine\My" `
    -FriendlyName "smtp4dev" `
    -TextExtension "2.5.29.37={text}1.3.6.1.5.5.7.3.1" `
    -KeyUsage DigitalSignature,KeyEncipherment,DataEncipherment `
    -Provider "Microsoft RSA SChannel Cryptographic Provider"
于 2017-07-24T15:21:26.927 回答