go-sql-driver/mysql · error

invalid value / unknown server pub key name: {cfg.ServerPubK

Error message

invalid value / unknown server pub key name: {cfg.ServerPubKey}

What it means

When cfg.ServerPubKey is non-empty, normalize() looks it up via getServerPubKey in the registry populated by RegisterServerPubKey. If no key was registered under that name it returns 'invalid value / unknown server pub key name' at dsn.go:225. This registry is used to cache an RSA public key for caching_sha2_password authentication.

Source

Thrown at dsn.go:225

		default:
			cfg.TLS = getTLSConfigClone(cfg.TLSConfig)
			if cfg.TLS == nil {
				return errors.New("invalid value / unknown config name: " + cfg.TLSConfig)
			}
		}
	}

	if cfg.TLS != nil && cfg.TLS.ServerName == "" && !cfg.TLS.InsecureSkipVerify {
		host, _, err := net.SplitHostPort(cfg.Addr)
		if err == nil {
			cfg.TLS.ServerName = host
		}
	}

	if cfg.ServerPubKey != "" {
		cfg.pubKey = getServerPubKey(cfg.ServerPubKey)
		if cfg.pubKey == nil {
			return errors.New("invalid value / unknown server pub key name: " + cfg.ServerPubKey)
		}
	}

	if cfg.Logger == nil {
		cfg.Logger = defaultLogger
	}

	return nil
}

func writeDSNParam(buf *bytes.Buffer, hasParam *bool, name, value string) {
	buf.Grow(1 + len(name) + 1 + len(value))
	if !*hasParam {
		*hasParam = true
		buf.WriteByte('?')
	} else {
		buf.WriteByte('&')
	}

View on GitHub (pinned to c426bd9379)

Solutions

  1. Call mysql.RegisterServerPubKey('mykey', rsaPubKey) before opening the connection.
  2. Check the key spelling matches exactly between RegisterServerPubKey and the DSN.
  3. Drop serverPubKey from the DSN if you do not need to pin the key; the driver will fetch it from the server when needed.

Example fix

// before
db, _ := sql.Open("mysql", "user@tcp(host:3306)/db?serverPubKey=mykey")
// after
mysql.RegisterServerPubKey("mykey", rsaPubKey)
db, _ := sql.Open("mysql", "user@tcp(host:3306)/db?serverPubKey=mykey")
Defensive patterns

Strategy: validation

Validate before calling

// Keep an app-level set of the server-pubkey names you have registered.
var registeredPubKeys = map[string]bool{}
// after each RegisterServerPubKey(name, key): registeredPubKeys[name] = true
func pubKeyKnown(name string) bool { return registeredPubKeys[name] }

Try / catch

if _, err := mysql.ParseDSN(dsn); err != nil && strings.Contains(err.Error(), "unknown server pub key name") {
    // register the key, or remove serverPubKey from the DSN
}

Prevention

When it happens

Trigger: A DSN with '?serverPubKey=mykey' without a prior mysql.RegisterServerPubKey('mykey', rsaPubKey); or a misspelled key name; or the key was deregistered.

Common situations: Pin-the-server-key setups where registration runs in a different init order; key deregistered between connections; typo between RegisterServerPubKey and the DSN; registration done in a forked/child process.

Related errors


AI-assisted analysis of go-sql-driver/mysql@c426bd9379 (2026-08-04). Data as JSON: /data/errors/ab73dd9c2f579532.json. Report an issue: GitHub.