C#: отправка XML через https/SSL3 с сертификатами клиента/сервераC#

Место общения программистов C#
Anonymous
C#: отправка XML через https/SSL3 с сертификатами клиента/сервера

Сообщение Anonymous »

Мне нужно разработать клиент C#, способный отправлять XML-документы в SAP Business Connector 4.6.
Клиент:
.NET до 4.6, доступен VS 2013, SO Win 8.1 Pro 64 бита.
Сервер:
Windows 2000 с SAP Business Connector 4.6 (действительно эквивалентен WebMethods 4.6), настроенный с использованием https и сертификата клиента в качестве метода аутентификации. У сервера есть сертификат, который не соответствует URL-адресу, используемому при локальной разработке.
Я пробую несколько методов и клиентов .NET. На самом деле я пытаюсь httpClient подключиться к BC, но безуспешно.
Реальный код очень похож на этот:

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

try
{
System.Net.Http.HttpClient client;
//HttpClient uses the HttpMessageHandler pipeline for sending and receiving requests
//WebRequestHandler derives from HttpClientHandler but adds properties that generally only are available on full .NET
System.Net.Http.WebRequestHandler wrHandler = new System.Net.Http.WebRequestHandler();
System.Security.Cryptography.X509Certificates.X509Certificate x509cert = System.Security.Cryptography.X509Certificates.X509Certificate2.CreateFromCertFile("MyClientCertificate.crt");
wrHandler.ClientCertificates.Add(x509cert);
client = new System.Net.Http.HttpClient(wrHandler);

//THIS SKIPS SERVER CERTIFICATE
System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
System.Net.Http.HttpRequestMessage request = new System.Net.Http.HttpRequestMessage();
request.Method = System.Net.Http.HttpMethod.Post;
request.RequestUri = new System.Uri("https://192.168.12.12:3333/invoke/wm.PartnerMgr.flows.UCLR.0000000001:ORDERS");
request.Content = new System.Net.Http.StringContent(CtrXMLToSendContent.Text, Encoding.UTF8, CtrClient1MediaType.Text);

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Ssl3 | System.Net.SecurityProtocolType.Tls;

Task taskResponse = client.SendAsync(request);
if (taskResponse.Wait(-1)) //-1 = infinite
{
//Response received
System.Net.Http.HttpResponseMessage response = taskResponse.Result;
TextResponseData.Text = response.ToString();
Task taskResponseStr = response.Content.ReadAsStringAsync();
taskResponseStr.Wait();
String responseContent = taskResponseStr.Result;
TextResponseContent.Text = responseContent;
}
else
{
TextClient1Infolog.AppendText("Wait ");
}
}
catch (Exception _e)
{
TextClient1Infolog.AppendText("Error :" + Environment.NewLine);
TextClient1Infolog.AppendText(_e.ToString());
}
Когда я запускаю его, он выдает исключение, выдавая следующую ошибку:

System.Net.Http.HttpRequestException: при отправке запроса произошла ошибка. ---> System.Net.WebException: запрос был прерван: не удалось создать безопасный канал SSL/TLS.

Нет ответа сервера, который я мог бы изучить или отладить. Я думаю, что это проблема протокола установления связи SSL. Я должен настаивать: нет ответа от сервера, нет ошибок сообщений 402 или 404: ничего не получено.
Firefox в этом направлении говорит об отсутствии соединения. IE при активированном TSL 1.0, 1.2 и 1.3 говорит, что не может подключиться; активация SSL 3.0 и повторное открытие страницы говорит о проблеме с сертификатом сервера (да, потому что я подключаюсь из локальной сети, где в сертификате указано что-то вроде «this.server.com»).
Fiddler4 мало что мне говорит (и автосертификаты, похоже, что-то сбивают с толку), SoapUI здесь, похоже, не очень полезен (не вижу способа установки сертификатов и SSL-квитирования).
Нашел инструмент (TestSSLServer, ссылка: http://www.bolet.org/TestSSLServer/), который дал мне эту информацию:

Поддерживаемые версии: SSLv3 Сжатие TLSv1.0 Deflate: нет Поддерживаемые
наборы шифров (ПОРЯДОК НЕ ЗНАЧИМ):
SSLv3
RSA_EXPORT_WITH_RC4_40_MD5
RSA_WITH_RC4_128_MD5
RSA_WITH_RC4_128_SHA
RSA_EXPORT_WITH_RC2_CBC_40_MD5
RSA_EXPORT_WITH_DES40_CBC_SHA
RSA_WITH_DES_CBC_SHA
RSA_WITH_3DES_EDE_CBC_SHA
(TLSv1.0: то же)
---------------------- Сертификат(ы) сервера:

188659f61762af0de690bf5cb76a8554e7ff7f23: CN=my.server.com,
OU=Контроль домена проверен
---------------------- Минимальная надежность шифрования: слабое шифрование (40 бит) Достижимая надежность шифрования: сильное шифрование
(96-бит или более) Статус BEAST: уязвимый Статус ПРЕСТУПЛЕНИЯ: защищен

Поэтому я полагаю, что мне нужно принудительно установить соединение SSL3 (я думаю, это нормально в моем коде), проверить сертификат сервера (тоже)... возможно, мне нужно что-то сделать с сертификатом клиента.
Должен ли я создать его для своего клиентского компьютера и загрузить его? Как я могу создать его с помощью одного из шифров списка TestSSLServer? Какой файл следует установить на какой компьютер?
И я готов услышать о других http-клиентах (ServerXMLHTTP и т. д.) или инструментах, способных тестировать сообщения xml поверх xml. Есть идеи, как действовать сейчас?

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