Я использую Go MySQL драйвер как часть проекта.Недавно возникла необходимость включить SSL в базе данных MySQL, к которой я подключаюсь.У меня есть два сервера, которые настроены с TLSv1.1
.На одном сервере я могу успешно подключиться, но на другом я получаю unexpected EOF
из библиотеки.
Я попытался установить MaxIdleConnections
в 0, как описано в Golang MySQL error - packages.go: 33: неожиданный EOF , но не повезло.До включения SSL соединения с сервером работали.Существуют и другие приложения, не написанные на Go, которые могут успешно подключаться с использованием тех же учетных данных.
Когда мое приложение запускается, команда ping немедленно завершается неудачно.Журналы сервера MySQL говорят bad handshake
.Что-то не так с моим кодом подключения, приведенным ниже, или в настройке базы данных может быть отказано в соединении с skip-verify
?
import (
"database/sql"
"io/ioutil"
"strings"
"text/template"
log "github.com/sirupsen/logrus"
// Import runtime for MySQL
mysql "github.com/go-sql-driver/mysql"
)
type DatabaseConnection struct {
Hostname string
Port int
Database string
Username string
Password string
}
func CreateSSLConnection(db *DatabaseConnection) (*sql.DB, error) {
templateString := `{{.Username}}:{{.Password}}@{{.Hostname}}:{{.Port}}/{{.Database}}?tls=skip-verify`
conn, err := connectToDatabase("mysql", templateString, db)
// error: "unexpected EOF"
err = conn.Ping()
return conn, err
}
func connectToDatabase(databaseType string, connectionTemplateString string, db *DatabaseConnection) (*sql.DB, error) {
connectionTemplate := template.Must(template.New("connectionString").Parse(connectionTemplateString))
builder := strings.Builder{}
err := connectionTemplate.Execute(&builder, db)
if err != nil {
log.WithFields(log.Fields{
"template": connectionTemplateString,
"error": err,
}).Error("Failed to create connection string")
return nil, err
}
return sql.Open(databaseType, builder.String())
}