Crea una autoridad certificadora subordinada

En este documento, se describen los pasos para crear una autoridad certificadora subordinada (AC subordinada).

Las AC subordinadas son responsables de emitir certificados directamente a entidades finales, como usuarios, computadoras y dispositivos. Una AC superior, a menudo la AC raíz, las firma de forma criptográfica. Los sistemas que confían en la AC raíz confían automáticamente en las AC subordinadas y en los certificados que emiten.

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

Este documento está destinado a públicos dentro del grupo de operadores de aplicaciones, como desarrolladores de aplicaciones o científicos de datos, que administran los ciclos de vida de los certificados dentro de su proyecto. Para obtener más información, consulta Públicos de la documentación de Google Distributed Cloud aislado.

Antes de comenzar

Antes de crear una AC subordinada, debes solicitar los permisos necesarios y preparar tu entorno.

Solicita roles de IAM

Para crear, actualizar y borrar recursos de la autoridad certificadora, comunícate con el administrador de IAM de tu organización para solicitar el rol Administrador del servicio de autoridad certificadora (certificate-authority-service-admin) en el espacio de nombres del proyecto de la autoridad certificadora.

Prepara el entorno

Crea una AC subordinada administrada

En el caso de una AC subordinada administrada, el firmante del certificado de la AC es otra AC (AC raíz) creada en el servicio de CA.

Para crear una AC subordinada administrada, 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
    

    Reemplaza las siguientes variables:

    Variable Descripción
    SUB_CA_NAME El nombre de la AC subordinada
    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 La vida útil solicitada del certificado de la AC Especifica como una duración en horas (por ejemplo, 1000h). No se admiten unidades como días (d) o años (y) soportados.
    ROOT_CA_NAME El nombre de la AC raíz
    SECRET_NAME El nombre del secreto de Kubernetes que contiene la clave privada y el certificado de la AC firmado

    Las siguientes variables son valores opcionales:

    Variable Descripción
    RENEW_BEFORE El tiempo de rotación antes de que venza el certificado de la AC
    ORGANIZATIONS Las organizaciones que se usarán en el certificado
    ORGANIZATIONAL_UNITS Las unidades organizacionales que se usarán en el certificado
    COUNTRIES Los países que se usarán en el certificado
    LOCALITIES Las ciudades que se usarán en el certificado
    PROVINCES Los estados o provincias que se usarán en el certificado
    STREET_ADDRESSES Las direcciones que se usarán en el certificado
    POSTAL_CODES Los códigos postales que se usarán en el certificado
    EXTENDED_KEY_USAGE El uso de clave extendida para el certificado Si se proporciona, los valores permitidos son serverAuth y clientAuth.
    KEY_ALGORITHYM El algoritmo de clave privada que se usa para este certificado Los valores permitidos son RSA, Ed25519 o ECDSA. Si no se proporciona el tamaño, el valor predeterminado es 256 para ECDSA y 2048 para RSA. Se ignora el tamaño de la clave para Ed25519.
    KEY_SIZE El tamaño, en bits, de la clave privada para este certificado depende de el algoritmo. RSA permite 2048, 3072, 4096 u 8192 (2048 predeterminado). ECDSA permite 256, 384 o 521 (256 predeterminado). Ed25519 ignora el tamaño.
    ACME_ENABLED Si se configura como true, la AC se ejecuta en modo ACME y genera la URL del servidor ACME. Luego, puedes usar el cliente y el protocolo ACME para administrar certificados.
  2. Aplica el recurso personalizado a tu instancia de Distributed Cloud:

    kubectl apply -f subca.yaml --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG
    

    Reemplaza MANAGEMENT_API_SERVER_KUBECONFIG por la ruta de acceso al archivo kubeconfig del servidor de la API de administración.

  3. Verifica la preparación de la AC subordinada. La AC tarda aproximadamente 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"
    }
    

Crea una AC subordinada a partir de una AC externa

Esta AC subordinada admite la firma de certificados hoja con AC externas o administradas 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
    

    Reemplaza las siguientes variables:

    Variable Descripción
    SUB_CA_NAME El nombre de la subCA
    USER_PROJECT_NAMESPACE El ID del proyecto en el que deseas importar la imagen
    COMMON_NAME El nombre común del certificado de la AC
    DURATION La vida útil solicitada del certificado de la AC Especifica como una duración en horas (por ejemplo, 1000h). No se admiten unidades como días (d) o años (y) soportados.
    SECRET_NAME El nombre del secreto de Kubernetes que contiene la clave privada y el certificado de la AC firmado

    Las siguientes variables son valores opcionales:

    Variable Descripción
    RENEW_BEFORE El tiempo de rotación antes de que venza el certificado de la AC
    ORGANIZATION La organización que se usará en el certificado
    ORGANIZATIONAL_UNITS Las unidades organizacionales que se usarán en el certificado
    COUNTRIES Los países que se usarán en el certificado
    LOCALITIES Las ciudades que se usarán en el certificado
    PROVINCES Los estados o provincias que se usarán en el certificado
    STREET_ADDRESSES Las direcciones que se usarán en el certificado
    POSTAL_CODES Los códigos postales que se usarán en el certificado
    EXTENDED_KEY_USAGE El uso de clave extendida para el certificado Si se proporciona, los valores permitidos son serverAuth y clientAuth.
    KEY_ALGORITHYM El algoritmo de clave privada que se usa para este certificado Los valores permitidos son RSA, Ed25519 o ECDSA. Si no se proporciona el tamaño, el valor predeterminado es 256 para ECDSA y 2048 para RSA. Se ignora el tamaño de la clave para Ed25519.
    KEY_SIZE El tamaño, en bits, de la clave privada para este certificado depende de el algoritmo. RSA permite 2048, 3072, 4096 u 8192 (2048 predeterminado). ECDSA permite 256, 384 o 521 (256 predeterminado). Ed25519 ignora el tamaño.
    ACME_ENABLED Si se configura como true, la AC se ejecuta en modo ACME y genera la URL del servidor ACME. Luego, puedes usar el cliente y el protocolo ACME para administrar certificados.
  2. Aplica el recurso personalizado a tu instancia de Distributed Cloud:

    kubectl apply -f subca-external.yaml --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG
    
  3. Se genera una CSR para la AC subordinada dentro del servidor de la API de administración de GDC. Debes descargar la CSR y firmarla. Una vez que la firmes, podrás subir el certificado firmado al servidor de la API de administración de GDC.

  4. Recopila 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 la AC X.509.

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

  6. Para una solicitud de firma de certificado aprobada, debes obtener un certificado de la AC firmado por la AC raíz del cliente. Almacena el certificado en el archivo sub_ca.crt en el directorio actual.

  7. Si corresponde, obtén el certificado de la AC raíz del cliente y almacénalo en el archivo ca.crt en el directorio actual.

  8. Verifica el nombre común (CN) del certificado de la AC:

    openssl x509 -noout -subject -in sub_ca.crt
    

    Si tu configuración requiere extensiones de nombres alternativos de sujeto (SAN), verifica las extensiones SAN en el certificado:

    openssl x509 -text -noout -in sub_ca.crt | grep -A 1 "Subject Alternative Name"
    
  9. Genera la spec para aplicar parches al 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 es 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 la preparación de la AC subordinada de BYO. Por lo general, la AC tarda alrededor de 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 la 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
    

Enumera las AC

Para enumerar todos los recursos de Certificate Authority Service en tu instancia aislada de Distributed Cloud, 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