This error is seen multiple times on the internet but no satisfactory solution is given.
Connection with Microsoft.Data.SqlClient produce a SqlException (0x80131904): A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: TCP Provider, error: 35 - An internal exception was caught)
Head of stack is:
{Microsoft.Data.SqlClient.SqlException (0x80131904): A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: TCP Provider, error: 35 - An internal exception was caught)
---> System.Security.Authentication.AuthenticationException: Authentication failed, see inner exception.
---> Interop+AndroidCrypto+SslException: Exception of type 'Interop+AndroidCrypto+SslException' was thrown.
--- End of inner exception stack trace ---
at System.Net.Security.SslStream.d__1461[[System.Net.Security.SyncReadWriteAdapter, System.Net.Security, Version=7.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a]].MoveNext() at System.Net.Security.SslStream.AuthenticateAsClient(SslClientAuthenticationOptions sslClientAuthenticationOptions) at System.Net.Security.SslStream.AuthenticateAsClient(String targetHost, X509CertificateCollection clientCertificates, SslProtocols enabledSslProtocols, Boolean checkCertificateRevocation) at Microsoft.Data.SqlClient.SNI.SNITCPHandle.EnableSsl(UInt32 options) in D:\a\_work\1\s\src\Microsoft.Data.SqlClient\netcore\src\Microsoft\Data\SqlClient\SNI\SNITcpHandle.cs:line 626 at Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action
1 wrapCloseInAction) in D:\a_work\1\s\src\Microsoft.Data.SqlClient\src\Microsoft\Data\SqlClient\SqlInternalConnection.cs:line 776
I have read comments that say that communication must be encrypted. So I set up a test SQL server with a domain self-signed SSL certificate. (with Force Encryption : Yes) CA certificate has been installed in the Android device.
I use this connection string:
"Server=FQDNofSqlServer; Database=xxx; User Id=sa; password=yyy;Encrypt=True;";
This connection with this string in net7.0 succeeds and is correctly encrypted. In net7.0-android the error occurs.
This kind of connection was possible in Xamarin in .net Standard 2.1.
(The Android app is an an application intended to be used in a local network and the SQL server is not publicly accessible. Using a webservice is an unnecessarily expensive solution in this type of configuration)
Just as ToolmakerSteve mentioned that You can create DangerousTrustProvider.cs and placed it in the folder: Platforms/Android to disable server certificate verification on Android.
More information you can check this workround about disable server certificate verification on Android.