.NET Framework与.NET Core-将证书添加到RESTful API调用中只能在一个方法中进行,{而不是在另一个方法中

问题描述

我有一个常见的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(正确)

.NET Core screenshot

.NET Framework(不正确)

.NET Framework screenshot

要检索的证书来自完全相同的目录,并且两者都在完全相同的计算机上运行。 我还应该提到.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 (将#修改为@)