Configura TLS reciproco con certificati forniti dall'utente

In questa pagina vengono fornite istruzioni per la creazione di un certificato radice e un certificato intermedio firmato, per poi caricarli. a una risorsa TrustConfig del gestore certificati. Se disponi di risorse certificati da caricare, ignora i passaggi per la creazione di nuovi certificati.

Creerai anche le risorse di sicurezza di rete necessarie per la configurazione TLS reciproco (mTLS) per i bilanciatori del carico delle applicazioni. Le istruzioni utilizzano OpenSSL a per creare il certificato radice e intermedio.

Prima di iniziare

Autorizzazioni

Per ottenere le autorizzazioni necessarie per completare questa guida, chiedi all'amministratore di concederti 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 del Gestore certificati: Proprietario del Gestore certificati (roles/certificatemanager.owner)
  • Per creare i componenti di sicurezza e networking: Amministratore rete Compute (roles/compute.networkAdmin) e Amministratore sicurezza Compute (roles/compute.securityAdmin)
  • Per creare un progetto (facoltativo): 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 la ruoli o altri ruoli predefiniti ruoli.

Genera una chiave e i certificati firmati

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

Usa i comandi seguenti per generare un certificato radice e un certificato certificato intermedio 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 se vuoi impostare campi aggiuntivi sui 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 il certificati in un'unica riga e li archiviamo in variabili di ambiente, in modo che possano essere letti . Utilizza i comandi seguenti per formattare i certificati e archiviarli in 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 che vengono aggiunti a una lista consentita in un configurazione dell'attendibilità, formatta i certificati in una singola riga e li archiviamo in variabili di ambiente, in modo che possano essere letti . Per i certificati che si trovano in una lista consentita, utilizza il seguente comando per formattare i certificati in un'unica riga e archiviarli nel ALLOWLISTED_CERT variabile di ambiente.

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 rappresenta l'infrastruttura a chiave pubblica. Questa risorsa di esempio TrustConfig contiene un oggetto un archivio di attendibilità con due trust anchor e due certificati CA intermedi. Legge i contenuti del certificato da le variabili di ambiente create nell'ambito Passaggio Formattare i certificati.

Per creare un archivio di attendibilità con trust anchor aggiuntivi o CA intermedia certificati, aggiungi pemCertificate righe nella sezione appropriata. Se disponi meno trust anchor o certificati CA intermedi, rimuovi quelli non necessari linee.

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

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

  1. Per creare il file trust_config.yaml con un archivio di attendibilità, usa quanto segue :

    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 sia 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 la 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 (ServerTLSPolicy risorsa di sicurezza di rete) ti consente specifica la modalità TLS lato server e la risorsa TrustConfig da utilizzare durante la convalida dei certificati client. Se il cliente presenta un annuncio non valido o nessun certificato al bilanciatore del carico, clientValidationMode specifica come viene gestita la connessione del client.

  • Quando clientValidationMode è impostato su ALLOW_INVALID_OR_MISSING_CLIENT_CERT, tutte le richieste vengono passate al backend anche se la convalida non riesce o certificato client mancante.
  • Quando clientValidationMode è impostato su REJECT_INVALID, richiede solo che fornisci un certificato client che possa essere convalidato rispetto a un TrustConfig vengono passate al backend.

Per creare la risorsa ServerTLSPolicy, completa i seguenti passaggi:

  1. In base a come vuoi gestire la connessione, seleziona una delle seguenti opzioni le opzioni di CPU e memoria disponibili.

    Nei passaggi successivi, sostituisci SERVER_TLS_POLICY_NAME con il nome del server il criterio TLS e sostituisci PROJECT_ID con l'ID di 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 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, vedi 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 file leaf certificato. Se hai già creato una risorsa TrustConfig utilizzando certificati intermedi (int.cert e int.key), usa quanto segue istruzioni:

  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 subjectAltName a la sezione [extension_requirements] come segue:

      subjectAltName            = @sans_list
      
    • Aggiungi una nuova sezione in fondo al file client.config con il seguenti:

      [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