如何在 C# 中进行双向 tls 身份验证
How to do mutual tls authentication in C#
我有我的桌面应用程序。我想在 C# 中使用相互身份验证将 post 请求发送到服务器 URL。我写了以下代码:--
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 一起使用?
除此之外,如果有人能提出建议,如果这是正确的方法,我将不胜感激?
根据 Windows 的设计,您无法在没有提示的情况下将证书添加到每用户存储中。您可以将证书添加到本地计算机存储,但前提是 运行 管理权限。
您应该只需要将证书添加到用户的存储中一次(例如,在第一次 运行 或设置期间)。
我有我的桌面应用程序。我想在 C# 中使用相互身份验证将 post 请求发送到服务器 URL。我写了以下代码:--
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 一起使用?
除此之外,如果有人能提出建议,如果这是正确的方法,我将不胜感激?
根据 Windows 的设计,您无法在没有提示的情况下将证书添加到每用户存储中。您可以将证书添加到本地计算机存储,但前提是 运行 管理权限。
您应该只需要将证书添加到用户的存储中一次(例如,在第一次 运行 或设置期间)。