我正在尝试创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一个不。
其他的事情我尝试过
我经常遇到使用makecert
教程,但是我没有这个程序。
我已经尝试使用由openssl
生成的自签名证书,并且只将Common Name
设置为localhost
但是我得到相同的exception(“服务器模式SSL必须使用具有关联私钥的证书”)。
将代码更改为使用X509Certificate2不是一种select,因为在应用补丁的情况下获得另一个smtp4dev版本将是非常耗时的,因为项目似乎没有被积极开发。
尝试不同的证书文件格式(如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"