首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何创建防止“服务器模式SSL必须使用带关联私钥的证书”异常的X509证书?

如何创建防止“服务器模式SSL必须使用带关联私钥的证书”异常的X509证书?
EN

Stack Overflow用户
提问于 2017-07-24 05:11:35
回答 1查看 6.4K关注 0票数 0

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

代码语言:javascript
运行
AI代码解释
复制
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必须使用带有关联私钥的证书。

我在提升的X509会话中使用新-自签署证书 PowerShell CommandLet创建了一个PowerShell证书:

代码语言:javascript
运行
AI代码解释
复制
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开发证书有以下三种不同之处(除了拇指打印和序列号):

  • 键使用被标记为关键扩展。
  • 带有值DNS Name=localhost的主题可选名称扩展
  • 带有值e7 12 f5 ...的主题密钥标识符扩展

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

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

只有IIS速成开发证书在此问题开始时显示的代码中工作。而smtp4dev则不这样做。

我试过的其他事情:

  1. 我经常遇到使用makecert的教程,但我没有那个程序。
  2. 我尝试使用openssl生成的自签名证书,并且只将Common Name设置为localhost,但我得到了相同的异常(“服务器模式SSL必须使用带有关联私钥的证书”)。
  3. 更改代码以使用X509Certificate2并不是一种选择,因为在应用修补程序的情况下获得另一个smtp4dev版本是很费时的,因为项目似乎没有得到积极的开发。
  4. 尝试不同的证书文件格式(例如PFX)实际上是可能的,只要我将文件重命名为.cer,我就可以欺骗smtp4dev使用证书。这允许我在证书中包含私钥。它适用于IIS开发证书的导出,但不适用于smtp4dev证书的导出。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-24 07:21:26

想到的只有一件事:关键提供者兼容性。SslStream似乎不支持CNG (密钥存储提供程序),这是的默认密钥提供程序类型。

我建议在PowerShell调用中显式指定任何遗留提供程序:

代码语言:javascript
运行
AI代码解释
复制
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"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45281590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档