Skip to content
Open
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
164 changes: 164 additions & 0 deletions enhancements/security/api-tls-curves-config.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
---
title: api-tls-curves-config
authors:
- richardsonnick
- davidesalerno
reviewers:
- dsalerno # OpenShift networking stack knowledge
approvers:
- JoelSpeed
api-approvers:
- JoelSpeed
creation-date: 2025-11-19
last-updated: 2025-11-20
tracking-link: # link to the tracking ticket (for example: Jira Feature or Epic ticket) that corresponds to this enhancement
- https://issues.redhat.com/browse/HPCASE-153
---

# OpenShift API TLS Curves Configuration

## Summary

This enhancement adds the option to configure a list of supported TLS curves in the OpenShift API config server. This configuration mirrors the existing `ciphersuites` option in the OpenShift API config TLS settings.

## Motivation

As cryptographic standards evolve, there is a growing need to support Post-Quantum Cryptography (PQC) to protect against future threats. This enhancement contributes directly to the goal of enabling PQC support in OpenShift. It provides the mechanism to configure specific TLS curves in the OpenShift API, allowing administrators to explicitly enable PQC-ready curves such as ML-KEM. This ensures OpenShift clusters can be configured to meet emerging security compliance requirements and future-proof communications.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe not necessary, up to you - but is worth making it explicit that as an admin I want to move into hybrid pqc (the first phase of getting pqc safe)


### User Stories

As an administrator, I want to explicitely set the supported TLS curves to ensure PQC readiness throughout OpenShift so that I can ensure the security of TLS communication in the era of quantum computing.

### Goals

To provide an interface that allows the setting of TLS curves to be used cluser wide.

This goal is part of the larger goal to:
1. Provide the necessary knobs to specify a PQC ready TLS configuration in OpenShift.
2. Improve the adaptability of the cluster's TLS configuration to provide support for the constantly evolving TLS landscape.

### Non-Goals

1. Overhauling the current process of TLS configuration in OpenShift. This change merely extends the current TLS options.

## Proposal

This proposal is to expose the ability to specify the TLS curves used in OpenShift components to the OpenShift administrator.
Currently, administrators can specify a custom TLS profile where they can specifically set which TLS ciphersuites and the minimum TLS version as opposed to using one of the preconfigured TLS profiles. Specifying the set of supported TLS curves will mirror this process of setting [supported ciphers and the minimum TLS version](https://github.com/openshift/api/blob/138912d4ee9944c989f593c51f15c41908155856/config/v1/types_tlssecurityprofile.go#L206).

The current state of the OpenShift TLS stack uses a default set of curves with no way to specify them. This eases the burden on administators, however new quantum secure algorithms rely on a set of curves outside of the conventional default curves. For example, curves like [ML-KEM](https://www.ietf.org/archive/id/draft-connolly-tls-mlkem-key-agreement-05.html) provide a quantum safe mechanism for sharing secrets necessary for the TLS handshake, whereas curves like [X22519](https://datatracker.ietf.org/doc/html/rfc7748) (a commonly used conventional curve) are [weak against quantum computing](https://crypto.stackexchange.com/questions/59770/how-effective-is-quantum-computing-against-elliptic-curve-cryptography).

The ability to set curves explicitely will also make it possible to align our
OpenShift TLS profiles to match the curves present in the [Mozilla TLS Profiles](https://wiki.mozilla.org/Security/Server_Side_TLS).

This change will require working with OpenShift component owners to use this new field, however this is outside the scope of this proposal.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We probably ought to make sure we understand how components are going to use these new fields and include stakeholders from each of the teams responsible for these components as part of this enhancement proposal.

Just adding a new field without any backing implementation isn't helpful to anyone.


### Workflow Description

Administrators will use the [existing custom TLS security profile flow](https://docs.redhat.com/en/documentation/openshift_container_platform/4.20/html/security_and_compliance/tls-security-profiles#tls-profiles-ingress-configuring_tls-security-profiles) for setting the supported curves.

Specifically administrators will use

`oc edit IngressController default -n openshift-ingress-operator`

and edit the spec.tlsSecurityProfile field:

```
apiVersion: operator.openshift.io/v1
kind: IngressController
...
spec:
tlsSecurityProfile:
type: Custom
custom:
ciphers:
- ECDHE-RSA-CHACHA20-POLY1305
minTLSVersion: VersionTLS13
curves:
- X25519MLKEM512
...
```

### API Extensions
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please include one of:

  • A link to the proposed API changes
  • A copy of the proposed API changes


- Adds a `curves` field to the `spec.tlsSecurityProfile`
- The addition of this field should not affect existing API behaviour

### Topology Considerations

#### Hypershift / Hosted Control Planes

N/A
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this supported on HyperShift? Are there any special considerations for HyperShift here?



#### Standalone Clusters

N/A


#### Single-node Deployments or MicroShift

N/A
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this supported for single node? For microshift?



### Implementation Details/Notes/Constraints

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if no curves are provided what are the defaults - just down to whatever defaults are provided by the respective crypto modules? I would maybe make it as explicit as possible different configuration setups. Might be useful to see examples of proper config, bad config, etc. and the data flow for each maybe?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1. It is imperative that introducing this new field doesn't change existing configurations, where curves cannot be predefined.

If there are curves listed, I assume that would override the defaults and only the explicitly listed curves would be allowed?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there any intention to dictate a common default that all OpenShift components should use?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I brought that question up in a separate meeting. There are a few facets to this.

Mapping from named profiles

Right now in OCP:

  • library-go defines the mapping of profile name to MinTLSVersion and CipherSuites (which means it is possible for different controllers to use different defaults due to using different commits of library-go). This mapping is updated periodically to reflect Mozilla's definitions of the named profiles.
  • The library-go mapping does not include curves (because it isn't yet part of the API), which means that the default curves end up coming from the TLS implementation.

Mozilla's mapping does specify curves, so I would expect that we would update library-go to include those curve mappings.

Custom Profile

If a custom profile does not mention curves, what should we suggest implementers do? I am not a cryptography person, so I don't think I'm qualified to make a judgement here, but I suspect that the safest thing to do is to honor the defaults from the crypto module. That is likely what most implementations do now.

Consistency among all OCP components

When a named profile is used, I suggested a future improvement if we want to further improve consistency. It may make sense to implement a controller for APIs that embed the TLS profile stanza, such that the centralized controller could implement the mapping and provide the specific parameters that all components should pass to the TLS server configs. I think this aspect should be treated as a follow-up since it would significantly increase the scope of the initial effort, which by itself will be a major improvement to our ability to consistently apply TLS configuration to all core components much more consistently than we do now.

#### Mismatching curves and ciphersuites
There is a case where the administrator could incorrectly specificy a set of ciphersuites
that do not work with each other. For example using an RSA ciphersuite with a ECDHE curve (such as TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 and P-256). The default behavior OpenSSL as well as go's crypto/tls (both used extensively in OpenShift) is to fail at **TLS handshake time**. . The TLS server instance will start normally, but when TLS clients attempt to handshake with the TLS server, the handshake will fail with a `handshake failure`

I propose that this is the *desired* behavior of OpenShift. Administrators that utilize the custom TLS profile are foregoing the guaranteed correctly configured TLS profiles (such as Modern, Intermediate, etc.) and the system should comply accordingly. The landscape of TLS is constantly evolving and relying on the TLS implementation (Openssl, golang crypto/tls, etc) itself provides users more flexibility. Adding a validation system on top as part of the OpenShift would be cumbersome and restricts admins to use what we deem compatible rather than what the underylying TLS implementation is capable of.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adding a validation system on top as part of the OpenShift would be cumbersome and restricts admins to use what we deem compatible rather than what the underylying TLS implementation is capable of

We are generally expected to be the SMEs here. If there are combinations that we know ahead of time will not work, why should we not prevent users from doing that earlier in the loop?

Where possible we should provide appropriate guardrails to help prevent users from breaking their own clusters.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point. I was initially worried about restricting flexibility, but if we know a combination definitely won't work, we should prevent it early rather than letting it fail at runtime. I've updated the proposal to include validation.


### Risks and Mitigations

OpenShift components could forego utilizing the curves set in the API config. However, this is a risk
that exists in the current TLS config flow. This change will require coordination with component owners
to comply with the new TLS config field.
Comment on lines +112 to +116
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a risk that setting an incorrect TLS custom suite could brick the cluster?

I'm not sure what the configuration topology is, but if the apiserver-operator is querying the apiserver to understand what TLS profile to configure the apiserver with, and the apiserver-operator configures the apiserver with an invalid TLS profile, that would mean:

  • The apiserver is no longer able to handshake with clients, so admins would not be able to patch the TLS profile back to a working state because the apiserver server would respond with a handshake failure.
  • Even if the TLS profile could be patched somehow, the apiserver-operator could lose its connection with the now-broken apiserver, which would mean it would not know to re-configure the apiserver back to a working TLS profile.

Is there any proposed mitigation for such a possibility?


### Drawbacks

N/A

## Alternatives (Not Implemented)

N/A

## Open Questions [optional]

1. I propose that we should *not* include a validation system for custom TLS configurations. See "Proposal" for more context. However, this restricts the ability to ensure that the TLS config works when a new config is set, instead relying on failed handshakes to clue the administator in on any issues. There could also be "skew" between the supported curves and ciphers of the various TLS implementations utilized within OpenShift. This could make it difficult to reason about the state of the TLS capabilities of the cluster. Any thoughts?
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IMO we should probably only support curves that all of the affected components by this change are capable of supporting


## Test Plan

Utilize the `oc edit` and `oc describe` commands to verify that the API config server is exposing the correct list of curves.

Once components are onboarded to utilize these curves, the cluster will be scanned with the [tls-scanner tool](github.com/openshift/tls-scanner) to verify that TLS implemenations within OpenShift expose these curves as supported. It should also be verified that the TLS implementations will fallback to a default curve set when not specified.

### Dev Preview -> Tech Preview

- Ability to specify supported curves.

### Tech Preview -> GA

- Verify the general support for these curves using the [tls-scanner](github.com/openshift/tls-scanner)

### Removing a deprecated feature

N/A


## Upgrade / Downgrade Strategy

In openshift versions where the TLS curves are not specified, components will not specify the set of curves to be used to their underlying TLS implementations. The TLS implementation should fallback to a sensible default set of curves when not set. This should be verified during the component onboarding work as outlined in the test plan.


## Version Skew Strategy

By default, TLS implementations (openssl, golang, etc...) fallback to a sensible default when curves are not set. Currently, openshift components that do not set curves exhibit this behavior. This should be verified during component onboarding.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh this might address above a bit - but might still be good to show a config example and then the expected result for the difference scenarios


## Operational Aspects of API Extensions

N/A

## Support Procedures

N/A