hashicorp/nomad · error

Specified cipher suites don't support the certificate signat

Error message

Specified cipher suites don't support the certificate signature algorithm %s, consider adding more cipher suites to match this signature algorithm.

What it means

After parsing the cipher list, ParseCiphers cross-checks each cipher's signature algorithm (RSA vs ECDSA) against the signature algorithm of the configured certificate. If no specified cipher supports the certificate's signature algorithm, the TLS handshake could never succeed, so the function errors out with this guidance message.

Source

Thrown at helper/tlsutil/config.go:427

	if keyLoader.GetCertificate() != nil {
		supportedSignatureAlgorithm, err := getSignatureAlgorithm(keyLoader.GetCertificate())
		if err != nil {
			return []uint16{}, err
		}

		for _, cipher := range parsedCiphers {
			if supportedCipherSignatures[cipher] == supportedSignatureAlgorithm {
				// Positive case, return the matched cipher suites as the signature
				// algorithm is also supported
				return suites, nil
			}
		}

		// Negative case, if this is reached it means that none of the specified
		// cipher suites signature algorithms match the signature algorithm
		// for the certificate.
		return []uint16{}, fmt.Errorf("Specified cipher suites don't support the certificate signature algorithm %s, consider adding more cipher suites to match this signature algorithm.", supportedSignatureAlgorithm)
	}

	// Default in case this function is called but TLS is not actually configured
	// This is only reached if the TLS certificate is nil
	return []uint16{}, nil
}

// getSignatureAlgorithm returns the signature algorithm for a TLS certificate
// This is determined by examining the type of the certificate's public key,
// as Golang doesn't expose a more straightforward  API which returns this
// type
func getSignatureAlgorithm(tlsCert *tls.Certificate) (signatureAlgorithm, error) {
	privKey := tlsCert.PrivateKey
	switch privKey.(type) {
	case *rsa.PrivateKey:
		return rsaStringRepr, nil
	case *ecdsa.PrivateKey:
		return ecdsaStringRepr, nil

View on GitHub (pinned to 482b49bf1a)

Solutions

  1. Add cipher suites matching the certificate's signature algorithm (e.g. add TLS_ECDHE_ECDSA_* ciphers for an ECDSA cert).
  2. Or issue a certificate whose key type matches the configured cipher suites.
  3. Remove the restrictive tls_cipher_suites setting to use the defaults, which cover both algorithms.

Example fix

// before
tls_cipher_suites = "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256" // cert is ECDSA
// after
tls_cipher_suites = "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256"
Defensive patterns

Strategy: validation

Validate before calling

// ensure ciphers cover the cert's key type
isECDSA := cert.SignatureAlgorithm == x509.ECDSAWithSHA256 || cert.SignatureAlgorithm == x509.ECDSAWithSHA384
needPrefix := "TLS_ECDHE_RSA_"
if isECDSA { needPrefix = "TLS_ECDHE_ECDSA_" }
if !strings.Contains(tlsCipherSuites, needPrefix) {
    return fmt.Errorf("add %s* ciphers to match cert signature algorithm", needPrefix)
}

Prevention

When it happens

Trigger: Calling ParseCiphers with a certificate whose key is ECDSA (or RSA) while every cipher in TLSCipherSuites is for the other key type, e.g. an ECDSA cert paired only with TLS_ECDHE_RSA_* ciphers.

Common situations: Switching certificates from RSA to ECDSA (or vice versa) without updating tls_cipher_suites; restricting the cipher list too aggressively for hardening; automated TLS rotation changing the key type.

Understand the failure class

Related errors


AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04). Data as JSON: /api/errors/1c379c5980477594. Report an issue: GitHub.