Как сделать взаимную аутентификацию TLS в C#

У меня есть настольное приложение. Я хотел бы отправить почтовый запрос на URL-адрес сервера, используя взаимную аутентификацию в C#. Я написал следующий код:-

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);

Теперь почтовый запрос вызывает исключение, что удаленное устройство принудительно закрывает соединение. я использовал wireshark и это показывает, что сертификат клиента в ответе клиента имеет нулевую длину. Даже если я не добавлю сертификат в WebRequestHandlerЯ получаю тот же ответ. Может кто-нибудь, пожалуйста, помогите мне решить эту проблему или направьте меня для возможных решений.

Скриншот для Wireshark

РЕДАКТИРОВАТЬ

Привет всем, я нашел проблему. Я должен установить сертификат клиента в местном магазине.

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

Однако я сталкиваюсь с проблемой, что если я не запускаю свое приложение от имени администратора, оно вызывает исключение прав доступа.

Если я использую StoreLocation::CurrentUser, всплывающее сообщение для подтверждения.

Может кто-нибудь предложить, как я могу использовать его с StoreLocation:: CurrentUser без запроса сообщения?

Кроме того, я буду очень признателен, если кто-то может предложить, если это правильный подход?

1 ответ

Решение

В соответствии с дизайном Windows вы не можете добавлять сертификаты в хранилище для каждого пользователя без приглашения. Вы можете добавить сертификаты в хранилище локального компьютера, но только при работе с правами администратора.

Вам нужно только один раз добавить сертификат в хранилище пользователя (например, при первом запуске или настройке).

Другие вопросы по тегам