我正在尝试创建一个 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:CurrentUserMy" `
-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 快速开发证书在以下 3 个方面有所不同(除了指纹和序列号(:
- 密钥用法标记为关键扩展
- 值为
DNS Name=localhost
的主题备用名称扩展 - 具有值
e7 12 f5 ...
的主题密钥标识符扩展
我将两个证书导出到我的桌面,没有私钥作为"Base-64 编码的 x.509 (.CER("文件,使用证书管理器。(包括私钥会将导出格式限制为 PKCS #12 (.PFX(,不受 smtp4dev 支持。
以这种方式导出证书后,当我双击它们时,两者都不会显示有关拥有私钥的消息。
只有 IIS 快速开发证书在此问题开头所示的代码中工作。smtp4dev 没有。
我尝试过的其他事情:
我经常遇到使用
makecert
的教程,但我没有该程序。我尝试使用
openssl
生成的自签名证书,并且仅将Common Name
设置为localhost
,但我得到了相同的异常("服务器模式SSL必须使用具有关联私钥的证书"(。更改代码以使用 X509Certificate2 不是一种选择,因为获取应用了补丁的另一个 smtp4dev 版本将非常耗时,因为该项目似乎没有积极开发。
尝试不同的证书文件格式(例如 PFX(实际上是可能的,只要我将文件重命名为.cer就可以诱骗 smtp4dev 使用该证书。这允许我在证书中包含私钥。它适用于 IIS Express 开发证书的导出,但不适用于 smtp4dev 证书的导出。
只有一件事浮现在脑海中:密钥提供程序兼容性。似乎SslStream
不支持 CNG KSP(密钥存储提供程序(,这是新自签名证书 cmdlet 的默认密钥提供程序类型。
我建议在PowerShell调用中显式指定任何旧提供程序:
New-SelfSignedCertificate `
-DnsName "localhost" `
-CertStoreLocation "cert:LocalMachineMy" `
-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"