问题描述
我有一个常见的RESTful API端点,有两个应用程序都在使用中-一个在.NET Core 3.1中,另一个在.NET Framework 4.7.2中。两者都使用类似的代码来检索证书(PFX文件),将该证书附加到HTTP处理程序,然后使用该处理程序创建HTTP客户端,如下所示:
var currentDirectory = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
X509Certificate2 cert = null;
var password = new Azurekeyvault(_configuration).getpassword(_secretUri).Result;
try
{
cert = new X509Certificate2(currentDirectory + _certName,password);
}
catch (Exception ex)
{
throw new Exception("Error trying to retrieve certificate named " + currentDirectory + _certName + " - exception was " + ex.Message);
}
var handler = new httpclienthandler();
handler.ClientCertificates.Add(cert);
var client = new HttpClient(handler);
var response = await client.SendAsync(request);
if (response.IsSuccessstatusCode)
{
var responseContent = await response.Content.ReadAsstringAsync();
return responseContent;
}
throw new ApplicationException($"Status code: {response.StatusCode},Error: {response.ReasonPhrase}");
.NET Core代码有效; .NET Framework代码没有。 .NET Framework出现一个例外,即无法建立SSL / TLS连接。使用Wireshark,我发现我确实使用了终结点所需的TLS 1.2。但是,.NET Core调用具有存在的证书,而.NET Framework调用则没有。
在.NET Framework方面对此进行了进一步研究,我发现证书上没有私钥。在.NET Core代码中,它可用(请参见下文)。
要检索的证书来自完全相同的目录,并且两者都在完全相同的计算机上运行。 我还应该提到.NET Core代码本身就是RESTful API。 .NET Framework代码是一个简单的控制台应用程序(因此消除了IIS的所有权限问题)。如果我在调试器的“ cert.GetRSAPrivateKey()”的“立即窗口”中进行调用,则会返回RSA密钥...因此,上面的屏幕截图可能只是调试器的症状。
我正在猜测 是.NET Framework方面缺少私钥的问题。或者,这与它无关。但是,归根结底,证书使用的是完全相同的代码,但证书位于.NET Core的数据包中,而不是.NET Framework的数据包中。我们当中许多人感到困惑,对此问题的任何想法将不胜感激。预先感谢!
编辑#1: 下面是调试器跟踪输出,显示-我相信-是.NET Framework,结论是没有可用于请求的证书:
System.Net @R_973_4045@ion: 0 : [14200] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_Security,context = 12ed470:6ee7d30,targetName = xxxx.xxx.com,inFlags = ReplayDetect,SequenceDetect,Confidentiality,AllocateMemory,InitManualCredValidation)
System.Net @R_973_4045@ion: 0 : [14200] InitializeSecurityContext(In-Buffers count=2,Out-Buffer length=0,returned code=CredentialsNeeded).
System.Net @R_973_4045@ion: 0 : [14200] SecureChannel#7894961 - We have user-provided certificates. The server has specified 1 issuer(s). Looking for certificates that match any of the issuers.
System.Net @R_973_4045@ion: 0 : [14200] SecureChannel#7894961 - Left with 0 client certificates to choose from.
以下是Wireshark条目,它们显示.NET Core调用上的证书,而不是.NET Framework调用上的证书:
.NET Core(正确):
Transport Layer Security
TLSv1.2 Record Layer: Handshake Protocol: Multiple Handshake Messages
Content Type: Handshake (22)
Version: TLS 1.2 (0x0303)
Length: 4262
Handshake Protocol: Certificate
Handshake Type: Certificate (11)
Length: 3924
Certificates Length: 3921
Certificates (3921 bytes)
Certificate Length: 1957
Certificate: ... <removed rest for brevity>
.NET Framework(不正确):
Transport Layer Security
TLSv1.2 Record Layer: Handshake Protocol: Multiple Handshake Messages
Content Type: Handshake (22)
Version: TLS 1.2 (0x0303)
Length: 77
Handshake Protocol: Certificate
Handshake Type: Certificate (11)
Length: 3
Certificates Length: 0
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)