Go应用通过私有IP连接CloudSQL-MySQL遇认证错误求助
问题场景
尝试通过私有IP将Go应用连接到CloudSQL-MySQL,代码如下:
package main import ( "context" "database/sql" "fmt" "log" "net" "sync" "cloud.google.com/go/cloudsqlconn" "github.com/go-sql-driver/mysql" ) const instanceURI = "%s:%s:%s" func main(){ instance := fmt.Sprintf(instanceURI, db.Project, db.GCRegion, db.Instance) d, err := cloudsqlconn.NewDialer(context.Background(), cloudsqlconn.WithOptions(cloudsqlconn.WithCredentialsJSON(db.ServiceAccount))) if err != nil { log.Println(err) } mysql.RegisterDialContext("cloudsqlconn", func(ctx context.Context, addr string) (net.Conn, error) { return d.Dial(ctx, instance, cloudsqlconn.WithPrivateIP()) }) dbURI := fmt.Sprintf("%s:%s@cloudsqlconn(%s)/%s?parseTime=true", db.User, db.Password, instance, db.DbName) dbPool, err := sql.Open("mysql", dbURI) if err != nil { log.Println(err.Error()) } err = dbPool.PingContext(context.Background()) if err != nil { log.Printf("Errors %s pinging DB", err) } }
运行时触发错误:unexpect resp from server for caching_sha2_password perform full authentication
错误原因及解决办法
核心原因
该错误源于MySQL认证插件不兼容:CloudSQL MySQL实例默认采用caching_sha2_password作为用户认证插件,但当前使用的Go MySQL驱动(github.com/go-sql-driver/mysql)在未正确配置的情况下,无法处理该认证方式的完整流程。
解决措施
调整数据库用户认证插件
登录CloudSQL控制台,进入目标MySQL实例的「用户」管理页面,将连接所用的db.User对应的认证插件修改为mysql_native_password,该插件兼容性更强,适配多数旧版本驱动场景。升级Go MySQL驱动版本
确保使用的github.com/go-sql-driver/mysql为最新版本,新版本已原生支持caching_sha2_password认证,需执行依赖更新操作确保版本生效。修改连接字符串参数
在连接URI中添加allowNativePasswords=true参数,强制驱动优先使用原生密码认证逻辑,示例如下:dbURI := fmt.Sprintf("%s:%s@cloudsqlconn(%s)/%s?parseTime=true&allowNativePasswords=true", db.User, db.Password, instance, db.DbName)若实例要求加密连接,需正确配置TLS参数(如指定自定义证书),避免因TLS配置缺失导致认证流程中断。
验证私有IP网络连通性
确认Go应用所在环境(如GKE、Compute Engine)与CloudSQL实例处于同一VPC网络,或已配置VPC peering;同时检查CloudSQL实例是否已启用私有服务访问,确保私有IP可正常访问。
内容的提问来源于stack exchange,提问作者Ritika Garg

