.NET Core SqlException:在预登录握手期间发生错误

5

当我尝试使用Entity Framework Core连接到MSSQL数据库时,在最新版本的Mac OS High Sierra(10.13.5)中出现异常:

SqlException:成功与服务器建立了连接,但在预登录握手期间发生错误(提供程序:SSL提供程序,错误:31-加密(ssl / tls)握手失败)

我已经更新到最新版本的.NET core:

dotnet --version: 2.1.300

dotnet --info: .NET Core SDK (reflecting any global.json):
 Version:   2.1.300
 Commit:    adab45bf0c

Runtime Environment:
 OS Name:     Mac OS X
 OS Version:  10.13
 OS Platform: Darwin
 RID:         osx.10.13-x64
 Base Path:   /usr/local/share/dotnet/sdk/2.1.300/

Host (useful for support):
  Version: 2.1.0
  Commit:  caa7b7e2ba

.NET Core SDKs installed:
  1.0.4 [/usr/local/share/dotnet/sdk]
  2.0.0 [/usr/local/share/dotnet/sdk]
  2.1.300 [/usr/local/share/dotnet/sdk]

我在快速谷歌搜索后发现了一些相似的异常,但没有关于最新版本的OSX和安装了最新版本.NET Core的相关信息。

是否有可能是最新版本的一个bug?我已经在Windows上使用相同的源代码进行了测试,没有出现任何问题。

以下是我的项目文件中的参考:

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.1.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.0.2" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.0.2" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.2" />
    <PackageReference Include="System.Security.Cryptography.OpenSsl" Version="4.5.0" />
  </ItemGroup>
1个回答

3

如果有人来到这里寻找解决方案,以下是适用于我的解决方案。

环境

数据库:Microsoft SQL Server 2019 - 托管在亚马逊网络服务(AWS)上

.Net Core:.Net Core SDK v3.1.401

操作系统:macOS Catalina 10.15.5 (19F101)

正在执行的操作

我试图通过以下命令迁移EF Core模型并更新数据库:

dotnet ef migrations add initDBMigration --context myDBContext

dotnet ef database update

错误发生

与服务器成功建立连接,但在预登录握手期间发生错误。(提供程序: SSL Provider,错误: 31 - 加密(ssl/tls)握手失败)

解决方案

主要问题是 AWS 使用 SSL 安全连接通过其根证书,但 dotnet ef 工具无法验证或下载根证书。

因此,您需要手动下载和安装证书,并将 TrustServerCertificate 标记为 true。

下载并安装根证书

  1. 前往使用 SSL/TLS 对 DB 实例进行加密的文档
  2. 下载您所在地区的根证书,或者如果不确定,请下载全局根证书(适用于所有地区)。直接跳转到全局根证书(有效期至 2024 年 8 月 22 日,星期四)
  3. 通过双击 .pem 文件(已下载的文件)安装证书。您也可以通过“钥匙串访问”打开它
  4. 确保选择了“系统”作为“钥匙串:”
  5. 单击“添加”来安装证书。

Add Certificate Dialog

修改 SQL 连接字符串

  1. 转到您的连接字符串
  2. 确保它具有 TrustServerCertificate=true

就这样。现在再执行相同的操作,应该可以避免此错误。


TrustServerCertificate=true 在类似的情况下对我很有帮助。 - Evan Sevy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接