使用 TLS 1.2 从 HttpClient 连接到 Azure FrontDoor 后面的 API

Posted

技术标签:

【中文标题】使用 TLS 1.2 从 HttpClient 连接到 Azure FrontDoor 后面的 API【英文标题】:Connecting from HttpClient to API behind Azure FrontDoor using TLS 1.2 【发布时间】:2020-06-04 19:57:46 【问题描述】:

Azure Front Door 配置了最低 TLS 1.2。 后端 Azure 应用服务也配置为使用最低 TLS 1.2。

在 Windows Server 2012 R2 上使用以下代码运行 .Net Framework 4.7.1 控制台应用程序时:

class Program
    
        static async Task Main(string[] args)
        
             ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
             var client = new HttpClient();

            try
            

                var OK = await client.GetAsync("https://foo-appservice.azurewebsites.net/"); // App service.
                var NotOK = await client.GetAsync("https://foo.myfoo.io/"); // Front door.

            
            catch (Exception e)
            
               Console.WriteLine(e);
            

            Console.ReadKey();
        
    

我在第二次调用时收到以下异常。

An error occurred while sending the request.
The underlying connection was closed: An unexpected error occurred on a send.
Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.

但是,在同一台服务器上使用 curl 运行它是可行的:

curl https://foo.myfoo.io/ -i --tlsv1.2 --tls-max 1.2

相同的 .net 代码在我的其他 Windows 10 笔记本电脑上运行良好。

windows server box 调用失败的原因是什么?

编辑:

我认为这与自定义域有关,因为对前门分配的域执行简单的 GET 即可。

【问题讨论】:

【参考方案1】:

原来“某人”禁用了 Windows Server 上的许多密码套件。

我使用 wireshark 查看 TLS 握手,发现 Client Hello 中列出的密码套件与服务器不匹配。

因此,对于任何遇到 TLS 错误的人来说,看看 Wireshark 中的 TLS 握手是值得的!

【讨论】:

以上是关于使用 TLS 1.2 从 HttpClient 连接到 Azure FrontDoor 后面的 API的主要内容,如果未能解决你的问题,请参考以下文章

.Net Framework 4.6.1 不默认为 TLS 1.2

在 Node JS TLS 中添加/启用从 SSLv3 (DHE-RSA-AES256-SHA) 到 TLS 1.2 的密码

强制 HttpWebRequest 和 ClientWebSocket 使用 TLS 1.2

使用 httpclient 4.1.2 连接到 https 会产生 org.apache.http.client.ClientProtocolException

更新 .NET Web 服务以使用 TLS 1.2

如何在Apache HttpClient中设置TLS版本