Questo documento descrive i passaggi per creare un'autorità di certificazione subordinata (Sub CA).
Le Sub CA sono responsabili dell'emissione di certificati direttamente alle entità finali, come utenti, computer e dispositivi. Sono firmate crittograficamente da una CA principale, spesso la CA radice. I sistemi che considerano attendibile la CA radice considerano automaticamente attendibili le Sub CA e i certificati che emettono.
Il firmatario del certificato CA potrebbe essere un'altra CA creata nel servizio CA, ad esempio la CA radice, o una CA esterna. Con le CA esterne, il servizio CA genera una richiesta di firma del certificato (CSR) che la CA esterna deve firmare.
Questo documento è destinato ai gruppi di operatori di applicazioni, come sviluppatori di applicazioni o data scientist, che gestiscono i cicli di vita dei certificati all'interno del loro progetto. Per saperne di più, consulta la sezione Pubblico della documentazione di GDC con air gap.
Prima di iniziare
Prima di poter creare una Sub CA, devi richiedere le autorizzazioni necessarie e preparare l'ambiente.
Richiedi ruoli IAM
Per creare, aggiornare ed eliminare le risorse dell'autorità di certificazione, contatta l'amministratore IAM dell'organizzazione per richiedere il ruolo Amministratore del servizio CA (certificate-authority-service-admin) nello spazio dei nomi del progetto dell'autorità di certificazione.
Prepara l'ambiente
Scarica e installa la CLI gdcloud, se non l'hai ancora fatto.
Genera un file kubeconfig per configurare l'accesso
kubectl.
Crea una Sub CA gestita
Per una Sub CA gestita, il firmatario del certificato CA è un'altra CA (CA radice) creata nel servizio CA.
Per creare una Sub CA gestita, applica una risorsa personalizzata all'istanza di Distributed Cloud Appliance.
Crea una risorsa
CertificateAuthoritye salvala come file YAML denominatosubca.yaml:apiVersion: pki.security.gdc.goog/v1 kind: CertificateAuthority metadata: Name: SUB_CA_NAME namespace: USER_PROJECT_NAMESPACE spec: caProfile: commonName: COMMON_NAME duration: DURATION renewBefore: RENEW_BEFORE organizations: - ORGANIZATIONS organizationalUnits: - ORGANIZATIONAL_UNITS countries: - COUNTRIES localities: - LOCALITIES provinces: - PROVINCES streetAddresses: - STREET_ADDRESSES postalCodes: - POSTAL_CODES caCertificate: managedSubCA: certificateAuthorityRef: name: ROOT_CA_NAME namespace: USER_PROJECT_NAMESPACE certificateProfile: keyUsage: - digitalSignature - keyCertSign - crlSign extendedKeyUsage: - EXTENDED_KEY_USAGE secretConfig: secretName: SECRET_NAME privateKeyConfig: algorithm: KEY_ALGORITHM size: KEY_SIZE acme: enabled: ACME_ENABLEDSostituisci le seguenti variabili:
Variabile Descrizione SUB_CA_NAME Il nome della Sub CA. USER_PROJECT_NAMESPACE Il nome dello spazio dei nomi in cui risiede il progetto utente. COMMON_NAME Il nome comune del certificato CA. DURATION La durata richiesta del certificato CA. Specifica una durata in ore (ad esempio, 1000h). Le unità come giorni (d) o anni (y) non sono supportate.ROOT_CA_NAME Il nome della CA radice. SECRET_NAME Il nome del secret di Kubernetes che contiene la chiave privata e il certificato CA firmato. Le seguenti variabili sono valori facoltativi:
Variabile Descrizione RENEW_BEFORE Il tempo di rotazione prima della scadenza del certificato CA. ORGANIZATIONS Le organizzazioni da utilizzare nel certificato. ORGANIZATIONAL_UNITS Le unità organizzative da utilizzare nel certificato. COUNTRIES I paesi da utilizzare nel certificato. LOCALITIES Le città da utilizzare nel certificato. PROVINCES Lo stato o le province da utilizzare nel certificato. STREET_ADDRESSES Gli indirizzi stradali da utilizzare nel certificato. POSTAL_CODES I codici postali da utilizzare nel certificato. EXTENDED_KEY_USAGE L'utilizzo esteso della chiave per il certificato. Se forniti, i valori consentiti sono serverAutheclientAuth.KEY_ALGORITHYM L'algoritmo della chiave privata utilizzato per questo certificato. I valori consentiti sono RSA, Ed25519 o ECDSA. Se la dimensione non viene fornita, il valore predefinito è 256 per ECDSA e 2048 per RSA. La dimensione della chiave viene ignorata per Ed25519. KEY_SIZE La dimensione, in bit, della chiave privata per questo certificato dipende da l'algoritmo. RSA consente 2048, 3072, 4096 o 8192 (valore predefinito 2048). ECDSA consente 256, 384 o 521 (valore predefinito 256). Ed25519 ignora la dimensione. ACME_ENABLED Se impostato su true, la CA viene eseguita in modalità ACME e restituisce l' URL del server ACME. Puoi quindi utilizzare il client e il protocollo ACME per gestire i certificati.Applica la risorsa personalizzata all'istanza di Distributed Cloud:
kubectl apply -f subca.yaml --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIGSostituisci
MANAGEMENT_API_SERVER_KUBECONFIGcon il percorso del file kubeconfig del server API di gestione.Verifica la disponibilità della Sub CA. La CA diventa disponibile in circa 40 minuti:
kubectl --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG -n USER_PROJECT_NAMESPACE get certificateauthority.pki.security.gdc.goog/SUB_CA_NAME -ojson | jq -r ' .status.conditions[] | select( .type as $id | "Ready" | index($id))'L'output è simile al seguente:
{ "lastTransitionTime": "2025-01-24T17:09:29Z", "message": "CA reconciled", "observedGeneration": 2, "reason": "Ready", "status": "True", "type": "Ready" }
Crea una Sub CA da una CA esterna
Questa Sub CA supporta la firma di certificati foglia con CA esterne o gestite dall'utente. Genera una CSR che gli utenti possono firmare.
Crea una risorsa
CertificateAuthoritye salvala come file YAML denominatosubca-external.yaml:apiVersion: pki.security.gdc.goog/v1 kind: CertificateAuthority metadata: Name: SUB_CA_NAME namespace: USER_PROJECT_NAMESPACE spec: caProfile: commonName: COMMON_NAME duration: DURATION renewBefore: RENEW_BEFORE organizations: - ORGANIZATION organizationalUnits: - ORGANIZATIONAL_UNITS countries: - COUNTRIES localities: - LOCALITIES provinces: - PROVINCES streetAddresses: - STREET_ADDRESSES postalCodes: - POSTAL_CODES caCertificate: externalCA: {} certificateProfile: keyUsage: - digitalSignature - keyCertSign - crlSign extendedKeyUsage: - EXTENDED_KEY_USAGE secretConfig: secretName: SECRET_NAME privateKeyConfig: algorithm: KEY_ALGORITHM size: KEY_SIZE acme: enabled: ACME_ENABLEDSostituisci le seguenti variabili:
Variabile Descrizione SUB_CA_NAME Il nome della Sub CA. USER_PROJECT_NAMESPACE L'ID progetto del progetto in cui vuoi importare l'immagine. COMMON_NAME Il nome comune del certificato CA. DURATION La durata richiesta del certificato CA. Specifica una durata in ore (ad esempio, 1000h). Le unità come giorni (d) o anni (y) non sono supportate.SECRET_NAME Il nome del secret di Kubernetes che contiene la chiave privata e il certificato CA firmato. Le seguenti variabili sono valori facoltativi:
Variabile Descrizione RENEW_BEFORE Il tempo di rotazione prima della scadenza del certificato CA. ORGANIZATION L'organizzazione da utilizzare nel certificato. ORGANIZATIONAL_UNITS Le unità organizzative da utilizzare nel certificato. COUNTRIES I paesi da utilizzare nel certificato. LOCALITIES Le città da utilizzare nel certificato. PROVINCES Lo stato o le province da utilizzare nel certificato. STREET_ADDRESSES Gli indirizzi stradali da utilizzare nel certificato. POSTAL_CODES I codici postali da utilizzare nel certificato. EXTENDED_KEY_USAGE L'utilizzo esteso della chiave per il certificato. Se forniti, i valori consentiti sono serverAutheclientAuth.KEY_ALGORITHYM L'algoritmo della chiave privata utilizzato per questo certificato. I valori consentiti sono RSA,Ed25519, oECDSA. Se la dimensione non viene fornita, il valore predefinito è 256 perECDSAe 2048 perRSA. La dimensione della chiave viene ignorata perEd25519.KEY_SIZE La dimensione, in bit, della chiave privata per questo certificato dipende da l'algoritmo. RSAconsente 2048, 3072, 4096 o 8192 (valore predefinito 2048).ECDSAconsente 256, 384 o 521 (valore predefinito 256).Ed25519ignora la dimensione.ACME_ENABLED Se impostato su true, la CA viene eseguita in modalità ACME e restituisce l' URL del server ACME. Puoi quindi utilizzare il client e il protocollo ACME per gestire i certificati.Applica la risorsa personalizzata all'istanza di Distributed Cloud:
kubectl apply -f subca-external.yaml --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIGViene generata una CSR per la Sub CA all'interno del server API di gestione GDC. Devi scaricare la CSR e firmarla. Una volta firmato, puoi caricare il certificato firmato nel server API di gestione GDC.
Raccogli le richieste di firma del certificato (CSR) dal tuo ambiente Distributed Cloud:
kubectl get certificateauthorities SUB_CA_NAME -n USER_PROJECT_NAMESPACE -ojson | jq -j '"echo ", .status.externalCA.csr, " | base64 -d > ","sub_ca.csr\n"' | bashIl comando genera un file CSR denominato
sub_ca.csrnella directory corrente. Questo file contiene una CSR per un certificato CAX.509.Utilizza la CA radice del cliente per richiedere i certificati CA firmati per il file
sub_ca.csr.Per una richiesta di firma del certificato approvata, devi ottenere un certificato CA firmato dalla CA radice del cliente. Archivia il certificato nel file
sub_ca.crtnella directory corrente.Se applicabile, ottieni il certificato CA radice del cliente e archivialo nel file
ca.crtnella directory corrente.Verifica il nome comune (NC) del certificato CA:
openssl x509 -noout -subject -in sub_ca.crtSe la configurazione richiede estensioni SAN (nome alternativo del soggetto), verifica le estensioni SAN nel certificato:
openssl x509 -text -noout -in sub_ca.crt | grep -A 1 "Subject Alternative Name"Genera la
specper applicare la patch alla risorsaCertificateAuthority:echo "spec: caCertificate: externalCA: signedCertificate: certificate: $(base64 -w0 SUB_CA_NAME.crt) ca: $(base64 -w0 ca.crt)" > patch.txtI contenuti del file
patch.txtsono simili ai seguenti:spec: caCertificate: externalCA: signedCertificate: certificate: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURSekNDQ… ca: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURRVENDQ…Modifica il campo
specdella risorsaCertificateAuthority:kubectl patch certificateauthority SUB_CA_NAME -n USER_PROJECT_NAMESPACE--patch-file patch.txt --type='merge'Verifica la disponibilità della Sub CA BYO (Bring Your Own). In genere, la CA diventa disponibile in circa 40 minuti:
kubectl -n USER_PROJECT_NAMESPACE get certificateauthority.pki.security.gdc.goog/SUB_CA_NAME -ojson | jq -r ' .status.conditions[] | select( .type as $id | "Ready" | index($id))'L'output è simile al seguente:
{ "lastTransitionTime": "2024-04-30T22:10:50Z", "message": "Certificate authority is ready for use", "observedGeneration": 3, "reason": "Ready", "status": "True", "type": "Ready" }Verifica la data di scadenza dei certificati CA firmati:
kubectl -n USER_PROJECT_NAMESPACE get secret SECRET_NAME -ojson | jq -j '"echo ", .metadata.name, " $(echo ", .data["tls.crt"], "| base64 -d | openssl x509 -enddate -noout)\n"' | bash
Elenca le CA
Per elencare tutte le risorse di Certificate Authority Service nella tua istanza air-gapped di Distributed Cloud, procedi come segue:
Utilizza il parametro certificateauthorities per elencare tutte le risorse CertificateAuthority:
kubectl --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG -n USER_PROJECT_NAMESPACE get certificateauthorities
L'output è simile al seguente:
NAMESPACE NAME READY REASON AGE
foo root-ca True Ready 7h24m
foo sub-ca True Ready 7h24m