HTTPS SSL 连接不受信任,尽管证书很好
HTTPS SSL Connection not trusted, despite certificate being fine
我在 Windows 2012 R2 IIs 8.5 上托管了 2 个站点。
一个是 umbraco 的实例,而另一个是基于 .Net 核心的 api(我们称之为 MyApi)。
我想在 umbraco 上执行某些搜索操作,所以 umbraco 调用 api,它回调 Umbraco/Api。调用 MyApi 没问题,但是从 MyApi 调用 Umbraco/Api 是有问题的。 Umbraco api 日志:
搜索失败System.Net.Http.HttpRequestException: 发送请求时出错。 ---> System.Net.WebException:底层连接已关闭:无法为 SSL/TLS 安全通道建立信任关系。 ---> System.Security.Authentication.AuthenticationException: 根据验证程序,远程证书无效。
证书本身由我们客户的内部权限提供,这是服务器存储中的受信任根。现在我们原来的证书有问题,因为它们错过了我们用于 api 调用的第一个 DNS 记录(DNS 记录尚未创建,我们在 'hosts' 中使用记录)但现在应该是固定的.
我更新了代码中的 SSL 错误处理程序,以便它在 SSL 枚举中记录错误和编号。
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
System.Net.ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) =>
{
_logger.LogError("Received TLS errror " + ((int)sslPolicyErrors).ToString());
return false;
};
_logger.LogDebug("Search starting");
if (model.Username != null)
{
model.Favourites = _workplaceContext.GetUserFavourites(_dataContext, model.Username);
}
else if (model.JustFavourites)
{
return BadRequest();
}
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(_configuration.GetValue<string>("UmbracoApiUrl"));
_logger.LogDebug("Searching for addres " + new Uri(_configuration.GetValue<string>("UmbracoApiUrl")));
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
var json = JsonConvert.SerializeObject(model);
using (var stringContent = new StringContent(json, Encoding.UTF8, "application/json"))
{
var response = await client.PostAsync("workplace/search", stringContent);
if (response.IsSuccessStatusCode)
{
_logger.LogDebug("Search API Call success");
var jsonResponse = await response.Content.ReadAsStringAsync();
var responseModel = JsonConvert.DeserializeObject<SearchResponseModel>(jsonResponse);
_logger.LogDebug("Search response TotalCount = " + responseModel.TotalCount);
return responseModel;
}
else
{
_logger.LogDebug("Search API Call status - " + response.StatusCode);
return StatusCode((int)response.StatusCode);
}
}
}
最初我们收到了 2 号错误。现在我们只收到0号,应该没问题。尽管如此,连接仍然无法正常工作。我已经阅读了各种关于此的文章,并通过在 umbraco 的网络配置中启用了故障排除,但没有找到任何有用的信息。我需要对 MyApi 进行故障排除的方法。有人能给我一个指导,说明如何像 umbraco 一样详细地解决它吗(我对 .NET 核心应用程序不太熟悉)?
错误日志中有趣的部分:
2019-07-08 13:35:32.1745||DEBUG|XXXApi.Controllers.WorkplaceController|Search starting
2019-07-08 13:35:32.1901||DEBUG|XXXApi.Controllers.WorkplaceController|Searching for addres https://xxx.yy.zz/umbraco/api/
2019-07-08 13:35:32.2682||ERROR|XXXCApi.Controllers.WorkplaceController|Received TLS errror 0
2019-07-08 13:35:32.2682||ERROR|XXXApi.Controllers.WorkplaceController|Search failed System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.WebException: The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel. ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.
at System.Net.TlsStream.EndWrite(IAsyncResult asyncResult)
at System.Net.PooledStream.EndWrite(IAsyncResult asyncResult)
at System.Net.ConnectStream.WriteHeadersCallback(IAsyncResult ar)
--- End of inner exception stack trace ---
解决方案:原来的错误在证书中并得到修复,但是我用于调试的回调返回false导致标记连接不成功的问题。花了大约 2 天的时间才弄明白。所以从我在枚举中得到 0 的那一刻起,这只是我调试代码中的错误。
哦,别忘了退订代表。
我在 Windows 2012 R2 IIs 8.5 上托管了 2 个站点。 一个是 umbraco 的实例,而另一个是基于 .Net 核心的 api(我们称之为 MyApi)。 我想在 umbraco 上执行某些搜索操作,所以 umbraco 调用 api,它回调 Umbraco/Api。调用 MyApi 没问题,但是从 MyApi 调用 Umbraco/Api 是有问题的。 Umbraco api 日志:
搜索失败System.Net.Http.HttpRequestException: 发送请求时出错。 ---> System.Net.WebException:底层连接已关闭:无法为 SSL/TLS 安全通道建立信任关系。 ---> System.Security.Authentication.AuthenticationException: 根据验证程序,远程证书无效。
证书本身由我们客户的内部权限提供,这是服务器存储中的受信任根。现在我们原来的证书有问题,因为它们错过了我们用于 api 调用的第一个 DNS 记录(DNS 记录尚未创建,我们在 'hosts' 中使用记录)但现在应该是固定的.
我更新了代码中的 SSL 错误处理程序,以便它在 SSL 枚举中记录错误和编号。
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
System.Net.ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) =>
{
_logger.LogError("Received TLS errror " + ((int)sslPolicyErrors).ToString());
return false;
};
_logger.LogDebug("Search starting");
if (model.Username != null)
{
model.Favourites = _workplaceContext.GetUserFavourites(_dataContext, model.Username);
}
else if (model.JustFavourites)
{
return BadRequest();
}
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(_configuration.GetValue<string>("UmbracoApiUrl"));
_logger.LogDebug("Searching for addres " + new Uri(_configuration.GetValue<string>("UmbracoApiUrl")));
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
var json = JsonConvert.SerializeObject(model);
using (var stringContent = new StringContent(json, Encoding.UTF8, "application/json"))
{
var response = await client.PostAsync("workplace/search", stringContent);
if (response.IsSuccessStatusCode)
{
_logger.LogDebug("Search API Call success");
var jsonResponse = await response.Content.ReadAsStringAsync();
var responseModel = JsonConvert.DeserializeObject<SearchResponseModel>(jsonResponse);
_logger.LogDebug("Search response TotalCount = " + responseModel.TotalCount);
return responseModel;
}
else
{
_logger.LogDebug("Search API Call status - " + response.StatusCode);
return StatusCode((int)response.StatusCode);
}
}
}
最初我们收到了 2 号错误。现在我们只收到0号,应该没问题。尽管如此,连接仍然无法正常工作。我已经阅读了各种关于此的文章,并通过在 umbraco 的网络配置中启用了故障排除,但没有找到任何有用的信息。我需要对 MyApi 进行故障排除的方法。有人能给我一个指导,说明如何像 umbraco 一样详细地解决它吗(我对 .NET 核心应用程序不太熟悉)?
错误日志中有趣的部分:
2019-07-08 13:35:32.1745||DEBUG|XXXApi.Controllers.WorkplaceController|Search starting
2019-07-08 13:35:32.1901||DEBUG|XXXApi.Controllers.WorkplaceController|Searching for addres https://xxx.yy.zz/umbraco/api/
2019-07-08 13:35:32.2682||ERROR|XXXCApi.Controllers.WorkplaceController|Received TLS errror 0
2019-07-08 13:35:32.2682||ERROR|XXXApi.Controllers.WorkplaceController|Search failed System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.WebException: The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel. ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.
at System.Net.TlsStream.EndWrite(IAsyncResult asyncResult)
at System.Net.PooledStream.EndWrite(IAsyncResult asyncResult)
at System.Net.ConnectStream.WriteHeadersCallback(IAsyncResult ar)
--- End of inner exception stack trace ---
解决方案:原来的错误在证书中并得到修复,但是我用于调试的回调返回false导致标记连接不成功的问题。花了大约 2 天的时间才弄明白。所以从我在枚举中得到 0 的那一刻起,这只是我调试代码中的错误。
哦,别忘了退订代表。