Configura TLS reciproco con i certificati forniti dall'utente

Questa pagina fornisce le istruzioni per creare un certificato radice e un certificato intermedio firmato e per poi caricarli in una risorsa TrustConfig del Gestore certificati. Se hai già dei certificati da caricare, salta i passaggi per crearne di nuovi.

Creerai inoltre le risorse di sicurezza di rete necessarie per configurare il protocollo TLS (mTLS) per i bilanciatori del carico delle applicazioni. Le istruzioni utilizzano OpenSSL per creare i certificati radice e intermedi.

Prima di iniziare

Autorizzazioni

Per ottenere le autorizzazioni necessarie per completare questa guida, chiedi all'amministratore di concederti i seguenti ruoli IAM sul progetto:

  • Per creare risorse del bilanciatore del carico, ad esempio TargetHTTPSProxy: Amministratore bilanciatore del carico Compute (roles/compute.loadBalancerAdmin)
  • Per utilizzare le risorse di Gestore certificati: Proprietario Gestore certificati (roles/certificatemanager.owner)
  • Per creare componenti di sicurezza e networking: Amministratore rete Compute (roles/compute.networkAdmin) e Amministratore sicurezza Compute (roles/compute.securityAdmin)
  • (Facoltativo) Per creare un progetto: Autore progetto (roles/resourcemanager.projectCreator)

Per saperne di più sulla concessione dei ruoli, consulta Gestire l'accesso.

Potresti anche essere in grado di ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.

Genera una chiave e dei certificati firmati

Questa sezione utilizza i comandi openssl per creare certificati radice e intermedi.

Usa i comandi seguenti per generare un certificato radice e un certificato intermedio firmato con campi keyUsage e extendedKeyUsage validi.

  1. Crea un file example.cnf di esempio con la configurazione minima richiesta per creare certificati di firma validi. Puoi modificare questo file se vuoi impostare campi aggiuntivi su questi certificati.

    cat > example.cnf << EOF
    [req]
    distinguished_name = empty_distinguished_name
    [empty_distinguished_name]
    # Kept empty to allow setting via -subj command line arg.
    [ca_exts]
    basicConstraints=critical,CA:TRUE
    keyUsage=keyCertSign
    extendedKeyUsage=clientAuth
    EOF
    
  2. Crea il certificato radice.

    openssl req -x509 \
        -new -sha256 -newkey rsa:2048 -nodes \
        -days 3650 -subj '/CN=root' \
        -config example.cnf \
        -extensions ca_exts \
        -keyout root.key -out root.cert
    
  3. Crea la richiesta di firma per il certificato intermedio.

    openssl req \
        -new -sha256 -newkey rsa:2048 -nodes \
        -subj '/CN=int' \
        -config example.cnf \
        -extensions ca_exts \
        -keyout int.key -out int.req
    
  4. Crea il certificato intermedio.

    openssl x509 -req \
        -CAkey root.key -CA root.cert \
        -set_serial 1 \
        -days 3650 \
        -extfile example.cnf \
        -extensions ca_exts \
        -in int.req -out int.cert
    

Genera un certificato e aggiungilo a una lista consentita

Questa sezione utilizza i comandi openssl per creare un certificato di esempio e aggiungerlo a una lista consentita.

Utilizza i comandi seguenti per generare un certificato e aggiungerlo a una lista consentita.

   openssl req -x509 \
       -new -sha256 -newkey rsa:2048 -nodes \
       -days 3650 -subj '/CN=localhost' \
       -keyout allowlisted.key -out allowlisted.cert

Formattare i certificati

Per includere certificati nuovi o esistenti in un elemento TrustStore, formattali in un'unica riga e archiviali in variabili di ambiente, in modo che possano essere letti nel file YAML. Utilizza i seguenti comandi per formattare i certificati e archiviarli nelle variabili di ambiente:

export ROOT_CERT=$(cat root.cert | sed 's/^[ ]*//g' | tr '\n' $ | sed 's/\$/\\n/g')
export INTERMEDIATE_CERT=$(cat int.cert | sed 's/^[ ]*//g' | tr '\n' $ | sed 's/\$/\\n/g')

Per includere certificati nuovi o esistenti aggiunti a una lista consentita in una configurazione di attendibilità, formatta i certificati in un'unica riga e archiviali in variabili di ambiente, in modo che possano essere letti nel file YAML. Per i certificati che si trovano in una lista consentita, utilizza il comando seguente per formattare i certificati in un'unica riga e archiviarli nella variabile di ambiente ALLOWLISTED_CERT.

export ALLOWLISTED_CERT=$(cat allowlisted.cert | sed 's/^[ ]*//g' | tr '\n' $ | sed 's/\$/\\n/g')

Crea una risorsa TrustConfig

Crea una risorsa TrustConfig del gestore certificati che rappresenti la tua infrastruttura a chiave pubblica. Questa risorsa TrustConfig di esempio contiene un archivio di attendibilità con due trust anchor e due certificati CA intermedi. Legge il contenuto del certificato dalle variabili di ambiente create nel precedente passaggio Formattare i certificati.

Per creare un archivio di attendibilità con altri trust anchor o certificati CA intermedi, aggiungi pemCertificate righe nella sezione appropriata. Se hai meno di trust anchor o certificati CA intermedi, rimuovi le righe non necessarie.

Questa risorsa TrustConfig di esempio contiene un certificato che viene aggiunto a una lista consentita. Puoi specificare più certificati in una lista consentita utilizzando più istanze del campo pemCertificate.

Nei passaggi seguenti, sostituisci TRUST_CONFIG_NAME con il nome della risorsa TrustConfig:

  1. Per creare il file trust_config.yaml con un archivio di attendibilità, utilizza il seguente comando:

    cat << EOF > trust_config.yaml
    trustStores:
    - trustAnchors:
      - pemCertificate: "${ROOT_CERT?}"
      - pemCertificate: "${ROOT_CERT_2?}"
      intermediateCas:
      - pemCertificate: "${INTERMEDIATE_CERT?}"
      - pemCertificate: "${INTERMEDIATE_CERT_2?}"
    EOF
    
  2. (Facoltativo) Per creare il file trust_config.yaml con un certificato che viene aggiunto a una lista consentita, utilizza il seguente comando:

    cat << EOF > trust_config.yaml
     allowlistedCertificates:
     - pemCertificate: "${ALLOWLISTED_CERT?}"
    EOF
    
  3. Per creare le risorse TrustConfig del gestore certificati, utilizza il comando gcloud certificate-manager trust-configs import:

    globale

    Per bilanciatori del carico delle applicazioni esterni e Application Load Balancer interni tra regioni, utilizza questo comando:

    gcloud certificate-manager trust-configs import TRUST_CONFIG_NAME  \
       --source=trust_config.yaml
    

    regionale

    Per gli Application Load Balancer esterni regionali e gli Application Load Balancer interni regionali, utilizza questo comando:

    gcloud certificate-manager trust-configs import TRUST_CONFIG_NAME  \
       --source=trust_config.yaml \
       --location=REGION
    

crea le risorse di sicurezza della rete

Un criterio TLS del server (risorsa di sicurezza di rete ServerTLSPolicy) consente di specificare la modalità TLS lato server e la risorsa TrustConfig da utilizzare durante la convalida dei certificati client. Quando il client presenta un certificato non valido o nessun certificato al bilanciatore del carico, clientValidationMode specifica come viene gestita la connessione client.

  • Se clientValidationMode è impostato su ALLOW_INVALID_OR_MISSING_CLIENT_CERT, tutte le richieste vengono passate al backend anche se la convalida non va a buon fine o il certificato client è mancante.
  • Quando clientValidationMode è impostato su REJECT_INVALID, solo le richieste che forniscono un certificato client che può essere convalidato a fronte di una risorsa TrustConfig vengono passate al backend.

Per creare la risorsa ServerTLSPolicy, completa i seguenti passaggi:

  1. A seconda di come vuoi gestire la connessione, seleziona una delle seguenti opzioni.

    Nei passaggi seguenti, sostituisci SERVER_TLS_POLICY_NAME con il nome del criterio TLS del server e PROJECT_ID con l'ID del tuo progetto Google Cloud.

    • Opzione 1: clientValidationMode è impostata su ALLOW_INVALID_OR_MISSING_CLIENT_CERT.

      Per creare il file server_tls_policy.yaml, utilizza il comando seguente:

      globale

      Per bilanciatori del carico delle applicazioni esterni e Application Load Balancer interni tra regioni, utilizza il comando:

      cat << EOF > server_tls_policy.yaml
      name: SERVER_TLS_POLICY_NAME
      mtlsPolicy:
        clientValidationMode: ALLOW_INVALID_OR_MISSING_CLIENT_CERT
        clientValidationTrustConfig: projects/PROJECT_ID/locations/global/trustConfigs/TRUST_CONFIG_NAME
      EOF
      

      regionale

      Per gli Application Load Balancer esterni regionali e gli Application Load Balancer interni regionali, utilizza il comando:

      cat << EOF > server_tls_policy.yaml
      name: SERVER_TLS_POLICY_NAME
      mtlsPolicy:
        clientValidationMode: ALLOW_INVALID_OR_MISSING_CLIENT_CERT
        clientValidationTrustConfig: projects/PROJECT_ID/locations/REGION/trustConfigs/TRUST_CONFIG_NAME
      EOF
      
    • Opzione 2: clientValidationMode è impostata su REJECT_INVALID.

      Per creare il file server_tls_policy.yaml, utilizza il comando seguente:

      globale

      Per bilanciatori del carico delle applicazioni esterni e Application Load Balancer interni tra regioni, utilizza il comando:

      cat << EOF > server_tls_policy.yaml
      name: SERVER_TLS_POLICY_NAME
      mtlsPolicy:
        clientValidationMode: REJECT_INVALID
        clientValidationTrustConfig: projects/PROJECT_ID/locations/global/trustConfigs/TRUST_CONFIG_NAME
      EOF
      

      regionale

      Per gli Application Load Balancer esterni regionali e gli Application Load Balancer interni regionali, utilizza il comando:

      cat << EOF > server_tls_policy.yaml
      name: SERVER_TLS_POLICY_NAME
      mtlsPolicy:
        clientValidationMode: REJECT_INVALID
        clientValidationTrustConfig: projects/PROJECT_ID/locations/REGION/trustConfigs/TRUST_CONFIG_NAME
      EOF
      
  2. Per creare la risorsa ServerTlsPolicy, utilizza il comando gcloud network-security server-tls-policies import:

    globale

    Per bilanciatori del carico delle applicazioni esterni e Application Load Balancer interni tra regioni, utilizza il comando:

    gcloud network-security server-tls-policies import SERVER_TLS_POLICY_NAME \
      --source=server_tls_policy.yaml \
      --location=global
    

    regionale

    Per gli Application Load Balancer esterni regionali e gli Application Load Balancer interni regionali, utilizza il comando:

    gcloud network-security server-tls-policies import SERVER_TLS_POLICY_NAME \
      --source=server_tls_policy.yaml \
      --location=REGION
    

Per maggiori informazioni, consulta Modalità di convalida del client MTLS.

Firma una chiave client con il certificato intermedio

Questa sezione fornisce un'opzione di configurazione aggiuntiva per generare un certificato foglia. Se hai già creato una risorsa TrustConfig utilizzando i certificati intermedi (int.cert e int.key), utilizza le seguenti istruzioni:

  1. Creare un file di configurazione della chiave client.

    cat > client.config << EOF
    [req]
    default_bits              = 2048
    req_extensions            = extension_requirements
    distinguished_name        = dn_requirements
    prompt                    = no
    
    [extension_requirements]
    basicConstraints          = critical, CA:FALSE
    keyUsage                  = critical, nonRepudiation, digitalSignature, keyEncipherment
    extendedKeyUsage          = clientAuth
    
    [dn_requirements]
    countryName               = US
    stateOrProvinceName       = California
    localityName              = San Francisco
    0.organizationName        = example
    organizationalUnitName    = test
    commonName                = test.example.com
    emailAddress              = test@example.com
    
    EOF
    

    Se vuoi avere un'identità SPIFFE collegata:

    • Aggiungi un elemento subjectAltName alla sezione [extension_requirements] come segue:

      subjectAltName            = @sans_list
      
    • Aggiungi una nuova sezione alla fine del file client.config con quanto segue:

      [sans_list]
      URI.1                     = spiffe://example.com/test-identity
      
  2. Firma la chiave.

    openssl req -new -keyout client.key -out client.csr -config client.config
    
    openssl x509 -req -in client.csr -out client.cert -extfile client.config -extensions extension_requirements -days 365 -CA int.cert -CAkey int.key
    
  3. Per eseguire il test, invia una richiesta curl all'indirizzo IP del bilanciatore del carico.

    curl -v -k --key client.key --cert client.cert https://IP_ADDRESS
    

    Sostituisci IP_ADDRESS con l'indirizzo IP del bilanciatore del carico.

Passaggi successivi