仅在 Azure 上:无法创建 SSL/TLS 安全通道
本文关键字:SSL TLS 安全 通道 创建 Azure 仅在 | 更新日期: 2023-09-27 17:57:08
我在 Azure 应用程序上运行应用程序 标准:1 个小型计划。框架是 4.6.1
此应用程序正在调用受 SSL 保护的 API。SSL由StartCom Class 1 DV Server CA发布,我的本地浏览器告诉我证书有效。
如果我在本地计算机上运行该应用程序,一切正常。但是,当部署到 azure 时,它会失败并显示以下错误:
System.Net.Http.HttpRequestException:发送时出错 请求。---> System.Net.WebException:请求已中止: 无法创建 SSL/TLS 安全通道。
at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult 阿)
---内部异常堆栈跟踪---结束
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task 任务)
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task 任务)
代码:
public async Task<List<QutationOverview>> GetAll(string url, DateTime lastActionDate)
{
var result = string.Empty;
try
{
var userName = await _settingManager.GetSettingValueAsync("API.UserName");
var password = await _settingManager.GetSettingValueAsync("API.Password");
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls |
SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
ServicePointManager
.ServerCertificateValidationCallback +=
(sender, cert, chain, sslPolicyErrors) => true;
//Add date filter
//Always request qutations where the last action took place >= Yesterday
var requestUrl =
$"GetALL/?last_action_date={lastActionDate.AddDays(-1).ToString("yyyy-MM-dd")}&format=json";
var baseAddress = new Uri(url);
var credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{userName}:{password}"));
Logger.InfoFormat("GetAllQuotationsAsync for url {0}{1}", url, requestUrl);
using (var httpClient = new HttpClient {BaseAddress = baseAddress})
{
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", credentials);
using (var response = await httpClient.GetAsync(requestUrl))
{
result = await response.Content.ReadAsStringAsync();
Logger.Info(result);
}
}
}
catch (Exception ex)
{
Logger.ErrorFormat("GetAllQuotationsAsync {0}: {1}", url, ex);
}
var data = JsonConvert.DeserializeObject<List<QutationOverview>>(result);
return data;
}
如您所见,我跳过了证书的验证并添加了安全协议。
但是,请求仍然失败。
这是被俘虏的回应http://textuploader.com/5ers0
你知道如何让这个在 Azure 上运行吗?
我在 Azure 的应用程序服务上托管客户端证书时遇到了此错误。修复是在应用程序设置中设置WEBSITE_LOAD_CERTIFICATES。
可以将其设置为"*"以允许所有证书,也可以定义要允许的特定证书指纹。在此处查看更多信息。
捕获 TLS 握手。如果您的ServerHello丢失,则很可能没有带有遥控器的通用密码套件。
通过 https://www.ssllabs.com/ssltest/运行这两个密码,以检查两端支持的密码套件。对于Windows Server,密码套件只能全局启用或禁用(客户端/服务器组件之间没有区别),因此这就是为什么这是一个很好的测试。
更新:在我的推理中发现了一个明显的问题,应用服务有一个前端层,这就是 TLS 终止的地方,因此以这种方式比较密码无处可去。
相反,运行
Get-TlsCipherSuite
从Kudu的PowerShell,并将密码与远程API进行比较(您可以在 https://ssllabs.com/ssltest 检查其密码)。您应该至少有一个匹配项。
如果不匹配,则需要切换到云服务或 VM,并启用至少一个远程使用的密码套件。必须朝这个方向走通常意味着一件事 - 您的遥控器正在使用弱加密(SSL 3.0或TLS 1.0与RC4),您应该与这些公民聊天,或者找到摇摆TLS 1.2的新公民。
从您的 System.Net 跟踪:
[8356] 00000000 : 15 03 03 00 02
这是致命握手错误的字节序列,它建立在我没有共同密码理论的基础上。
注意第一个字节(0x15
):
Record Type Values dec hex
-------------------------------------
CHANGE_CIPHER_SPEC 20 0x14
ALERT 21 0x15
HANDSHAKE 22 0x16
APPLICATION_DATA 23 0x17