Android - 无法使用任何临时 SqlClient 版本(v2.1.4、v4.1.0、v5Preview)连接到 SQL Server Express 2019

发布时间 2023-06-19 09:26:06作者: AlexChow

A connection was successfully established with the server, but then an error occurred during the pre-login handshake.

设法用证书和 IP 地址解决它。

  1. 使用 powershell 为您的 IP 地址创建证书:
New-SelfSignedCertificate -certstorelocation cert:\localmachine\my -dnsname '192.168.0.15','localhost' -KeySpec KeyExchange -FriendlyName '192.168.0.15' -NotAfter (Get-Date).AddMonths(240)

(稍后将与您的 sql server 的任何 IP 地址一起使用)。

  1. 在 SQL Server 配置管理器中设置您的证书。

  2. 将该证书导出为 Base-64 编码的 X.509 (.CER) 文件。

  3. Platforms\Android\Resources\raw 文件夹中导入该 cer(如果它不存在,请创建它)。

  4. Platforms\Android\xml 文件夹中创建 nsc.xml(如果我将其命名为 network_security_config.xml 则无法正常工作),
    内容为:(更改数据 ofc IP 和域名,@raw/certname 我的名称为 razvoj1.cer 在 Platforms\Android\Resources\raw 文件夹和我的 SQL 服务器 IP 是 192.168.0.15 )

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
	<base-config cleartextTrafficPermitted="true">
		<trust-anchors>
			<certificates src="system" />
			<certificates src="user" />
			<certificates src="@raw/razvoj1"/>
		</trust-anchors>
	</base-config>
    <domain-config cleartextTrafficPermitted="true">
		<domain includeSubdomains="true">localhost</domain>
		<domain includeSubdomains="true">192.168.0.15,1433</domain>
		<domain includeSubdomains="true">192.168.0.15</domain>
        <domain includeSubdomains="true">RAZVOJ1</domain>
		<domain includeSubdomains="true">RAZVOJ1.localhost</domain>
		<trust-anchors>
			<certificates src="system" />
			<certificates src="user" />
			<certificates src="@raw/razvoj1"/>
		</trust-anchors>
    </domain-config>
</network-security-config>
  1. 在 AndroidManifest 中添加 android:usesCleartextTraffic="true"android:networkSecurityConfig = "@xml/nsc" 到应用程序标签:
<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1" xmlns:android="http://schemas.android.com/apk/res/android">
	<application android:allowBackup="true" 
				 android:icon="@mipmap/appicon" 
				 android:roundIcon="@mipmap/appicon_round"
				 android:usesCleartextTraffic="true"
			         android:networkSecurityConfig="@xml/nsc"
				 android:supportsRtl="true"></application>
	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
	<uses-permission android:name="android.permission.INTERNET" />
</manifest>
  1. 使用此连接字符串:
    string connectionString = @"Server=192.168.0.15,1433;Database=YOURDB;User Id=sa;Password=YOURPASS;Persist Security Info=True;Encrypt=True;TrustServerCertificate=True";

参考链接

https://github.com/dotnet/SqlClient/issues/1662#issuecomment-1260858334