Skip to content

Commit ef83012

Browse files
committed
fix(RHOAIENG-38319): update tls CA subject and DNS names
1 parent 38d21b4 commit ef83012

File tree

1 file changed

+38
-11
lines changed

1 file changed

+38
-11
lines changed

src/codeflare_sdk/common/utils/generate_cert.py

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@
1616
import os
1717
from cryptography.hazmat.primitives import serialization, hashes
1818
from cryptography.hazmat.primitives.asymmetric import rsa
19+
from cryptography.hazmat.backends import default_backend
1920
from cryptography import x509
2021
from cryptography.x509.oid import NameOID
22+
import ipaddress
2123
import datetime
2224
from ..kubernetes_cluster.auth import (
2325
config_check,
@@ -163,8 +165,29 @@ def generate_tls_cert(cluster_name, namespace, days=30):
163165
ca_cert = secret.get("ca.crt")
164166
ca_key = secret.get("tls.key")
165167

168+
if not ca_cert:
169+
raise ValueError(
170+
f"CA certificate (ca.crt or tls.crt) not found in secret {secret_name}. "
171+
f"Available keys: {list(secret.keys())}"
172+
)
173+
if not ca_key:
174+
raise ValueError(
175+
f"CA private key (tls.key) not found in secret {secret_name}. "
176+
f"Available keys: {list(secret.keys())}"
177+
)
178+
179+
# Decode and write CA certificate
180+
ca_cert_pem = base64.b64decode(ca_cert).decode("utf-8")
166181
with open(os.path.join(tls_dir, "ca.crt"), "w") as f:
167-
f.write(base64.b64decode(ca_cert).decode("utf-8"))
182+
f.write(ca_cert_pem)
183+
184+
# Load the CA certificate to get its subject name (which will be the issuer for client cert)
185+
# This ensures the client certificate's issuer matches the CA's subject
186+
# Previously, we hardcoded "root-ca" which doesn't match the actual CA subject
187+
ca_cert_obj = x509.load_pem_x509_certificate(
188+
ca_cert_pem.encode("utf-8"), default_backend()
189+
)
190+
ca_subject = ca_cert_obj.subject
168191

169192
# Generate tls.key and signed tls.cert locally for ray client
170193
# Similar to running these commands:
@@ -191,16 +214,22 @@ def generate_tls_cert(cluster_name, namespace, days=30):
191214
with open(os.path.join(tls_dir, "tls.key"), "w") as f:
192215
f.write(tls_key.decode("utf-8"))
193216

217+
head_svc_name = f"{cluster_name}-head-svc"
218+
service_dns = f"{head_svc_name}.{namespace}.svc"
219+
service_dns_cluster_local = f"{head_svc_name}.{namespace}.svc.cluster.local"
220+
221+
san_list = [
222+
x509.DNSName("localhost"),
223+
x509.IPAddress(ipaddress.IPv4Address("127.0.0.1")),
224+
x509.DNSName(head_svc_name),
225+
x509.DNSName(service_dns),
226+
x509.DNSName(service_dns_cluster_local),
227+
]
228+
194229
one_day = datetime.timedelta(1, 0, 0)
195230
tls_cert = (
196231
x509.CertificateBuilder()
197-
.issuer_name(
198-
x509.Name(
199-
[
200-
x509.NameAttribute(NameOID.COMMON_NAME, "root-ca"),
201-
]
202-
)
203-
)
232+
.issuer_name(ca_subject) # Use the actual CA certificate's subject as issuer
204233
.subject_name(
205234
x509.Name(
206235
[
@@ -213,9 +242,7 @@ def generate_tls_cert(cluster_name, namespace, days=30):
213242
.not_valid_after(datetime.datetime.today() + (one_day * days))
214243
.serial_number(x509.random_serial_number())
215244
.add_extension(
216-
x509.SubjectAlternativeName(
217-
[x509.DNSName("localhost"), x509.DNSName("127.0.0.1")]
218-
),
245+
x509.SubjectAlternativeName(san_list),
219246
False,
220247
)
221248
.sign(

0 commit comments

Comments
 (0)