如何在Go语言MySQL驱动中配置使用TLS 1.2?
Go应用配置TLS 1.2连接MySQL 5.7.12
我们需要通过TLS 1.2连接MySQL 5.7.12服务器,Java应用中使用JDBC URL添加enabledTLSProtocols=TLSv1.2参数即可正常连接:
jdbc:mysql://xxxx-001-dev.cluster-xx-2.rds.amazonaws.com/bats?enabledTLSProtocols=TLSv1.2
但在Go应用中直接使用mysql.Config配置连接时,无法实现相同的TLS版本限制;尝试直接设置cfg1.TLS.MinVersion和cfg1.TLS.MaxVersion还触发了空指针panic:
cfg1 := mysql.Config{ User: "admin", Passwd: "xxxxxx", Net: "tcp", Addr: "xxxx-001-dev.cluster-xx-2.rds.amazonaws.com:3306", DBName: "xxxx", AllowNativePasswords: true, } cfg1.TLS.MinVersion = tls.VersionTLS12 cfg1.TLS.MaxVersion = tls.VersionTLS12 sql.Open("mysql", cfg1.FormatDSN())
错误信息:
panic: runtime error: invalid memory address or nil pointer dereference [signal 0xc0000005 code=0x1 addr=0xf8 pc=0x64ac21] goroutine 1 [running]: main.main() C:/cmb-mmt/chp-schema-validation/main.go:28 +0x61
问题原因
mysql.Config结构体中的TLS字段默认是nil,直接访问其MinVersion和MaxVersion字段会触发空指针引用错误。
正确配置方法
方法1:初始化时直接赋值TLS配置
在创建mysql.Config实例时,直接初始化TLS字段为mysql.TLSConfig指针:
import ( "database/sql" "log" "crypto/tls" "github.com/go-sql-driver/mysql" ) func main() { cfg1 := mysql.Config{ User: "admin", Passwd: "xxxxxx", Net: "tcp", Addr: "xxxx-001-dev.cluster-xx-2.rds.amazonaws.com:3306", DBName: "xxxx", AllowNativePasswords: true, TLS: &mysql.TLSConfig{ MinVersion: tls.VersionTLS12, MaxVersion: tls.VersionTLS12, }, } db, err := sql.Open("mysql", cfg1.FormatDSN()) if err != nil { log.Fatalf("连接失败: %v", err) } // 后续操作... }
方法2:注册自定义TLS配置
如果需要复用TLS配置,可以先创建并注册自定义TLS配置,再在DSN中指定:
import ( "database/sql" "log" "crypto/tls" "github.com/go-sql-driver/mysql" ) func main() { // 创建自定义TLS配置,限定仅使用TLS 1.2 customTLS := &tls.Config{ MinVersion: tls.VersionTLS12, MaxVersion: tls.VersionTLS12, // 若需要验证服务器证书,可添加RootCAs配置 // RootCAs: x509.NewCertPool(), } // 注册TLS配置,命名为"tls12" err := mysql.RegisterTLSConfig("tls12", customTLS) if err != nil { log.Fatalf("注册TLS配置失败: %v", err) } cfg1 := mysql.Config{ User: "admin", Passwd: "xxxxxx", Net: "tcp", Addr: "xxxx-001-dev.cluster-xx-2.rds.amazonaws.com:3306", DBName: "xxxx", AllowNativePasswords: true, TLSConfig: "tls12", // 指定使用已注册的TLS配置 } db, err := sql.Open("mysql", cfg1.FormatDSN()) if err != nil { log.Fatalf("连接失败: %v", err) } // 后续操作... }
注意事项
- MySQL 5.7.12原生支持TLS 1.2,确保服务器端已启用TLS(AWS RDS MySQL默认已开启)
- 连接前需验证安全组是否允许3306端口的TCP访问
内容的提问来源于stack exchange,提问作者Bharat Nanwani
相关产品推荐
相关产品推荐

