1616import os
1717from cryptography .hazmat .primitives import serialization , hashes
1818from cryptography .hazmat .primitives .asymmetric import rsa
19+ from cryptography .hazmat .backends import default_backend
1920from cryptography import x509
2021from cryptography .x509 .oid import NameOID
22+ import ipaddress
2123import datetime
2224from ..kubernetes_cluster .auth import (
2325 config_check ,
@@ -163,8 +165,27 @@ 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+ # Extract CA subject to use as issuer for client certificate
185+ ca_cert_obj = x509 .load_pem_x509_certificate (
186+ ca_cert_pem .encode ("utf-8" ), default_backend ()
187+ )
188+ ca_subject = ca_cert_obj .subject
168189
169190 # Generate tls.key and signed tls.cert locally for ray client
170191 # Similar to running these commands:
@@ -191,16 +212,22 @@ def generate_tls_cert(cluster_name, namespace, days=30):
191212 with open (os .path .join (tls_dir , "tls.key" ), "w" ) as f :
192213 f .write (tls_key .decode ("utf-8" ))
193214
215+ head_svc_name = f"{ cluster_name } -head-svc"
216+ service_dns = f"{ head_svc_name } .{ namespace } .svc"
217+ service_dns_cluster_local = f"{ head_svc_name } .{ namespace } .svc.cluster.local"
218+
219+ san_list = [
220+ x509 .DNSName ("localhost" ),
221+ x509 .IPAddress (ipaddress .IPv4Address ("127.0.0.1" )),
222+ x509 .DNSName (head_svc_name ),
223+ x509 .DNSName (service_dns ),
224+ x509 .DNSName (service_dns_cluster_local ),
225+ ]
226+
194227 one_day = datetime .timedelta (1 , 0 , 0 )
195228 tls_cert = (
196229 x509 .CertificateBuilder ()
197- .issuer_name (
198- x509 .Name (
199- [
200- x509 .NameAttribute (NameOID .COMMON_NAME , "root-ca" ),
201- ]
202- )
203- )
230+ .issuer_name (ca_subject )
204231 .subject_name (
205232 x509 .Name (
206233 [
@@ -213,9 +240,7 @@ def generate_tls_cert(cluster_name, namespace, days=30):
213240 .not_valid_after (datetime .datetime .today () + (one_day * days ))
214241 .serial_number (x509 .random_serial_number ())
215242 .add_extension (
216- x509 .SubjectAlternativeName (
217- [x509 .DNSName ("localhost" ), x509 .DNSName ("127.0.0.1" )]
218- ),
243+ x509 .SubjectAlternativeName (san_list ),
219244 False ,
220245 )
221246 .sign (
0 commit comments