我正在尝试使用客户端证书使用ssl和客户端身份验证来保护我的RESTful WebApi服务.
去测试; 我已生成一个自签名证书并放置在本地计算机,受信任的根证书颁发机构文件夹中,并且我已生成"服务器"和"客户端"证书.服务器的标准https无问题.
但是我在服务器中有一些代码来验证证书,当我使用提供客户端证书的测试客户端进行连接并且测试客户端返回403 Forbidden状态时,这永远不会被调用.
这实现了服务器在我的证书到达我的验证码之前失败了.但是,如果我启动提琴手它知道需要客户端证书并要求我提供一个到我的文档\ 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);
}
}
Run Code Online (Sandbox Code Playgroud)
任何想法为什么它会在提琴手但不是我的测试客户端?
编辑:这是GetClientCert()的代码
private static X509Certificate GetClientCert()
{
X509Store store = null;
try
{
store = new X509Store(StoreName.My, …Run Code Online (Sandbox Code Playgroud)