Crear una autoridad de certificación subordinada

En esta página se describen los pasos para crear una autoridad de certificación subordinada (Sub CA).

Las subautoridades de certificación son responsables de emitir certificados directamente a entidades finales, como usuarios, ordenadores y dispositivos. Están firmados criptográficamente por una CA principal, que suele ser la CA raíz. Los sistemas que confían en la AC raíz confían automáticamente en las ACs secundarias y en los certificados que emiten.

El firmante del certificado de CA puede ser otra CA creada en el servicio de CA (por ejemplo, una CA raíz) o una CA externa. Con las ACs externas, el servicio de ACs genera una solicitud de firma de certificado (CSR) que debe firmar la AC externa.

Antes de empezar

Para obtener los permisos que necesitas para crear una subautoridad de certificación, pide al administrador de gestión de identidades y accesos de tu organización que te asigne el rol de administrador del servicio de autoridad de certificación (certificate-authority-service-admin). Para obtener más información sobre los roles, consulta Definiciones de roles.

Obtener el archivo kubeconfig

Para ejecutar comandos en el servidor de la API Management, asegúrate de tener los siguientes recursos:

  • Inicia sesión y genera el archivo kubeconfig del servidor de la API Management si no tienes uno.

  • Usa la ruta al archivo kubeconfig del servidor de la API Management para sustituir MANAGEMENT_API_SERVER_KUBECONFIG en estas instrucciones.

Crear una subautoridad de certificación gestionada

En el caso de una subautoridad de certificación gestionada, el firmante del certificado de la autoridad de certificación es otra autoridad de certificación (autoridad de certificación raíz) creada en el Servicio de Autoridades de Certificación.

Para crear una subautoridad de certificación gestionada, aplica un recurso personalizado a tu instancia de Distributed Cloud Appliance.

  1. Crea un recurso CertificateAuthority y guárdalo como un archivo YAML llamado subca.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_ENABLED
    

    Sustituye las siguientes variables:

    Variable Descripción
    SUB_CA_NAME Nombre de la subautoridad de certificación.
    USER_PROJECT_NAMESPACE El nombre del espacio de nombres en el que reside el proyecto del usuario.
    COMMON_NAME El nombre común del certificado de la AC.
    DURATION Duración solicitada del certificado de la CA.
    ROOT_CA_NAME Nombre de la CA raíz.
    SECRET_NAME El nombre del secreto de Kubernetes que contiene la clave privada y el certificado de CA firmado.

    Las siguientes variables son valores opcionales:

    Variable Descripción
    RENEW_BEFORE El tiempo de rotación antes de que caduque el certificado de AC.
    ORGANIZATIONS Organizaciones que se usarán en el certificado.
    ORGANIZATIONAL_UNITS Unidades organizativas que se van a usar en el certificado.
    COUNTRIES Países que se usarán en el certificado.
    LOCALITIES Ciudades que se usarán en el certificado.
    PROVINCES Estado o provincia que se usará en el certificado.
    STREET_ADDRESSES Direcciones postales que se usarán en el certificado.
    POSTAL_CODES Códigos postales que se usarán en el certificado.
    EXTENDED_KEY_USAGE Uso adicional de la clave del certificado. Si se proporciona, los valores permitidos son serverAuth y clientAuth.
    KEY_ALGORITHYM Algoritmo de clave privada usado en este certificado. Los valores permitidos son RSA, Ed25519 o ECDSA. Si no se indica el tamaño, se asigna el valor predeterminado de 256 para ECDSA y 2048 para RSA. El tamaño de la clave se ignora en Ed25519.
    KEY_SIZE El tamaño, en bits, de la clave privada de este certificado depende del algoritmo. RSA permite 2048, 3072, 4096 u 8192 (2048 de forma predeterminada). ECDSA permite 256, 384 o 521 (256 de forma predeterminada). Ed25519 ignora el tamaño.
    ACME_ENABLED Si se define como true, la AC se ejecuta en modo ACME y genera la URL del servidor ACME. Después, puedes usar el cliente y el protocolo ACME para gestionar los certificados.
  2. Aplica el recurso personalizado a tu instancia de Distributed Cloud:

    kubectl apply -f subca.yaml --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG
    

    Sustituye MANAGEMENT_API_SERVER_KUBECONFIG por la ruta del archivo kubeconfig del servidor de la API Management.

  3. Verifica que la subautoridad de certificación esté lista. La autoridad certificadora tarda unos 40 minutos en estar lista:

    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))'
    

    El resultado es similar al siguiente:

    {
      "lastTransitionTime": "2025-01-24T17:09:29Z",
      "message": "CA reconciled",
      "observedGeneration": 2,
      "reason": "Ready",
      "status": "True",
      "type": "Ready"
    }
    

Crear una subautoridad de certificación a partir de una autoridad de certificación externa

Esta subautoridad de certificación admite la firma de certificados de hoja con autoridades de certificación externas o gestionadas por el usuario. Genera una CSR para que los usuarios la firmen.

  1. Crea un recurso CertificateAuthority y guárdalo como un archivo YAML llamado subca-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_ENABLED
    

    Sustituye las siguientes variables:

    Variable Descripción
    SUB_CA_NAME El nombre de la subautoridad certificadora.
    USER_PROJECT_NAMESPACE El ID del proyecto en el que quieras importar la imagen.
    COMMON_NAME El nombre común del certificado de la AC.
    DURATION Duración solicitada del certificado de la AC
    SECRET_NAME El nombre del secreto de Kubernetes que contiene la clave privada y el certificado de CA firmado.

    Las siguientes variables son valores opcionales:

    Variable Descripción
    RENEW_BEFORE El tiempo de rotación antes de que caduque el certificado de AC.
    ORGANIZATION Organización que se va a usar en el certificado.
    ORGANIZATIONAL_UNITS Unidades organizativas que se van a usar en el certificado.
    COUNTRIES Países que se usarán en el certificado.
    LOCALITIES Ciudades que se usarán en el certificado.
    PROVINCES Estado o provincia que se usará en el certificado.
    STREET_ADDRESSES Direcciones postales que se usarán en el certificado.
    POSTAL_CODES Códigos postales que se usarán en el certificado.
    EXTENDED_KEY_USAGE Uso adicional de la clave del certificado. Si se proporciona, los valores permitidos son serverAuth y clientAuth.
    KEY_ALGORITHYM Algoritmo de clave privada usado en este certificado. Los valores permitidos son RSA, Ed25519 y ECDSA. Si no se indica el tamaño, se asigna el valor predeterminado de 256 a ECDSA y de 2048 a RSA. El tamaño de la clave se ignora en Ed25519.
    KEY_SIZE El tamaño, en bits, de la clave privada de este certificado depende del algoritmo. RSA permite 2048, 3072, 4096 u 8192 (2048 de forma predeterminada). ECDSA permite 256, 384 o 521 (256 de forma predeterminada). Ed25519 ignora el tamaño.
    ACME_ENABLED Si se define como true, la AC se ejecuta en modo ACME y genera la URL del servidor ACME. Después, puedes usar el cliente y el protocolo ACME para gestionar los certificados.
  2. Aplica el recurso personalizado a tu instancia de Distributed Cloud:

    kubectl apply -f subca-external.yaml --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG
    
  3. Una CSR de la subautoridad de certificación se genera en el servidor de la API de gestión de GDC. Debes descargar el archivo CSR y firmarlo. Una vez firmado, puedes subir el certificado firmado al servidor de la API de gestión de GDC.

  4. Recoge las solicitudes de firma de certificado (CSR) de tu entorno de 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"' | bash
    

    El comando genera un archivo CSR llamado sub_ca.csr en el directorio actual. Este archivo contiene una CSR para un certificado de X.509 autoridad de certificación.

  5. Usa la AC raíz del cliente para solicitar certificados de AC firmados para el archivo sub_ca.csr.

  6. Si se aprueba una solicitud de firma de certificado, debes obtener un certificado de AC firmado por la AC raíz del cliente. Guarda el certificado en el archivo sub_ca.crt del directorio actual.

  7. Si procede, obtén el certificado de AC raíz del cliente y guárdalo en el archivo ca.crt del directorio actual.

  8. Verifica las extensiones de nombre alternativo de la entidad (SAN) del certificado:

    openssl x509 -text -noout -in sub_ca.crt | grep -A 1 "Subject Alternative Name"
    

    Si el certificado de la AC tiene un nombre común (CN) en lugar de un SAN, comprueba el CN del certificado:

    openssl x509 -text -noout -in sub_ca.crt | grep -A 1 "Subject: CN"
    
  9. Genera el spec para parchear el recurso CertificateAuthority:

    echo "spec:
      caCertificate:
        externalCA:
          signedCertificate:
            certificate: $(base64 -w0 SUB_CA_NAME.crt)
            ca: $(base64 -w0 ca.crt)" > patch.txt
    

    El contenido del archivo patch.txt tendrá un aspecto similar al siguiente:

    spec:
      caCertificate:
        externalCA:
          signedCertificate:
            certificate: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURSekNDQ…
            ca: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURRVENDQ…
    
  10. Edita el campo spec del recurso CertificateAuthority:

    kubectl patch certificateauthority SUB_CA_NAME -n USER_PROJECT_NAMESPACE--patch-file patch.txt --type='merge'
    
  11. Verifica que la subautoridad de certificación de la función Trae tu propia (BYO) esté lista. Normalmente, la autoridad certificadora tarda unos 40 minutos en estar lista:

    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))'
    

    El resultado es similar al siguiente:

    {
      "lastTransitionTime": "2024-04-30T22:10:50Z",
      "message": "Certificate authority is ready for use",
      "observedGeneration": 3,
      "reason": "Ready",
      "status": "True",
      "type": "Ready"
    }
    
  12. Verifica la fecha de vencimiento de los certificados de AC firmados:

    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
    

Mostrar autoridades de certificación

Para enumerar todos los recursos del servicio de autoridad de certificación de tu instancia de Distributed Cloud con air gap, haz lo siguiente:

Usa el parámetro certificateauthorities para enumerar todos los recursos CertificateAuthority:

   kubectl --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG -n USER_PROJECT_NAMESPACE get certificateauthorities

El resultado es similar al siguiente:

   NAMESPACE    NAME              READY   REASON   AGE
   foo          root-ca           True    Ready    7h24m
   foo          sub-ca            True    Ready    7h24m