Skip to content

Android - cannot connect to SQL Server Express 2019 using any casual SqlClient version (v2.1.4, v4.1.0, v5Preview) #1662

@janseris

Description

@janseris

Describe the bug

Edit: please use the test application version added in the latest comment in this issue (more functions, less hardcoded)

Introduction:

  • there is no issue on Windows
  • on Windows, you should be seeing this with the sample app:
    • image
    • run as image

This is a continuation of this issue:
#1656
There, only Android 9 and higher can communicate with a SQL Server 2012 with latest patch and a valid certificate from DigiCert.
The message in SqlException is always the same for both of these issues:
(A connection was successfully established with the server, but then an error occurred during the pre-login handshake.)


In this issue, I have set up a local SQL Server Express 2019 instance and opened it to the local network (port 1433).
TCP/IP connection is enabled and a SQL account for authentication is set.

These versions of SQL Server API from C# fail to communicate to the instance from Android (.NET MAUI):

  • Microsoft.Data.SqlClient 2.1.4 (EF Core 6.0.6)
  • Microsoft.Data.SqlClient 5.0.0-preview2.22096.2 (EF Core 7.0.0-preview.5.22302.2)
  • Microsoft.Data.SqlClient 4.1.0
  • Microsoft.Data.SqlClient 2.0.0
  • Microsoft.Data.SqlClient 5.0.0-preview3.22168.1
  • System.Data.SqlClient 4.8.3

Result of the test:
No Android verison can communicate with the SQL Server Express 2019 instance properly after connection

  • all SqlClient versions have the same result on all Android versions when trying to communicate with the SQL Server 2019 instance -> "...pre-login handshake failed..." SqlException of Class 20 (A connection was successfully established with the server, but then an error occurred during the pre-login handshake.)
    The Android devices do in fact connect to the server, because if they did not, I would have received a different SqlException.
  • using TrustServerCertificate=true; and/or Encrypt=false; does not help solving the error

Test project:

About the test project:

  • note: watch the Debug Output window or place a breakpoint or execute step-by-step with debugger to observe the results (Label UI controls (which are supposed to show the text result) in MAUI are bugged and do not show on Android)
  • it executes a DB call using the list of SqlClients listed above

Here a detailed look into a separate test of Microsoft.Data.SqlClient 2.1.4 (EF Core 6.0.6 = current) alone:

The following are results (debug output from Visual Studio) with internal errors on Android versions 5,6,8,9,11,12 for attempted communication with SQL Server Express 2019 (all fail with the same error "pre-login handshake...") for EF COre 6.0.6 (using SqlClient 2.1.4 internally)

  • Android 5 emulator:
    • no internal exception shown
  • Android 6 emulator:
    • no internal exception shown
  • Android 8 emulator:
    • this happens for SQL Server 2012 as well
    •   [System.err] 	at com.android.org.conscrypt.OpenSSLEngineImpl.beginHandshakeInternal(OpenSSLEngineImpl.java:335)
        [System.err] 	at com.android.org.conscrypt.OpenSSLEngineImpl.beginHandshake(OpenSSLEngineImpl.java:325)
        [System.err] 	at crc64fcf28c0e24b4cc31.ButtonHandler_ButtonClickListener.n_onClick(Native Method)
        [System.err] 	at crc64fcf28c0e24b4cc31.ButtonHandler_ButtonClickListener.onClick(ButtonHandler_ButtonClickListener.java:30)
        [System.err] 	at android.view.View.performClick(View.java:6256)
        [System.err] 	at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1194)
        [System.err] 	at android.view.View$PerformClick.run(View.java:24701)
        [System.err] 	at android.os.Handler.handleCallback(Handler.java:789)
        [System.err] 	at android.os.Handler.dispatchMessage(Handler.java:98)
        [System.err] 	at android.os.Looper.loop(Looper.java:164)
        [System.err] 	at android.app.ActivityThread.main(ActivityThread.java:6541)
        [System.err] 	at java.lang.reflect.Method.invoke(Native Method)
        [System.err] 	at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        [System.err] 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)```
      
      
  • Android 9 emulator:
    • no internal exception shown
  • Android 11 emulator:
    • this does not happen for SQL Server 2012
    • this happens with Encrypt=false and TrustServerCertificate=true
    • [System.err] 	at com.android.org.conscrypt.SSLUtils.toSSLHandshakeException(SSLUtils.java:362)
      [System.err] 	at com.android.org.conscrypt.ConscryptEngine.convertException(ConscryptEngine.java:1134)
      [System.err] 	at com.android.org.conscrypt.ConscryptEngine.readPlaintextData(ConscryptEngine.java:1089)
      [System.err] 	at com.android.org.conscrypt.ConscryptEngine.unwrap(ConscryptEngine.java:876)
      [System.err] 	at com.android.org.conscrypt.ConscryptEngine.unwrap(ConscryptEngine.java:747)
      [System.err] 	at com.android.org.conscrypt.ConscryptEngine.unwrap(ConscryptEngine.java:712)
      [System.err] 	at com.android.org.conscrypt.Java8EngineWrapper.unwrap(Java8EngineWrapper.java:237)
      [System.err] 	at crc64fcf28c0e24b4cc31.ButtonHandler_ButtonClickListener.n_onClick(Native Method)
      [System.err] 	at crc64fcf28c0e24b4cc31.ButtonHandler_ButtonClickListener.onClick(ButtonHandler_ButtonClickListener.java:30)
      [System.err] 	at android.view.View.performClick(View.java:7448)
      [System.err] 	at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1194)
      [System.err] 	at android.view.View.performClickInternal(View.java:7425)
      [System.err] 	at android.view.View.access$3600(View.java:810)
      [System.err] 	at android.view.View$PerformClick.run(View.java:28305)
      [System.err] 	at android.os.Handler.handleCallback(Handler.java:938)
      [System.err] 	at android.os.Handler.dispatchMessage(Handler.java:99)
      [System.err] 	at android.os.Looper.loop(Looper.java:223)
      [System.err] 	at android.app.ActivityThread.main(ActivityThread.java:7656)
      [System.err] 	at java.lang.reflect.Method.invoke(Native Method)
      [System.err] 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
      [System.err] 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
      [System.err] Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
      [System.err] 	at com.android.org.conscrypt.TrustManagerImpl.verifyChain(TrustManagerImpl.java:677)
      [System.err] 	at com.android.org.conscrypt.TrustManagerImpl.checkTrustedRecursive(TrustManagerImpl.java:554)
      [System.err] 	at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:510)
      [System.err] 	at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:428)
      [System.err] 	at com.android.org.conscrypt.TrustManagerImpl.getTrustedChainForServer(TrustManagerImpl.java:371)
      [System.err] 	at android.security.net.config.NetworkSecurityTrustManager.checkServerTrusted(NetworkSecurityTrustManager.java:102)
      [System.err] 	at android.security.net.config.RootTrustManager.checkServerTrusted(RootTrustManager.java:106)
      [System.err] 	at com.android.org.conscrypt.Platform.checkServerTrusted(Platform.java:250)
      [System.err] 	at com.android.org.conscrypt.ConscryptEngine.verifyCertificateChain(ConscryptEngine.java:1644)
      [System.err] 	at com.android.org.conscrypt.NativeCrypto.ENGINE_SSL_read_direct(Native Method)
      [System.err] 	at com.android.org.conscrypt.NativeSsl.readDirectByteBuffer(NativeSsl.java:568)
      [System.err] 	at com.android.org.conscrypt.ConscryptEngine.readPlaintextDataDirect(ConscryptEngine.java:1095)
      [System.err] 	at com.android.org.conscrypt.ConscryptEngine.readPlaintextDataHeap(ConscryptEngine.java:1115)
      [System.err] 	at com.android.org.conscrypt.ConscryptEngine.readPlaintextData(ConscryptEngine.java:1087)
      [System.err] 	... 18 more
      [System.err] Caused by: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
      [System.err] 	... 32 more```
      
      
  • Android 12 emulator:
    •     [System.err] 	at com.android.org.conscrypt.SSLUtils.toSSLHandshakeException(SSLUtils.java:363)
          [System.err] 	at com.android.org.conscrypt.ConscryptEngine.convertException(ConscryptEngine.java:1134)
          [System.err] 	at com.android.org.conscrypt.ConscryptEngine.readPlaintextData(ConscryptEngine.java:1089)
          [System.err] 	at com.android.org.conscrypt.ConscryptEngine.unwrap(ConscryptEngine.java:876)
          [System.err] 	at com.android.org.conscrypt.ConscryptEngine.unwrap(ConscryptEngine.java:747)
          [System.err] 	at com.android.org.conscrypt.ConscryptEngine.unwrap(ConscryptEngine.java:712)
          [System.err] 	at com.android.org.conscrypt.Java8EngineWrapper.unwrap(Java8EngineWrapper.java:237)
          [System.err] 	at crc64fcf28c0e24b4cc31.ButtonHandler_ButtonClickListener.n_onClick(Native Method)
          [System.err] 	at crc64fcf28c0e24b4cc31.ButtonHandler_ButtonClickListener.onClick(ButtonHandler_ButtonClickListener.java:30)
          [System.err] 	at android.view.View.performClick(View.java:7441)
          [System.err] 	at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1194)
          [System.err] 	at android.view.View.performClickInternal(View.java:7418)
          [System.err] 	at android.view.View.access$3700(View.java:835)
          [System.err] 	at android.view.View$PerformClick.run(View.java:28676)
          [System.err] 	at android.os.Handler.handleCallback(Handler.java:938)
          [System.err] 	at android.os.Handler.dispatchMessage(Handler.java:99)
          [System.err] 	at android.os.Looper.loopOnce(Looper.java:201)
          [System.err] 	at android.os.Looper.loop(Looper.java:288)
          [System.err] 	at android.app.ActivityThread.main(ActivityThread.java:7839)
          [System.err] 	at java.lang.reflect.Method.invoke(Native Method)
          [System.err] 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
          [System.err] 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
          [System.err] Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
          [System.err] 	at com.android.org.conscrypt.TrustManagerImpl.verifyChain(TrustManagerImpl.java:672)
          [System.err] 	at com.android.org.conscrypt.TrustManagerImpl.checkTrustedRecursive(TrustManagerImpl.java:549)
          [System.err] 	at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:505)
          [System.err] 	at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:425)
          [System.err] 	at com.android.org.conscrypt.TrustManagerImpl.getTrustedChainForServer(TrustManagerImpl.java:368)
          [System.err] 	at android.security.net.config.NetworkSecurityTrustManager.checkServerTrusted(NetworkSecurityTrustManager.java:102)
          [System.err] 	at android.security.net.config.RootTrustManager.checkServerTrusted(RootTrustManager.java:106)
          [System.err] 	at com.android.org.conscrypt.Platform.checkServerTrusted(Platform.java:255)
          [System.err] 	at com.android.org.conscrypt.ConscryptEngine.verifyCertificateChain(ConscryptEngine.java:1638)
          [System.err] 	at com.android.org.conscrypt.NativeCrypto.ENGINE_SSL_read_direct(Native Method)
          [System.err] 	at com.android.org.conscrypt.NativeSsl.readDirectByteBuffer(NativeSsl.java:569)
          [System.err] 	at com.android.org.conscrypt.ConscryptEngine.readPlaintextDataDirect(ConscryptEngine.java:1095)
          [System.err] 	at com.android.org.conscrypt.ConscryptEngine.readPlaintextDataHeap(ConscryptEngine.java:1115)
          [System.err] 	at com.android.org.conscrypt.ConscryptEngine.readPlaintextData(ConscryptEngine.java:1087)
          [System.err] 	... 19 more
          [System.err] Caused by: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
          [System.err] 	... 33 more```
      
      
  • Android 12 device
    - [System.err] javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. [System.err] at com.android.org.conscrypt.SSLUtils.toSSLHandshakeException(SSLUtils.java:363) [System.err] at com.android.org.conscrypt.ConscryptEngine.convertException(ConscryptEngine.java:1134) [System.err] at com.android.org.conscrypt.ConscryptEngine.readPlaintextData(ConscryptEngine.java:1089) [System.err] at com.android.org.conscrypt.ConscryptEngine.unwrap(ConscryptEngine.java:876) [System.err] at com.android.org.conscrypt.ConscryptEngine.unwrap(ConscryptEngine.java:747) [System.err] at com.android.org.conscrypt.ConscryptEngine.unwrap(ConscryptEngine.java:712) [System.err] at com.android.org.conscrypt.Java8EngineWrapper.unwrap(Java8EngineWrapper.java:237) [System.err] at crc64fcf28c0e24b4cc31.ButtonHandler_ButtonClickListener.n_onClick(Native Method) [System.err] at crc64fcf28c0e24b4cc31.ButtonHandler_ButtonClickListener.onClick(ButtonHandler_ButtonClickListener.java:30) [System.err] at android.view.View.performClick(View.java:7451) [System.err] at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1194) [System.err] at android.view.View.performClickInternal(View.java:7425) [System.err] at android.view.View.access$3700(View.java:842) [System.err] at android.view.View$PerformClick.run(View.java:28690) [System.err] at android.os.Handler.handleCallback(Handler.java:938) [System.err] at android.os.Handler.dispatchMessage(Handler.java:99) [System.err] at android.os.Looper.loopOnce(Looper.java:346) [System.err] at android.os.Looper.loop(Looper.java:475) [System.err] at android.app.ActivityThread.main(ActivityThread.java:7889) [System.err] at java.lang.reflect.Method.invoke(Native Method) [System.err] at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) [System.err] at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1009) [System.err] Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. [System.err] at com.android.org.conscrypt.TrustManagerImpl.verifyChain(TrustManagerImpl.java:672) [System.err] at com.android.org.conscrypt.TrustManagerImpl.checkTrustedRecursive(TrustManagerImpl.java:549) [System.err] at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:505) [System.err] at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:425) [System.err] at com.android.org.conscrypt.TrustManagerImpl.getTrustedChainForServer(TrustManagerImpl.java:368) [System.err] at android.security.net.config.NetworkSecurityTrustManager.checkServerTrusted(NetworkSecurityTrustManager.java:102) [System.err] at android.security.net.config.RootTrustManager.checkServerTrusted(RootTrustManager.java:106) [System.err] at com.android.org.conscrypt.Platform.checkServerTrusted(Platform.java:255) [System.err] at com.android.org.conscrypt.ConscryptEngine.verifyCertificateChain(ConscryptEngine.java:1638) [System.err] at com.android.org.conscrypt.NativeCrypto.ENGINE_SSL_read_direct(Native Method) [System.err] at com.android.org.conscrypt.NativeSsl.readDirectByteBuffer(NativeSsl.java:569) [System.err] at com.android.org.conscrypt.ConscryptEngine.readPlaintextDataDirect(ConscryptEngine.java:1095) [System.err] at com.android.org.conscrypt.ConscryptEngine.readPlaintextDataHeap(ConscryptEngine.java:1115) [System.err] at com.android.org.conscrypt.ConscryptEngine.readPlaintextData(ConscryptEngine.java:1087) [System.err] ... 19 more [System.err] Caused by: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. [System.err] ... 33 more

To reproduce

  • have a working SQL Server Express 2019 instance exposed to the network (this tutorial will do: https://www.youtube.com/watch?v=xNmIdFjXzl4)
    • set up a SQL Server Express 2019
    • open port 1433 on firewall
    • configure the SQL Server Express instance to allow SQL authentication
    • enable an account on the instance (e.g. sa)
    • configure the instance to allow TCP/IP connection on port 1433
  • be able to run the MAUI application
    • download latest VS 2022 Preview (because MAUI can only be used in VS 2022 Preview)
    • add the MAUI part in Visual Studio Installer
      • image
    • install some Android emulators (default settings are OK) via Visual Studio ->
      image
      • or use physical device - after connecting via USB and enabling USB debugging, you should be able to see and use it as follows:
        • image

Note:

  • the connection strings which are hardcoded into the sample app, have the following properties:
    • Database Ordinace devRemin
    • SQL account name sa
    • SQL account password sa
    • a table called USER in the default dbo schema
      • the EF test projects require that it has some columns but you can skip using the EF Core projects because they use SqlClient anyways
        • the other projects simply select number of rows from the USER table (could have selected something from a dummy table or be doing SELECT 'Hello World') the current version simply executes SELECT LEN('Hello World')

Note dotnet/maui#2:

  • the Constants.LocalNetworkConnectionString string has a hardcoded private IP of 192.168.0.234
    • this IP will probably be different in every local network
    • the correct IP can be obtained via running the command line command ipconfig on the host machine running the SQL Express (this example requires that the Android device and the machine hosting the SQL Server are in the same local network so that private IP can be used (or you can share your SQL Server Express to the internet and use a public IP address in fact but I did not do that)
      • look for IPv4 Address entry in the output of the ipconfig command, that's the private/local IP address

Expected behavior

Android can communicate with the SQL Server Express.

Further technical details

.NET target: .NET 6.0 (dotnet --version: 6.0.400-preview.22301.10)
SQL Server version: SQL Server Express 2019
Operating system: Windows 10 21H1

Metadata

Metadata

Assignees

Labels

External 🔗Issue is in an external component

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions