Сертификат клиента с HttpClient в c # - PullRequest
4 голосов
/ 06 октября 2019

Хотите отправить данные с сертификатом клиента (.p12 или .pfx) из приложения Windows на серверный компьютер, приложение Windows разработано в .Net Framework 4.6, ОС - это windows 10.

При попадании почтальона с клиентомсертификат (.p12 или .pfx) [Загружен во вкладке настроек -> Добавить сертификат клиента -> поставить имя хоста, выбрать файл pfx, поставить пароль], все работает правильно (сертификат клиента отправляется на сервер), но выдается снизу c # code,

X509Certificate2 certificate = new X509Certificate2(certificateFilePath, "password");
WebRequestHandler handler = new WebRequestHandler();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.ServerCertificateValidationCallback = (a, b, c, d) => { return true; };
handler.ClientCertificates.Add(certificate);


HttpClient request = new HttpClient(handler);
request.DefaultRequestHeaders.Add("User-Agent", UserAgent);
// added other headers and data
var result = request.PostAsync(url, byteContent).Result;
string resultContent = result.Content.ReadAsStringAsync().Result;

Также перекрестная проверка с фидлером на предмет попадания Почтальона и удара C #.

Когда сервер не получает сертификат клиента, возвращается ошибка 403.

Ответы [ 2 ]

3 голосов
/ 13 октября 2019

Я предполагаю, что ваш обработчик не имеет доступа к закрытому ключу для аутентификации.

Это может быть вызвано строкой 1 в вашем примере, в которой вы импортируете сертификат с флагами хранилища ключей по умолчанию. Конечно, это всего лишь предположение, и у меня нет вашего сертификата, чтобы проверить это, но вы можете проверить это, вызвав

// Sample for RSA, use DSA if required
var privateKeyParams = ((RSA)certificate.PrivateKey).ExportParameters(true);

, что вызовет CryptographicException («Не поддерживается» или аналогичный), еслиключевые параметры недоступны.

Для загрузки сертификата попробуйте следующее:

X509Certificate2 certificate = new X509Certificate2(
  certificateFilePath, "password",
  X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.UserKeySet);

Просто еще один sidenote;Если вы используете это в рабочем коде, обязательно расширьте обратный вызов проверки сертификата сервера (ваша 4-я строка), чтобы фактически проверить сертификат сервера. См. X509Chain.Build , который также позволяет вам изменять параметры проверки в соответствии с вашими потребностями (что на самом деле делает проверка пути, можно прочитать в RFC5280 ).

3 голосов
/ 12 октября 2019

Код 403 HttpStatus может быть вызван проблемами TLS из-за отсутствия вызова API с ожидаемой версией TLS сервера. Вы можете проверить результат resultContent из строки кода string resultContent = result.Content.ReadAsStringAsync().Result;

Чтобы установить SslProtocol, либо вы можете установить на Handler, как (если вы нацелены на .Net 4.7 и далее или ядро ​​.Net)

WebRequestHandler handler = new WebRequestHandler();
handler.SslProtocols = SslProtocols.Tls13 | SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls;

или на уровне приложения с использованием ServicePointManager в методе запуска (или .NET Framework версии до 4.7)

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls13 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

Дополнительное замечание - я бы предложил вам использовать чистый async /жду образец. Не используйте синхронизирующий вызов для запроса ввода-вывода, вызывая .Result.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...