自签名证书:私钥问题
Self signed certificate: Private key questions
为了通过 SslStream 实施 TLS 加密,我使用的是自签名证书。
对于从旧 Win2003 计算机连接的客户端,我遇到了奇怪的 "no common algorithm" 错误。
阅读 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 机器的建议...
Microsoft Base Cryptographic Provider v1.0
是最受限制的加密提供程序。对于 AT_EXCHANGE,根据 https://msdn.microsoft.com/en-us/library/windows/desktop/bb931357(v=vs.85).aspx.
,它仅限于 1024 位 RSA
你的 TLS 错误可能来自 SChannel 库想要在 AT_EXCHANGE 模式下使用 RSA 密钥,即使在使用 RSA 签名但不是 RSA 加密的密码套件上也是如此,因为你的两个文件在 keyspec 和值。
Microsoft Enhanced RSA and AES Cryptographic Provider
是最新的(在 XP SP3 中添加的)CSP,如果您更改为它,您应该能够制作最长 16384 的 RSA AT_EXCHANGE 密钥(尽管这需要数小时这样做,所以你可能想坚持使用 2048)。
为了通过 SslStream 实施 TLS 加密,我使用的是自签名证书。 对于从旧 Win2003 计算机连接的客户端,我遇到了奇怪的 "no common algorithm" 错误。
阅读 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 机器的建议...
Microsoft Base Cryptographic Provider v1.0
是最受限制的加密提供程序。对于 AT_EXCHANGE,根据 https://msdn.microsoft.com/en-us/library/windows/desktop/bb931357(v=vs.85).aspx.
你的 TLS 错误可能来自 SChannel 库想要在 AT_EXCHANGE 模式下使用 RSA 密钥,即使在使用 RSA 签名但不是 RSA 加密的密码套件上也是如此,因为你的两个文件在 keyspec 和值。
Microsoft Enhanced RSA and AES Cryptographic Provider
是最新的(在 XP SP3 中添加的)CSP,如果您更改为它,您应该能够制作最长 16384 的 RSA AT_EXCHANGE 密钥(尽管这需要数小时这样做,所以你可能想坚持使用 2048)。