我12.0.6205在 .Net Core 3.1(或 6)Web Api 控制器中有一個 SQL 服務器版本和以下代碼:
var builder = new SqlConnectionStringBuilder
{
DataSource = DataSource,
UserID = UserID,
Password = Password,
InitialCatalog = InitialCatalog,
ApplicationIntent = ApplicationIntent.ReadWrite,
// Same result if true/true
Encrypt = false,
TrustServerCertificate = false
};
var connection = new SqlConnection(builder.ToString());
using (var cmd = new SqlCommand() { Connection = connection, CommandText = "SELECT TOP 1 * FROM [dbo].[Table]" })
{
connection.Open(); // Breaks here
var reader = cmd.ExecuteReader();
Console.WriteLine(reader.HasRows);
}
在本地,此代碼可以正常作業,但是在 Azure 的應用服務中執行時,它會在打開連接時中斷:
System.Data.SqlClient.SqlException (0x80131904): A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: SSL Provider, error: 31 - Encryption(ssl/tls) handshake failed)
如果創建基于appsvc/dotnetcore(任何標簽)映像的泊塢窗,我也能夠在本地重現該錯誤
FROM mcr.microsoft.com/appsvc/dotnetcore:3.1-latest_20220105.1
ENV ASPNETCORE_URLS=http:// :80
EXPOSE 8080
WORKDIR /home/site/wwwroot/
COPY . .
ENTRYPOINT ["dotnet", "Test.dll"]
uj5u.com熱心網友回復:
在GitHub中發現了一個類似的問題,即 TLS HandShake Failure in SQL Server Pre-Login Handshake with Docker Image。
此外,此錯誤通常發生在 docker 鏡像容器、Unix 客戶端或 Windows 客戶端等客戶端環境中,其中 TLS 1.2 是支持的最低 TLS 協議。
在受支持的 SQL Server1 版本上安裝最新更新,并確保在服務器上啟用 TLS 1.2 協議。
- 在客戶端環境中安裝目標 SQL Server 的 TLS/SSL 證書。如果需要加密,它將被驗證。
- 在連接字串中設定“Trust Server Certificate = true”屬性。
- 為其哈希至少使用 SHA-256 哈希演算法簽名的服務器生成新的 TLS/SSL 證書。
參考:Microsoft 的登錄前握手錯誤解決方案
uj5u.com熱心網友回復:
就像@DraggonDragger 所說這是一個 TLS 問題,但在我的具體情況下,我不能依賴更新的 SQL 服務器來允許 TLS 1.2,因此我必須在應用程式中允許 TLS 1.0。
我最終遵循了這個答案:https://stackoverflow.com/a/61523341/17892120;
本質上,對于 docker 影像,添加這一行就足夠了:
RUN sed -i 's/DEFAULT@SECLEVEL=2/DEFAULT@SECLEVEL=1/g' /etc/ssl/openssl.cnf
而對于 Azure 的 App Service,我們可以
sed -i 's/DEFAULT@SECLEVEL=2/DEFAULT@SECLEVEL=1/g' /etc/ssl/openssl.cnf && dotnet Test.dll為啟動命令添加。
供將來參考,在 GitHub 中也有關于此的討論,鏈接。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/410256.html
標籤:
