golang/go · error
tls: server offered only incompatible point formats
Error message
tls: server offered only incompatible point formats
What it means
In the ec_point_formats extension, Go only implements pointFormatUncompressed (0). After scanning hs.serverHello.supportedPoints it sets supportsPointFormat if uncompressed is present and offeredNonCompressedFormat if any other format appears. If the server's list is non-empty, contains only non-uncompressed formats, and lacks uncompressed, the ECDHE key exchange cannot proceed.
Source
Thrown at src/crypto/tls/handshake_client.go:903
return false, err
}
if hs.serverHello.compressionMethod != compressionNone {
c.sendAlert(alertIllegalParameter)
return false, errors.New("tls: server selected unsupported compression format")
}
supportsPointFormat := false
offeredNonCompressedFormat := false
for _, format := range hs.serverHello.supportedPoints {
if format == pointFormatUncompressed {
supportsPointFormat = true
} else {
offeredNonCompressedFormat = true
}
}
if !supportsPointFormat && offeredNonCompressedFormat {
return false, errors.New("tls: server offered only incompatible point formats")
}
if c.handshakes == 0 && hs.serverHello.secureRenegotiationSupported {
c.secureRenegotiation = true
if len(hs.serverHello.secureRenegotiation) != 0 {
c.sendAlert(alertHandshakeFailure)
return false, errors.New("tls: initial handshake had non-empty renegotiation extension")
}
}
if c.handshakes > 0 && c.secureRenegotiation {
var expectedSecureRenegotiation [24]byte
copy(expectedSecureRenegotiation[:], c.clientFinished[:])
copy(expectedSecureRenegotiation[12:], c.serverFinished[:])
if !bytes.Equal(hs.serverHello.secureRenegotiation, expectedSecureRenegotiation[:]) {
c.sendAlert(alertHandshakeFailure)
return false, errors.New("tls: incorrect renegotiation extension contents")
}View on GitHub (pinned to b6b368adc5)
Solutions
- Update the server to advertise uncompressed points (or to RFC 8422 / TLS 1.3, which remove the extension).
- Move the connection to TLS 1.3 where ec_point_formats is not negotiated.
Defensive patterns
Strategy: try-catch
Type guard
func isIncompatiblePointFormats(err error) bool {
return err != nil && strings.Contains(err.Error(), "server offered only incompatible point formats")
} Try / catch
if _, err := tls.Dial("tcp", addr, cfg); err != nil {
if isIncompatiblePointFormats(err) {
// Retry over TLS 1.3 where the extension is absent.
cfg.MinVersion = tls.VersionTLS13
_, err = tls.Dial("tcp", addr, cfg)
}
} Prevention
- Prefer TLS 1.3 to avoid the deprecated ec_point_formats extension.
- Patch servers to advertise uncompressed points.
When it happens
Trigger: TLS 1.2 ECDHE server advertising only ANSI X9.62 compressed points in ec_point_formats; server strictly requiring compressed point encoding. RFC 8422 / TLS 1.3 deprecate this extension so modern peers do not hit it.
Common situations: Niche or embedded TLS stacks; rare in mainstream deployments.
Understand the failure class
- SSL/TLS and certificate errors — how TLS handshakes and certificate validation fail.
Related errors
- tls: server echoed TLS 1.3 compatibility session ID in TLS 1
- tls: received unexpected CertificateStatus message
- tls: no key exchanges supported by both client and server
- tls: invalid client key share
- tls: server selected unoffered curve
AI-assisted analysis of golang/go@b6b368adc5 (2026-08-12).
Data as JSON: /api/errors/469bcdf1c5e7d5d8.
Report an issue: GitHub.