HttpClient с клиентским сертификатом плохо работает в LinuxC#

Место общения программистов C#
Ответить
Anonymous
 HttpClient с клиентским сертификатом плохо работает в Linux

Сообщение Anonymous »

Я сформировал запрос следующим образом:

Код: Выделить всё

var url = "https://api.the.url.com/path/ver/endpoint";
var certFile = "TheFile.pfx";
var certPass = "ThePassword";

var cert = new X509Certificate2(
Path.Combine(AppContext.BaseDirectory, certFile),
certPass, X509KeyStorageFlags.MachineKeySet);

var handler = new SocketsHttpHandler();
handler.SslOptions.ClientCertificates = new X509CertificateCollection();
handler.SslOptions.ClientCertificates.Add(cert);
handler.SslOptions.LocalCertificateSelectionCallback = (_,_,_,_,_) => cert;

var httpClient = HttpClientFactory.Create(handler);
var result = await httpClient.GetAsync(url);
result.EnsureSuccessStatusCode();
Это иногда не удается в Windows, но в Linux это происходит всегда:

Не удалось установить SSL-соединение, см. внутреннее исключение.

Невозможно записать данные в транспортное соединение: сброс соединения одноранговым узлом.

Сброс соединения одноранговым узлом

Когда я посмотрел TCP-трафик, рукопожатие прекращается, когда (мной) клиент подтверждает обмен ключами сервера на сервере/Привет, сервер готов.:
Отказ от ответственности: это дамп трафика Windows, я все еще работаю над его внедрением в Linux

Код: Выделить всё

TCP        66    44222 → 443 [SYN, ECE, CWR] Seq=0 Win=64240 Len=0 MSS=1460 WS=256 SACK_PERM
TCP        66    443 → 44222 [SYN, ACK, ECE] Seq=0 Ack=1 Win=14600 Len=0 MSS=1436 WS=1 SACK_PERM
TCP        54    44222 → 443 [ACK] Seq=1 Ack=1 Win=262656 Len=0
TLSv1.2   328    Client Hello
TCP        60    443 → 44222 [ACK] Seq=1 Ack=275 Win=14874 Len=0
TLSv1.2  1514    Server Hello
TCP      1514    443 → 44222 [ACK] Seq=1461 Ack=275 Win=14874 Len=1460 [TCP segment of a reassembled PDU]
TCP        54    44222 → 443 [ACK] Seq=275 Ack=2921 Win=262656 Len=0
TLSv1.2  1514    Certificate, Server Key Exchange
TLSv1.2   360    Certificate Request, Server Hello Done
TCP        54    44222 → 443 [ACK] Seq=275 Ack=4687 Win=262656 Len=0
TCP       109    443 → 44222 [RST, ACK] Seq=4687 Ack=275 Win=0 Len=55
Вместо RST, ACK я должен получить что-то вроде этого:

Код: Выделить всё

TLSv1.2   2043    Certificate, Client Key Exchange, Certificate Verify, Change Cipher Spec, Encrypted Handshake Message
TCP         60    443 → 44566 [ACK] Seq=4687 Ack=2264 Win=16863 Len=0
TLSv1.2    105    Change Cipher Spec, Encrypted Handshake Message
TLSv1.2    153    Application Data
TCP         60    443 → 44566 [ACK] Seq=4738 Ack=2363 Win=16962 Len=0
TLSv1.2    642    Application Data
TLSv1.2     88    Application Data
TCP         54    44566 → 443 [ACK] Seq=2363 Ack=5360 Win=261888 Len=0
TCP         54    44566 → 443 [RST, ACK] Seq=2363 Ack=5360 Win=0 Len=0
Некоторое время этот код работал, но по неизвестной причине перестал работать. Запуск эквивалентного запроса cUrl, похоже, работает на компьютере с Linux должным образом. Похоже, это связано с .NET. Я пытался использовать RestSharp, но думаю, что внутри он использует HttpClient и столкнулся с той же ошибкой. Я запустил nmap --script ssl-enum-ciphers для целевого URL-адреса и изменил обработчик http, чтобы использовать упомянутый протокол SSL и наборы шифров, но это также не изменило результат.Что мне делать дальше?
Обновление 1:
Мне удалось вытащить TCP дамп из системы Linux, а RST был вызван превышением времени ожидания подтверждения SSL. Я не думаю, что мы можем пропустить проверку SSL с помощью HttpClient, а только игнорировать ее результат. Я пробовал использовать SslStream, который также не имеет такой настройки.
Обновление 2:
Я добавлен прослушиватель событий и вывод их в консоль. Кроме того, я запустил код на виртуальной машине Linux, чтобы Wireshark мог перехватывать ВЕСЬ трафик через виртуальный интерфейс (ранее я фильтровал только целевой IP-адрес).

Подробнее здесь: https://stackoverflow.com/questions/789 ... s-on-linux
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»