gpt4 book ai didi

c# - WebApi HttpClient 不发送客户端证书

转载 作者:IT王子 更新时间:2023-10-29 04:25:13 24 4
gpt4 key购买 nike

我正在尝试通过 ssl 和使用客户端证书的客户端身份验证来保护我的 RESTful WebApi 服务。

测试;我生成了一个自签名证书并放置在本地机器、受信任的根证书颁发机构文件夹中,并且生成了“服务器”和“客户端”证书。服务器的标准 https 可以正常工作。

但是我在服务器中有一些代码来验证证书,当我使用提供我的客户端证书的测试客户端连接并且测试客户端返回 403 禁止状态时,它永远不会被调用。

这意味着服务器在到达我的验证码之前没有通过我的证书。但是,如果我启动 fiddler,它知道需要客户端证书,并要求我向 My Documents\Fiddler2 提供一个。我给了它我在测试客户端中使用的相同客户端证书,我的服务器现在可以正常工作并收到我期望的客户端证书!这意味着 WebApi 客户端没有正确发送证书,我下面的客户端代码与我找到的其他示例几乎相同。

    static async Task RunAsync()
{
try
{
var handler = new WebRequestHandler();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.ClientCertificates.Add(GetClientCert());
handler.ServerCertificateValidationCallback += Validate;
handler.UseProxy = false;

using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri("https://hostname:10001/");

client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));

var response = await client.GetAsync("api/system/");
var str = await response.Content.ReadAsStringAsync();

Console.WriteLine(str);
}
} catch(Exception ex)
{
Console.Write(ex.Message);
}
}

知道为什么它可以在 fiddler 中工作但在我的测试客户端中不能工作吗?

编辑:这是 GetClientCert() 的代码

private static X509Certificate GetClientCert()
{
X509Store store = null;
try
{
store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);

var certs = store.Certificates.Find(X509FindType.FindBySubjectName, "Integration Client Certificate", true);

if (certs.Count == 1)
{
var cert = certs[0];
return cert;
}
}
finally
{
if (store != null)
store.Close();
}

return null;
}

虽然测试代码不处理空证书,但我正在调试以确保找到正确的证书。

最佳答案

有两种类型的证书。第一个是服务器所有者发送给您的公共(public) .cer 文件。这个文件只是一长串字符。第二个是 keystore 证书,这是您创建的自签名证书,并将 cer 文件发送到您调用的服务器,他们会安装它。根据您拥有的安全性,您可能需要将其中一个或两个添加到客户端(在您的情况下为处理程序)。我只看到在安全性非常安全的一台服务器上使用的 keystore 证书。此代码从 bin/deployed 文件夹中获取两个证书:

#region certificate Add
// KeyStore is our self signed cert
// TrustStore is cer file sent to you.

// Get the path where the cert files are stored (this should handle running in debug mode in Visual Studio and deployed code) -- Not tested with deployed code
string executableLocation = Path.GetDirectoryName(AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory);

#region Add the TrustStore certificate

// Get the cer file location
string pfxLocation = executableLocation + "\\Certificates\\TheirCertificate.cer";

// Add the certificate
X509Certificate2 theirCert = new X509Certificate2();
theirCert.Import(pfxLocation, "Password", X509KeyStorageFlags.DefaultKeySet);
handler.ClientCertificates.Add(theirCert);
#endregion

#region Add the KeyStore
// Get the location
pfxLocation = executableLocation + "\\Certificates\\YourCert.pfx";

// Add the Certificate
X509Certificate2 YourCert = new X509Certificate2();
YourCert.Import(pfxLocation, "PASSWORD", X509KeyStorageFlags.DefaultKeySet);
handler.ClientCertificates.Add(YourCert);
#endregion

#endregion

此外 - 您需要处理证书错误(注意:这很糟糕 - 它说所有证书问题都可以)您应该更改此代码以处理特定的证书问题,例如名称不匹配。它在我的 list 上。有很多关于如何执行此操作的示例。

这段代码在你的方法的顶部

// Ignore Certificate errors  need to fix to only handle 
ServicePointManager.ServerCertificateValidationCallback = MyCertHandler;

你类(class)某处的方法

private bool MyCertHandler(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors error)
{
// Ignore errors
return true;
}

关于c# - WebApi HttpClient 不发送客户端证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22197762/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com