[英]SQL Server Pre-Login Handshake (error: 31 - Encryption(ssl/tls) handshake failed)
[英]Golang connection to SQL Server error - "TLS Handshake failed: Cannot read handshake packet: EOF"
我編寫了一個系統,可以自動執行在 Microsoft Azure 上部署 VM 的過程,在其上安裝 Sql Server,然后針對新安裝的服務器執行.sql
腳本以初始化環境。 周五,這一切都按預期進行。 今天,我收到了這個錯誤。
我的代碼具有以下相關導入:
import(
"database/sql"
_ "github.com/denisenkom/go-mssqldb"
)
並使用以下代碼在安裝后實際連接到數據庫(為簡潔起見,刪除了錯誤處理):
// variables
connectionString := "sqlserver://MasterUser:MasterPassword@xx.xx.xx.xxx:1433"
dbName := "mssql"
dbFile := "mssql.sql"
// open database / get metadata sorted
db, err := sql.Open(dbname, connectionString)
defer db.Close()
//Check to see if the connection is successful.
err = db.Ping() // <--------
// file input
fileBytes, err := ioutil.ReadFile("../sql/" + dbsql)
fileReader := bytes.NewReader(fileBytes)
// parse line-by-line
scanner := bufio.NewScanner(fileReader)
lineNo := 0
for scanner.Scan() {
toExec := scanner.Text()
lineNo += 1
_, err = db.Exec(toExec) // <--------
}
該錯誤發生在db.Ping()
和每個db.Exec()
。 在這些情況下,與err
關聯的消息是
TLS Handshake failed: Cannot read handshake packet: EOF
至於服務器本身,我使用以下腳本通過 SSH 安裝它:
# install mssql server
sudo wget -qO- https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
sudo add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/16.04/mssql-server-2017.list)"
curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list | sudo tee /etc/apt/sources.list.d/msprod.list
sudo apt-get -y update
sudo apt-get -y install mssql-server
# configure MSSQL
sudo /opt/mssql/bin/mssql-conf setup
# install local tools
sudo ACCEPT_EULA=y apt-get -y install mssql-tools
# do basic initialization in advance of .sql script
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P ${MasterPassword} -Q "CREATE LOGIN ${MasterUser} WITH PASSWORD = '${MasterPassword}';"
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P ${MasterPassword} -Q "CREATE USER ${MasterUser} FOR LOGIN ${MasterUser};"
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P ${MasterPassword} -Q "ALTER SERVER ROLE sysadmin ADD MEMBER ${MasterUser};"
否則這似乎工作正常 - 我通過 SSH 手動連接到實例沒有問題,並且該腳本退出時沒有錯誤。 我不確定它的相關性。
我自己嘗試通過 SSH 連接到服務器並在本地打開 sql server 控制台,結果出現以下錯誤消息:
$ /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P *********
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : TCP Provider: Error code 0x2746.
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Client unable to establish connection.
這可能是相關的,但我不知道如何。
這是什么原因造成的,我該如何解決? 錯誤是在我的代碼中,還是在我創建的充當服務器的 VM 上,還是介於兩者之間? 我將如何最好地解決問題?
我最終在沒有確定根本原因的情況下解決了這個問題。 一旦我嘗試通過 SSH 連接到 VM 並在本地訪問數據庫,我遇到了以下錯誤:
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : TCP Provider: Error code 0x2746.
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Client unable to establish connection.
跟進這些讓我找到了這個 GitHub 問題,它為我的問題提供了解決方案。 它看起來是一個版本問題 - 在我的安裝腳本中,我替換了
sudo apt-get -y install mssql-server
和
sudo apt-get -y install mssql-server=14.0.3192.2-2
問題就解決了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.