c# - 限制密码套件的编程方式

标签 c# .net ssl encryption

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

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

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

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

Cipher Suite

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(在不同的外部方),我想避免机器级别的全局变化。有什么办法可以以编程方式限制密码列表吗?

最佳答案

对于那些仍然在这个问题上挣扎的人。
我有同样的问题,我的自动测试(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 .
带有 header 的 GET 请求到 HTTPS 端点的结果代码如下所示:

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;
        }
希望有人会发现它有帮助。谢谢 :)

关于c# - 限制密码套件的编程方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57192567/

相关文章:

php - Laravel 强制 SSL 给出 'This webpage has a redirect loop'

url - 如何在我网站的网址上制作这个?

c# - 无法从 Web 应用程序访问 Azure 公共(public)和私有(private)证书

c# - ASP.NET 的编码性能增强

c# - 何时使用 DebuggerDisplayAttribute

c# - .NET 中的单例在所有 session 之间共享吗?

ssl - 浏览器上的 requestClientCertificate 错误

C# Datagridview 最后一个索引越界

C# MVC-发布一个包含字典的 View 模型

c# - 根据参数类型调用函数