Configura TLS reciproco con certificati forniti dall'utente

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

Puoi anche creare le risorse di sicurezza di rete necessarie per configurare il protocollo TLS comune (mTLS) per gli Application Load Balancer. 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 come TargetHTTPSProxy: Amministratore bilanciatore del carico Compute (roles/compute.loadBalancerAdmin)
  • Per utilizzare le risorse di Certificate Manager: Proprietario di Certificate Manager (roles/certificatemanager.owner)
  • Per creare componenti di sicurezza e di rete: 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 riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.

Genera una chiave e i certificati firmati

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

Utilizza 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.

Usa 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 TrustStore, formatta i certificati in una singola riga e archiviali in variabili di ambiente, in modo che possano essere letti nel file YAML. Utilizza i comandi seguenti 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 una singola riga e archiviali in variabili di ambiente, in modo che possano essere letti nel file YAML. Per i certificati inseriti in una lista consentita, utilizza il comando seguente per formattarli 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 i contenuti del certificato dalle variabili di ambiente create nel passaggio precedente Formattare i certificati.

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

Questa risorsa di esempio TrustConfig 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 i bilanciatori del carico delle applicazioni esterni e i bilanciatori del carico delle applicazioni interni tra regioni, utilizza questo comando:

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

    regionale

    Per i bilanciatori del carico delle applicazioni esterni regionali e i bilanciatori del carico delle applicazioni 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 di 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 per la convalida dei certificati client. Quando il client presenta un certificato non valido o nessun certificato al bilanciatore del carico, clientValidationMode specifica il modo in cui viene gestita la connessione client.

  • Se il clientValidationMode è impostato su ALLOW_INVALID_OR_MISSING_CLIENT_CERT, tutte le richieste vengono passate al backend anche se la convalida non riesce o se manca il certificato client.
  • Se il clientValidationMode è impostato su REJECT_INVALID, vengono passate al backend solo le richieste che forniscono un certificato client che può essere convalidato rispetto a una risorsa TrustConfig.

Per creare la risorsa ServerTLSPolicy, completa i seguenti passaggi:

  1. In base a 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 questo comando:

      globale

      Per i bilanciatori del carico delle applicazioni esterni e i bilanciatori del carico delle applicazioni 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 i bilanciatori del carico delle applicazioni esterni regionali e i bilanciatori del carico delle applicazioni 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 questo comando:

      globale

      Per i bilanciatori del carico delle applicazioni esterni e i bilanciatori del carico delle applicazioni 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 i bilanciatori del carico delle applicazioni esterni regionali e i bilanciatori del carico delle applicazioni 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 i bilanciatori del carico delle applicazioni esterni e i bilanciatori del carico delle applicazioni 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 i bilanciatori del carico delle applicazioni esterni regionali e i bilanciatori del carico delle applicazioni interni regionali, utilizza il comando:

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

Per ulteriori 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), segui le istruzioni seguenti:

  1. Crea 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 collegare un'identità SPIFFE:

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

      subjectAltName            = @sans_list
      
    • Aggiungi una nuova sezione in fondo al 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 testare, 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