尝试读取 .NET Core 端点时,带有证书的 Http 客户端请求会引发异常

问题描述 投票:0回答:1

我有一个 ASP.NET Core Web API 主机,它在 kestrel Web 主机服务器上运行。我正在尝试添加基于客户端证书的身份验证。从 .NET Core 文档中我了解到,通过添加以下代码,它可以使服务器端验证传入请求,它应该具有证书。

builder.WebHost.ConfigureKestrel(options =>
{
    options.ConfigureHttpsDefaults(defaultOptions =>
    {
        defaultOptions.ClientCertificateMode = ClientCertificateMode.RequireCertificate;
    });
});

我运行了主机。从 Postman 中,我尝试调用端点,但它返回了一个错误,因此我在 Postman 设置中附加了一个证书,然后再次尝试,它起作用了,从此我清楚地了解到服务器端工作正常(带有证书)工作但没有证书就不行)。

我通过

HttpClient
从 .NET Core 控制台应用程序尝试了相同的端点。但这没有用。相反,它会抛出异常:

发送请求时发生错误。

System.IO.IOException:无法从传输连接读取数据:已建立的连接被主机中的软件中止..

这是我用来调用 API 端点的代码:

var httpHandler = new HttpClientHandler();
httpHandler.ClientCertificates.Add(new X509Certificate2("C:\\path\\to\\myCert.crt", "mypassword"));

try
{
    using (var client = new HttpClient(httpHandler))
    {
        var requestMessage = new HttpRequestMessage()
        {
            RequestUri = new Uri("https://localhost:7221/weatherforecast"),
            Method = HttpMethod.Get
        };

        var response = await client.SendAsync(requestMessage);

        if (response.IsSuccessStatusCode)
        {
            var content = await response.Content.ReadAsStringAsync();
            Console.WriteLine(content);
        }
    }
}
catch(Exception ex)
{
    Console.WriteLine(ex.ToString());
}

Console.ReadLine();

我不知道我真正错过了什么。我几乎尝试了一切。

authentication asp.net-core-webapi dotnet-httpclient client-certificates
1个回答
0
投票

发现问题了,由于异常明确表示无法从连接读取数据,所以我在想我错过了添加什么,这是ssl连接所需要的。因此,仔细研究邮递员应用程序中的请求参数,我发现我添加了证书、私钥和密码短语,但在 .netcore 应用程序中我只添加了证书和密码短语。所以我丢失了私钥。为了确认这一点,我从邮递员应用程序中删除了私钥并发起了请求,正如预期的那样,请求失败了。

现在,在 .netcore 中我需要添加私钥。为此,我们不能将私钥的路径作为参数传递给 X509Certificate2 对象,而是必须首先通过组合证书、私钥和密码短语来创建 pfx 文件。现在,将 pfx 文件路径作为参数添加到 X509Certificate2 对象实例。

就是这样,成功了。

仅供参考,您可以通过在 cli 或在线生成器中使用 openssl 命令来生成 pfx 文件(注意:仅出于开发目的执行此操作)

谢谢你

© www.soinside.com 2019 - 2024. All rights reserved.