仅在azure上:无法创建SSL/TLS安全通道
我在Azure应用程序上运行应用程序Standard:1 Small plan。框架是4.6.1仅在azure上:无法创建SSL/TLS安全通道
此应用程序调用一个SSL安全的API。 SSL由StartCom Class 1 DV Server CA发布,我的本地浏览器告诉我该证书是有效的。
如果我在本地机器上运行应用程序,一切正常。然而,部署到Azure时失败,follwing错误:
System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)
--- End of inner exception stack trace ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task 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;
}
正如你可以看到我跳过证书的验证和添加的安全协议。
但是,请求仍然失败。
这里是caputred响应 http://textuploader.com/5ers0
你有任何想法如何获得这一个在Azure上工作?
捕获TLS握手。如果你的ServerHello丢失了,你最有可能没有使用远程的通用密码套件。
通过https://www.ssllabs.com/ssltest/运行两个检查两端支持的密码套件。对于Windows Server,密码套件只能在全局范围内启用或禁用(因为客户端/服务器组件之间没有区别),所以这就是为什么这是一个很好的测试。
UPDATE:发现在我的推理突出的问题,应用服务有一个前端层而这也正是TLS终止,所以比较这种方式去无处密码。
取而代之的是,从捻的PowerShell中运行
Get-TlsCipherSuite
和比较反对您的远程API的密码(其中你可以在https://ssllabs.com/ssltest检查过的密码)。你至少应该有一场比赛。
如果没有匹配,您需要切换到云服务或虚拟机,并启用至少一个远程讲话的密码套件。必须走这个方向通常意味着一件事 - 您的远程使用弱密码学(SSL 3.0或TLS 1.0与RC4),您应该与这些公民聊天,或者找到正在摇晃TLS 1.2的新公民。
从您的System.Net跟踪:
[8356] 00000000 : 15 03 03 00 02
这对Fatal Handshake Error字节序列,它建立在我的没有共同的密码理论。
注意的第一个字节(0x15
):
Record Type Values dec hex
-------------------------------------
CHANGE_CIPHER_SPEC 20 0x14
ALERT 21 0x15
HANDSHAKE 22 0x16
APPLICATION_DATA 23 0x17
谢谢,我删除了ServicePointManager .ServerCertificateValidationCallback + =(sender,cert,chain,sslPolicyErrors)=> true;并添加了ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 ;.然而,错误仍然相同 –
嗯..使用最近'curl'和'--tlsv1.x'并检查远程是否真的支持TLS 1.2:https://curl.haxx.se/docs/manpage。 HTML# - tlsv10。尝试捕获TLS握手ClientHello + ServerHello(Wireshark或System.Net跟踪),将其发布到此处,这有助于找到根本原因。 – evilSnobu
我在主帖中附加了wireshark响应。这有帮助吗? –
相关:HTTP://计算器。com/questions/34437473/could-not-create-ssl-tls-secure-channel-in-an-azure-web-application?rq = 1 –
textuploader.com链接现在已损坏。 –