SSL/TLS HTTPClient 错误

SSL/TLS error with HTTPClient

我正在尝试连接到使用正确签名的 SSL 证书的内部网站(在 Chrome 58 中工作)但是当我在 .Net 中执行此代码时它抛出错误:

The Request was aborted: Could not create SSL/TLS channel.

ServicePointManager.MaxServicePointIdleTime = 0;
ServicePointManager.Expect100Continue = true;
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
                    | SecurityProtocolType.Tls11
                    | SecurityProtocolType.Tls12
                    | SecurityProtocolType.Ssl3;

var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://internal-website");
request.Headers.Add("token", "---");
var result = client.SendAsync(request);
result.Wait();

我能想到的唯一原因是证书使用主题备用名称作为 DNS 名称(它有 4 个条目)并且 CN 与它们中的任何一个都不匹配,但它仍然适用于 Chrome 和邮递员。

我在创建 HttpClient 之前添加的代码是禁用 SSL 检查,但它没有任何想法如何调试这个问题?

排查了一番,原来是DHE密钥长度的问题。

.Net 和 IE 要求 DHE 大于或等于 1024,但对于此服务,密钥为 512。Reference to Microsoft KB

如果无法在服务器上更改密钥长度,您可以在用户计算机上更改注册表。

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\Diffie-Hellman] "ClientMinKeyBitLength"=双字:00000200