限制密码套件的编程方式

ydo*_*oow 4 .net c# encryption ssl

我的 C# 程序正在使用 TLS 1.2 调用外部 API。

这是我将其限制为 TLS 1.2 的方法

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Run Code Online (Sandbox Code Playgroud)

此外,API 进一步将密码套件限制为以下内容

密码套件

TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384

我做了进一步的研究,发现这可以通过更改运行机器上的网络配置来实现。

https://www.c-sharpcorner.com/forums/change-cipher-suitetlsecdheecdsawithaes256gcmsha384

但是我的机器有多个程序调用不同的 API(在不同的外部方),我想避免机器级别的全局更改。有什么方法可以以编程方式限制密码列表吗?

Dmi*_*hin 6

对于那些仍然为这个问题苦苦挣扎的人。

我遇到了同样的问题,我的自动测试(dotnetcore3.1)在 WS 2012 R2 计算机上运行,​​我必须调用仅接受两个密码套件的第三方 API:TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f) TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (0xc030)。

C# HttpClient 依赖于主机系统中的密码套件,而 Chrome、Firefox 和 Curl 则拥有自己的安全和加密系统。WS 2012 R2 没有这两个密码,我不知道如何将它们添加到计算机上,也没有使用这些密码的 Windows 更新。

我选择使用一个非常酷的 Nuget 数据包CurlThin作为解决方案。使用它我们可以为请求设置我们自己的密码套件,因此我们不需要对服务器端执行任何操作。

我安装了两个数据包:CurlThin本身和CurlThin.Native
向 HTTPS 端点发送带有标头的 GET 请求的结果代码如下所示:

using CurlThin;
using CurlThin.Enums;
using CurlThin.Helpers;
using CurlThin.Native;
using CurlThin.SafeHandles;
using System.Text;

        private static string GetToken()
        {
            //This string is for extracting libcurl and ssl libs to the bin directory.
            CurlResources.Init();
            var global = CurlNative.Init();
            var easy = CurlNative.Easy.Init();
            string content;

            try
            {
                var dataCopier = new DataCallbackCopier();

                CurlNative.Easy.SetOpt(easy, CURLoption.URL, "https://someendpoints.net/thatendpoint?fake=true");
                CurlNative.Easy.SetOpt(easy, CURLoption.WRITEFUNCTION, dataCopier.DataHandler);
                //This string is needed when you call a https endpoint.
                CurlNative.Easy.SetOpt(easy, CURLoption.CAINFO, CurlResources.CaBundlePath);

                var headers = CurlNative.Slist.Append(SafeSlistHandle.Null, "Authorization: Bearer blablabla");
                CurlNative.Easy.SetOpt(easy, CURLoption.HTTPHEADER, headers.DangerousGetHandle());
                //Your set of ciphers, full list is here https://curl.se/docs/ssl-ciphers.html
                CurlNative.Easy.SetOpt(easy, CURLoption.SSL_CIPHER_LIST, "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256");

                CurlNative.Easy.Perform(easy);

                content = Encoding.UTF8.GetString(dataCopier.Stream.ToArray());
            }
            finally
            {
                easy.Dispose();

                if (global == CURLcode.OK)
                    CurlNative.Cleanup();
            }
            return content;
        }
Run Code Online (Sandbox Code Playgroud)

希望有人会觉得它有帮助。谢谢 :)