如何创build防止“服务器模式SSL必须使用带有关联私钥的证书”exception的X509证书?

我正在尝试创build一个X.509证书文件,它可以在smtp4dev项目中find以下代码:

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创build了一个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安装程序生成的。 因为那个证书确实有效,尽pipe我不知道为什么。

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

当我比较这两个证书的属性时,smtp4dev证书与以下三种方式(除指纹和序列号外)不同,不同于IIS Express开发证书:

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

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

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

只有IIS Express开发证书适用于本问题开头所示的代码。 smtp4dev一个不。

其他的事情我尝试过

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

  2. 我已经尝试使用由openssl生成的自签名证书,并且只将Common Name设置为localhost但是我得到相同的exception(“服务器模式SSL必须使用具有关联私钥的证书”)。

  3. 将代码更改为使用X509Certificate2不是一种select,因为在应用补丁的情况下获得另一个smtp4dev版本将是非常耗时的,因为项目似乎没有被积极开发。

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

只有一件事情想起来:关键提供者兼容性。 看来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"