如何在C#中进行相互tls认证

时间:2017-06-19 14:24:30

标签: c# httpwebrequest dotnet-httpclient mutual-authentication

我有我的桌面应用程序。我想在C#中使用相互身份验证向服务器URL发送post请求。我写了以下代码: -

System::Net::ServicePointManager::SecurityProtocol = SecurityProtocolType::Tls12;
WebRequestHandler ^ clientHandler = gcnew WebRequestHandler();
X509Certificates::X509Certificate2^ modCert = gcnew X509Certificates::X509Certificate2("Dev.pfx", "test");
clientHandler->ClientCertificates->Add(cerInter);
clientHandler->AuthenticationLevel = System::Net::Security::AuthenticationLevel::MutualAuthRequested;
clientHandler->ClientCertificateOptions = ClientCertificateOption::Manual;
httpClient = gcnew HttpClient(clientHandler);
HttpContent ^ httpContent = gcnew ByteArrayContent(state->postBody);
httpContent->Headers->ContentType = gcnew MediaTypeHeaderValue("application/octet-stream");
resultTask = httpClient->PostAsync(state->httpRequest, httpContent);

现在,post请求抛出异常,即远程主机强行关闭连接。我使用了wireshark,它表明客户端响应中的客户端证书长度为零。即使我没有在WebRequestHandler中添加任何证书,我也会得到相同的回复。有人可以帮我解决这个问题或指导我寻找可能的解决方案。

Screenshot for wireshark

编辑

大家好,我发现了这个问题。我必须在本地商店设置客户端证书。

X509Certificates::X509Store store(X509Certificates::StoreName::Root, X509Certificates::StoreLocation::LocalMachine);
            store.Open(X509Certificates::OpenFlags::ReadWrite);;
            store.Add(cerInter); 

但是,我面临的问题是,如果我不以管理员身份运行我的应用程序,那么它会抛出访问权限异常。

如果我使用StoreLocation :: CurrentUser,它会弹出消息以供批准。

有人可以建议,如何在不提示消息的情况下将其与StoreLocation :: CurrentUser一起使用?

除此之外,如果有人建议,如果这是正确的做法,我将非常感激。

1 个答案:

答案 0 :(得分:0)

通过Windows'如果没有提示,您无法在每个用户的商店中添加证书。您可以将证书添加到本地计算机存储,但仅限于以管理权限运行时。

您只需将证书添加到用户的商店一次(例如,在首次运行或设置期间)。