微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何创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必须使用具有相关私钥的证书。

组类似的任务栏button

在收到所有POST数据之前,PHP脚本是否可以启动?

通过SetSecurityDescriptor设置WMI ACL

后台线程上的Windows Mobile C#数据集更新

该键集没有定义

我在升级的PowerShell会话中使用New-SelfSignedCertificate PowerShell CommandLet创build了一个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安装程序生成的。 因为那个证书确实有效,尽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证书。

来自.NET的关于文件path的奇怪行为

如何以编程方式closures或打开“Windowsfunction”

InvokeHelper()抛出Access被拒绝exception

DevExpress DataBinding,添加新logging

是否有可能通过关联的文件将命令行parameter passing给可执行文件

只有一件事情想起来:关键提供者兼容性。 看来SslStream不支持CNG KSP(密钥存储提供程序),它是New-SelfSignedCertificate` 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,DataEncipherment ` -Provider "Microsoft RSA SChannel Cryptographic Provider"

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐