自签名证书:私钥问题

Posted

技术标签:

【中文标题】自签名证书:私钥问题【英文标题】:Self signed certificate: Private key questions 【发布时间】:2017-03-21 16:51:09 【问题描述】:

要通过 SslStream 实现 TLS 加密,我使用的是自签名证书。 对于从较旧的 Win2003 机器连接的客户端,我遇到了奇怪的“无通用算法”错误。

阅读this thread后,我发现了以下内容:

如果我更改我的证书生成程序(更具体地说:私钥生成部分),这些错误就会消失:

旧:

     var privateKey = new CX509PrivateKey();
     privateKey.ProviderName = "Microsoft Base Cryptographic Provider v1.0";
     privateKey.MachineContext = true;
     privateKey.Length = 2048;
     privateKey.KeySpec = X509KeySpec.XCN_AT_SIGNATURE
     privateKey.ExportPolicy = X509PrivateKeyExportFlags.XCN_NCRYPT_ALLOW_PLAINTEXT_EXPORT_FLAG;
     privateKey.Create();

新:

     var privateKey = new CX509PrivateKey();
     privateKey.ProviderName = "Microsoft Base Cryptographic Provider v1.0";
     privateKey.MachineContext = true;
     privateKey.Length = 1024;
     privateKey.KeySpec = X509KeySpec.XCN_AT_KEYEXCHANGE; 
     privateKey.ExportPolicy = X509PrivateKeyExportFlags.XCN_NCRYPT_ALLOW_PLAINTEXT_EXPORT_FLAG;
     privateKey.Create();

我的问题(可能听起来很愚蠢,很抱歉;我对 TLS & co 还很陌生):

哪些算法在具有此 keySpec 值的私钥上进行中继?我可以在某处看到 SslStream 采用了哪些算法吗? 为什么我必须将密钥长度减少到 1024?上面的任何值都会导致调用 Create() 时发生异常。 这些更改是否会给我带来安全风险? 也欢迎任何关于修复Win2K03机器的建议...

【问题讨论】:

【参考方案1】:

Microsoft Base Cryptographic Provider v1.0 是最受限制的加密提供程序。对于 AT_EXCHANGE,它仅限于 1024 位 RSA,每 https://msdn.microsoft.com/en-us/library/windows/desktop/bb931357(v=vs.85).aspx。

您的 TLS 错误可能来自 SChannel 库想要在 AT_EXCHANGE 模式下使用 RSA 密钥,即使在使用 RSA 签名但不是 RSA 加密的密码套件上,因为您的两个文件在密钥规范和值方面都不同。

Microsoft Enhanced RSA and AES Cryptographic Provider 是最新的(在 XP SP3 中添加)CSP,如果您更改为该 CSP,您应该能够使 RSA AT_EXCHANGE 密钥的长度最长为 16384(尽管这样做需要几个小时,所以您可能想要坚持你的 2048)。

【讨论】:

以上是关于自签名证书:私钥问题的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个自签名的SSL证书

自签名证书:私钥问题

如何创建一个自签名的SSL证书

如何创建一个自签名的SSL证书

WCF 中的自签名证书问题 - 必须具有私钥

简便方法创建自签名证书