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
- Call mysql.RegisterServerPubKey('mykey', rsaPubKey) before opening the connection.
- Check the key spelling matches exactly between RegisterServerPubKey and the DSN.
- 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
- Register server public keys in a single init() before opening connections.
- Track registered names in an app-level set you can validate against.
- Drop serverPubKey unless you specifically need to pin the server key.
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
- invalid DSN: did you forget to escape a param value?
- invalid DSN: missing the slash separating the database name
- default addr for network '{cfg.Net}' unknown
- invalid value / unknown config name: {cfg.TLSConfig}
- invalid bool value: {value}
AI-assisted analysis of go-sql-driver/mysql@c426bd9379 (2026-08-04).
Data as JSON: /data/errors/ab73dd9c2f579532.json.
Report an issue: GitHub.