我有一个。NET Core 3.1 C#应用程序,该应用程序通过HTTPS调用API(并将其公钥作为获取令牌的一部分,因为该证书稍后将用于解密单独发送回的信息)。在我们几乎所有的机器上,它都在工作,但是在一台Windows 8.1机器上,当我们尝试初始连接身份验证令牌时,我们会遇到以下一系列异常:
The SSL connection could not be established, see inner exception.
---> System.Security.Authentication.AuthenticationException: Authentication failed, see inner exception.
---> System.ComponentModel.Win32Exception (0x80090326): The message received was unexpected or badly formatted.
异常是从系统引发的。网Http。HttpClient。FinishSendAsyncBuffered
,因此我怀疑这是在HTTPS级别发生的,我们的证书内容在这里并不真正相关。
我们获取令牌的代码如下所示:
身份验证服务的构造函数:
public XXXXAuthService(IXXDbService dbService, XXXXApiConfig config)
{
_dbService = dbService;
_config = config;
// try forcing TLS1.2 for SSL connection exceptions thrown in some operating environments
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
_httpClient = new HttpClient {BaseAddress = new Uri(config.BaseUrl)};
_httpClient.DefaultRequestHeaders.Accept.Clear();
_httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
}
获取授权令牌的代码:
private async Task<string> GetXXXXBearerToken(string userId, DateTime creationTime)
{
var token = await GenerateProviderJwtForXXXX(userId, creationTime);
var kvp = new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("grant_type", "urn:ietf:params:oauth:grant-type:token-exchange"),
new KeyValuePair<string, string>("subject_token", token),
new KeyValuePair<string, string>("subject_token_type", "urn:ietf:params:oauth:token-type:jwt")
};
var data = new FormUrlEncodedContent(kvp);
var publicKey = await GetXXXXPublicKey();
_httpClient.DefaultRequestHeaders.Remove("X-XXXX-Public-Cert");
_httpClient.DefaultRequestHeaders.Add("X-XXXX-Public-Cert", publicKey);
var response = await _httpClient.PostAsync("Identity/token", data);
if (!response.IsSuccessStatusCode)
throw new Exception("XXXX Token Server Error: " + response.ReasonPhrase);
var result = await response.Content.ReadAsStringAsync();
var authResponse = JsonConvert.DeserializeObject<OAuthResponse>(result);
if (!string.IsNullOrEmpty(authResponse.access_token))
return authResponse.access_token;
System.Diagnostics.Trace.WriteLine("Token Exchange Result: " + result);
if (!string.IsNullOrEmpty(authResponse.error))
{
var outcome = new XXX.XXXX.Model.OperationOutcome();
outcome.Issue.Add(new XXX.XXXX.Model.OperationOutcome.IssueComponent()
{
//some code to throw an error is here
}
throw new XXX.XXXX.Rest.XXXXOperationException("Bearer Token Exchange failed", response.StatusCode);
}
不幸的是,对于这个特殊的错误,堆栈溢出或网络的其他部分的现有问题/建议似乎都没有帮助。它们主要是关于客户端和服务器之间的版本差异,这似乎不是这里的情况,因为我正在强制TLS 1.2(它是活动的,并在故障机器上启用)。
有趣的是,我可以通过HTTPS访问浏览器中的服务器URL,这表明问题出在我的代码上,而不是机器上,但它在其他任何地方都可以工作。
我已证实:
我需要在代码或机器上做些什么才能让这个调用在任何地方都起作用?
我试图解决的问题
我面临着一个简单的问题,为了帮助其他人,我总结道:
成功执行此代码并不意味着您的应用程序支持指定的协议版本,并且在稍后尝试建立连接时仍可能出现“SSL错误”:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
在我的例子中,我试图强制执行Tls13,但发现我的应用程序配置实际上不支持它:
net core 3.0
运行在Windows Server数据中心2019版1809上
因此,我必须将我的配置更改为以下配置,以支持我需要的协议版本:
netframework5.0
在windowsserverdatacenter2022操作系统构建20348.288上
我试图连接到一个endpoint,突然放弃了Tls 1.2支持(不知道为什么),从那时起只接受Tls 1.3。
我至少可以给你指出正确的方向…
同样的症状
我有一个小毛病。在IIS(Windows Server 2012 R2)上运行的NET Core 3.1 web应用程序在尝试使用TLS 1.2连接到另一台服务器时出现了完全相同的错误和stacktrace。我也有这样的症状,我可以连接浏览器(Chrome),但不能连接应用程序。(不过,如果能看看Internet Explorer浏览器是否工作,我会很感兴趣。)
根本原因
TLS握手失败,因为两台服务器无法就通用密码套件达成一致。(使用Wireshark,我发现当我的应用程序尝试连接时,它提供的密码套件比Chrome浏览器打电话时更为有限。)
解决方案
在我的案例中,我使用了IIS Crypto(一个小型免费工具:https://www.nartac.com/Products/IISCrypto/)在我的web应用服务器上启用其他密码套件。我下载并运行了IIS Crypto,在其“密码套件”选项卡上选中了其他密码套件,然后重新启动了机器。
其中一个新密码套件与我的应用程序和目标服务器配合使用,因此TLS握手成功,错误得到解决。
一个快速警告:一些密码套件比其他密码套件更安全,所以您需要阅读最佳实践。
如果您想进一步诊断故障,我建议您在机器上安装Wireshark(另一个免费工具:https://www.wireshark.org/#download)。NET Core应用程序。如果TLS握手失败是问题,您将看到一条消息,如:警报(级别:致命,描述:握手失败)
这篇关于wireshark输出的初级读本帮助了我:https://blog.catchpoint.com/2017/05/12/dissecting-tls-using-wireshark/
我正在尝试连接到需要配置双向SSL的API。我有我在postman中配置的证书和私钥,如下图所示。 这在Postman中工作得很好,但当我尝试使用HttpClient在C#中实现它时,SSL失败了。我得到的错误是“收到的消息是意外的或格式不正确的。”。我相信这与不正确的配置有关。 我引用了这篇StackOverflow文章来实现我的代码:将私钥与中的X509Certificate2类相关联。网 以
我使用的是PushSharp的2.1.2版本。该应用程序是。NET 4.5.1(虽然我也尝试过定位。NET 4.5和.网4) 我正在尝试通过沙箱Apple APNS发送推送消息,但没有成功。 我正在使用Ray Wenderlich的演练中提供的PHP脚本成功地发送消息,该脚本使用与我的PushSharp应用程序相同的证书并发送到相同的设备ID。 我已经通过从钥匙链导出完整的证书作为p12进行了测试
我使用Windows 10, Python 3.7.6.使用以下软件包: 我使用的MySQL数据库具有以下设置。该数据库是使用我公司内的IT云数据服务创建的。我下载了SSL证书并将它们放在我的django项目中。 现在,当我键入,我可以连接到数据库,一切正常。我可以看到DB支持SSL。 但是,当我键入python manage时。py runserver要启动服务器,我会遇到以下异常,我不知道如何
我试图连接到Kafka,从C#client启用TLS,在调用。不幸的是,到目前为止,互联网上的帖子都没有帮助我解决这个问题。你知道会出什么问题吗? 下面是我用来启动连接的最小样本C#代码
我试图解决这个问题已经有一段时间了,但我所尝试的一切都是无用的。我尝试了HttpClientHandler,但仍然得到了错误! 错误消息: 无法建立SSL连接,请参阅内部异常 身份验证失败,请参阅内部异常 收到的消息意外或格式不正确 我从零开始学习c#,而且我对c#语言非常熟悉,所以请解释一下问题所在。
问题内容: 我试图在同一个域下的子目录中设置两个(或多个)Django应用程序,例如: 我知道通常可以通过设置如下所示的apache虚拟主机来正常工作: 现在,我已经验证了每个站点都可以单独工作。但是,当我尝试同时运行两者时,apache将我发送到工作进程首先加载的任何站点。例: 重新启动配置为6个线程的Apache 加载example.com/site1/,获得正确的页面 加载example.c