2016-12-14 2 views
1

Мы разрабатываем приложение для Android с использованием Xamarin. Приложение отправляет рабочие данные в серверную службу (WCF, защищенную сертификатом) через HttpWebRequest Post на HTTPS. Все работает нормально, пока сообщение не превысит лимит. В этом случае при каждой синхронизации мы получили один из следующих ошибок:Xamarin Android HttpWebClient с сертификатом: System.IO.IOException: Ошибка аутентификации или дешифрования

  • System.IO.IOException: Аутентификация и дешифровка не удалась. ---> System.IO.IOException: ошибка при отправке оповещения TLS (Fatal: InternalError): System.NullReferenceException: ссылка на объект не установлена ​​в экземпляр объекта.

  • System.Net.WebException: Ошибка получения потока ответов (ReadDone1): ReceiveFailure ---> System.IO.IOException: Ошибка аутентификации или дешифрования. ---> System.IO.IOException: Ошибка при отправке оповещения TLS (Fatal: InternalError): System.IO.IOException: Ошибка аутентификации или дешифрования. ---> System.IO.IOException: невозможно записать данные в транспортное соединение: сброс соединения с помощью одноранговой сети. ---> System.Net.Sockets.SocketException: Сброс соединения одноранговой

«большой» сообщение А, причиной ошибки является 44Кб (22Кб в utf8)!

Что мы уже попробовать:

  • Одна вещь, которую мы заметили, что если мы делаем HttpWebRequest сообщение с небольшим сообщением перед отправкой больших сообщений, он отлично работает.
  • Протестировано с Restsharp, и поведение такое же. Restsharp также использует System.net.dll
  • Мы также протестировали с Postman сообщениями, которые вызывают проблемы в мобильном приложении, и сообщение отправляются успешно. Таким образом, это, похоже, связано с System.Net.

Мы обнаружили, что другие люди, кажется, этот вопрос и решение было бы использовать ModernHttp, но не применяется для нас, потому что он не поддерживает сертификат клиента: HttpClient Error getting response stream (ReadDone1): ReceiveFailure

Ниже версии Xamarin мы с помощью:
Visual Studio 2015 Update 3
Xamarin 4.2.1.64
Xamarin.Android 7.0.2.37 - Проверено на Samsung устройств S4 и S5 с Android 5.0.1 и Android 6

Любая идея?

Первый стек ошибок трассировки:

System.IO.IOException: The authentication or decryption has failed. ---> System.IO.IOException: Error while sending TLS Alert (Fatal:InternalError): System.NullReferenceException: Object reference not set to an instance of an object. 
    at Mono.Security.Protocol.Tls.SslStreamBase.InternalBeginWrite (Mono.Security.Protocol.Tls.SslStreamBase+InternalAsyncResult asyncResult) [0x00031] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/SslStreamBase.cs:782 ---> System.ObjectDisposedException: Cannot access a disposed object. 
Object name: 'System.Net.Sockets.NetworkStream'. 
    at System.Net.Sockets.NetworkStream.BeginWrite (System.Byte[] buffer, System.Int32 offset, System.Int32 size, System.AsyncCallback callback, System.Object state) [0x00014] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/referencesource/System/net/System/Net/Sockets/NetworkStream.cs:907 
    at Mono.Security.Protocol.Tls.RecordProtocol.BeginSendRecord (Mono.Security.Protocol.Tls.ContentType contentType, System.Byte[] recordData, System.AsyncCallback callback, System.Object state) [0x00026] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/RecordProtocol.cs:765 
    at Mono.Security.Protocol.Tls.RecordProtocol.SendRecord (Mono.Security.Protocol.Tls.ContentType contentType, System.Byte[] recordData) [0x00000] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/RecordProtocol.cs:786 
    at Mono.Security.Protocol.Tls.RecordProtocol.SendAlert (Mono.Security.Protocol.Tls.Alert alert) [0x00027] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/RecordProtocol.cs:633 
    at Mono.Security.Protocol.Tls.RecordProtocol.SendAlert (System.Exception& ex) [0x00021] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/RecordProtocol.cs:598 
    --- End of inner exception stack trace --- 
    --- End of inner exception stack trace --- 
    at Mono.Security.Protocol.Tls.SslStreamBase.InternalBeginWrite (Mono.Security.Protocol.Tls.SslStreamBase+InternalAsyncResult asyncResult) [0x00077] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/SslStreamBase.cs:791 
    at Mono.Security.Protocol.Tls.SslStreamBase.BeginWrite (System.Byte[] buffer, System.Int32 offset, System.Int32 count, System.AsyncCallback callback, System.Object state) [0x000a3] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/SslStreamBase.cs:858 
    at Mono.Net.Security.Private.LegacySslStream.BeginWrite (System.Byte[] buffer, System.Int32 offset, System.Int32 count, System.AsyncCallback asyncCallback, System.Object asyncState) [0x00006] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/System/Mono.Net.Security/LegacySslStream.cs:435 
    at System.Net.WebConnection.BeginWrite (System.Net.HttpWebRequest request, System.Byte[] buffer, System.Int32 offset, System.Int32 size, System.AsyncCallback cb, System.Object state) [0x0005f] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/System/System.Net/WebConnection.cs:1000 

Второй стек ошибок трассировки:

System.Net.WebException: Error getting response stream (ReadDone1): ReceiveFailure ---> System.IO.IOException: The authentication or decryption has failed. ---> System.IO.IOException: Error while sending TLS Alert (Fatal:InternalError): System.IO.IOException: The authentication or decryption has failed. ---> System.IO.IOException: Unable to read data from the transport connection: Connection reset by peer. ---> System.Net.Sockets.SocketException: Connection reset by peer 
    at System.Net.Sockets.Socket.EndReceive (System.IAsyncResult result) [0x0002d] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/System/System.Net.Sockets/Socket.cs:2031 
    at System.Net.Sockets.NetworkStream.EndRead (System.IAsyncResult asyncResult) [0x0005f] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/referencesource/System/net/System/Net/Sockets/NetworkStream.cs:858 
    --- End of inner exception stack trace --- 
    at Mono.Security.Protocol.Tls.RecordProtocol.EndReceiveRecord (System.IAsyncResult asyncResult) [0x0003a] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/RecordProtocol.cs:430 
    at Mono.Security.Protocol.Tls.SslClientStream.SafeEndReceiveRecord (System.IAsyncResult ar, System.Boolean ignoreEmpty) [0x00000] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/SslClientStream.cs:256 
    at Mono.Security.Protocol.Tls.SslClientStream.NegotiateAsyncWorker (System.IAsyncResult result) [0x00071] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/SslClientStream.cs:418 
    --- End of inner exception stack trace --- 
    at Mono.Security.Protocol.Tls.SslClientStream.EndNegotiateHandshake (System.IAsyncResult result) [0x00035] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/SslClientStream.cs:396 
    at Mono.Security.Protocol.Tls.SslStreamBase.AsyncHandshakeCallback (System.IAsyncResult asyncResult) [0x0000c] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/SslStreamBase.cs:101 ---> System.IO.IOException: Unable to write data to the transport connection: The socket is not connected. ---> System.Net.Sockets.SocketException: The socket is not connected 
    at System.Net.Sockets.Socket.BeginSend (System.Byte[] buffer, System.Int32 offset, System.Int32 size, System.Net.Sockets.SocketFlags socket_flags, System.AsyncCallback callback, System.Object state) [0x00021] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/System/System.Net.Sockets/Socket.cs:2566 
    at System.Net.Sockets.NetworkStream.BeginWrite (System.Byte[] buffer, System.Int32 offset, System.Int32 size, System.AsyncCallback callback, System.Object state) [0x000b4] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/referencesource/System/net/System/Net/Sockets/NetworkStream.cs:934 
    --- End of inner exception stack trace --- 
    at System.Net.Sockets.NetworkStream.BeginWrite (System.Byte[] buffer, System.Int32 offset, System.Int32 size, System.AsyncCallback callback, System.Object state) [0x000f2] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/referencesource/System/net/System/Net/Sockets/NetworkStream.cs:954 
    at Mono.Security.Protocol.Tls.RecordProtocol.BeginSendRecord (Mono.Security.Protocol.Tls.ContentType contentType, System.Byte[] recordData, System.AsyncCallback callback, System.Object state) [0x00026] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/RecordProtocol.cs:765 
    at Mono.Security.Protocol.Tls.RecordProtocol.SendRecord (Mono.Security.Protocol.Tls.ContentType contentType, System.Byte[] recordData) [0x00000] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/RecordProtocol.cs:786 
    at Mono.Security.Protocol.Tls.RecordProtocol.SendAlert (Mono.Security.Protocol.Tls.Alert alert) [0x00027] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/RecordProtocol.cs:633 
    at Mono.Security.Protocol.Tls.RecordProtocol.SendAlert (System.Exception& ex) [0x00021] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/RecordProtocol.cs:598 
    --- End of inner exception stack trace --- 
    --- End of inner exception stack trace --- 
    at Mono.Security.Protocol.Tls.SslStreamBase.EndRead (System.IAsyncResult asyncResult) [0x00051] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/SslStreamBase.cs:883 
    at Mono.Net.Security.Private.LegacySslStream.EndRead (System.IAsyncResult asyncResult) [0x00006] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/System/Mono.Net.Security/LegacySslStream.cs:494 
    at System.Net.WebConnection.ReadDone (System.IAsyncResult result) [0x0002a] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/System/System.Net/WebConnection.cs:468 
    --- End of inner exception stack trace --- 
    at System.Net.HttpWebRequest.EndGetResponse (System.IAsyncResult asyncResult) [0x0005e] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/System/System.Net/HttpWebRequest.cs:1023 
    at System.Net.HttpWebRequest.GetResponse() [0x0000e] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/System/System.Net/HttpWebRequest.cs:1037 
    at MyOrg.Logistic.Mobile.Droid.CommunicationUtilities.RestPost[T] (MyOrg.Logistic.Droid.Mobile.ServiceTypes type, Communication.CommServerSettings commServerSettings, System.String requestPath, System.Object parameters, System.Boolean retry, System.Boolean closeHttpConnection) [0x000cf] in C:\Dev\Mobile\Application\main\Application\Mobile.App.Droid\CommunicationUtilities.cs:309 
    at MyOrg.Logistic.Droid.Mobile.Droid.Service.SendStoreSecondLayerEvent (MyOrg.Logistic.Droid.Messages.StoreSecondLayerEventMessage msg) [0x00001] in C:\Dev\Mobile\Application\main\Application\Mobile.App.Droid\Services\Service.cs:96 
    at MyOrg.Logistic.Droid.Mobile.SynchronizationExecutionViewModel+<Synchronize>d__38.MoveNext() [0x00173] in C:\Dev\Mobile\Application\main\Application\Mobile.App\ViewModels\SynchronizationExecutionViewModel.cs:172 

HttpWebRequest код:

public static T RestPost<T>(ServiceTypes type, CommServerSettings commServerSettings, string requestPath, 
     object parameters = null, bool retry = false, bool closeHttpConnection = true) where T : new() 
{ 
//https://192.168.1.12:6206/Transmission/StoreSecondLayerEvent 
var url = BuildServiceUrl(type, 
    commServerSettings, 
    requestPath); 

HttpWebRequest.DefaultMaximumResponseHeadersLength = 128 * 1024; // 128kb 

//specify to use TLS 1.2 as default connection 
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; 

/* HttpWebRequest Variant */ 

string output = string.Empty; 
if (parameters != null) 
{ 
    output = JsonConvert.SerializeObject(parameters); 
} 

byte[] postDataByteArray = Encoding.UTF8.GetBytes(output); 

var rq = new HttpWebRequest(new Uri(url));    

if (Certificate != null) 
{ 
    rq.ClientCertificates = new X509Certificate2Collection(Certificate); 
} 

rq.KeepAlive = !closeHttpConnection; 
//rq.PreAuthenticate = true; 
//rq.AuthenticationLevel = System.Net.Security.AuthenticationLevel.MutualAuthRequested; 

rq.Method = "POST"; 
rq.ContentType = "application/json"; 
rq.ContentLength = postDataByteArray.Length; 

// write the data on the connection stream 
using (var dataStream = rq.GetRequestStream()) 
{ 
    dataStream.Write(postDataByteArray, 0, postDataByteArray.Length); 
    dataStream.Close(); 
} 

string responseString; 

using (HttpWebResponse rs = (HttpWebResponse) rq.GetResponse()) 
{ 
    using (Stream responseStream = rs.GetResponseStream()) 
    { 
     using (StreamReader responseReader = new StreamReader(responseStream)) 
     { 
      responseString = responseReader.ReadToEnd(); 
     } 
    } 
} 

Console.WriteLine("Received: " + responseString); 

var keyResponse = JsonConvert.DeserializeObject<T>(responseString); 

return keyResponse; 
} 

static CommunicationUtilities() 
{ 
try 
{ 
    // # Sets the validation of the certificate to be always valid 
    // # Check: https://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.servercertificatevalidationcallback(v=vs.110).aspx 
    ServicePointManager.ServerCertificateValidationCallback += (sender, 
     certificate, 
     chain, 
     errors) => true; 
} 
catch (Exception ex) 
{ 
    throw new Exception("Error initializing CommunicationUtilities class!", ex); 
} 

} 
+0

Почему бы не попробовать HttpClient? HttpClient может напрямую сопоставляться с нативными обработчиками или вы можете использовать обработчик с сертификатом клиента. https://dotnetcodr.com/2016/01/25/using-client-certificates-in-net-part-5-working-with-client-certificates-in-a-web-project/ – BrewMate

+0

Существующий WebRequestHandler, который поддерживает сертификат недоступен в проектах Xamarin для Android или PCL. Или я ошибаюсь? –

ответ

1

Сама ошибка выглядит как для m вопросов аутентификации TLS. Текущая альфа-версия Xamarin имеет некоторые обновления для наших TLS-реализаций.Если вы посмотрите на примечания к выпуску для Xamarin.iOS вы увидите некоторую информацию о нас мигрирующих реализациях TLS:

https://developer.xamarin.com/releases/ios/xamarin.ios_10/xamarin.ios_10.4/

На момент написания этого Android/Platform не обновляли свою документацию упомянуть аналогичными, но это относится и к Android.

Официальная документация хаб будет здесь:

https://developer.xamarin.com/guides/cross-platform/transport-layer-security/

+0

Привет jWhite, могу ли я установить текущую альфа-версию Xamarin, чтобы проверить, исправлена ​​ли проблема, а затем переустановить текущую выпущенную версию xamarin? Как я могу продолжить? –

+0

С этой ссылкой мы можем переключить канал обновления xamarin для установки альфа-версий, бета-версий или стабильных версий: https://developer.xamarin.com/recipes/cross-platform/ide/change_updates_channel/ –

+0

Последняя версия Xamarin alpha (4.3.0.490)) не исправляет мою проблему. Я все еще получаю ту же ошибку. Любые другие идеи? –

Смежные вопросы