Solicitar un certificado

En esta página se describen los pasos para solicitar un certificado mediante el Servicio de Autoridades de Certificación.

Para establecer la confianza y proteger la comunicación en tu air gap de Google Distributed Cloud (GDC), solicita un certificado habilitado o inhabilitado para ACME al servicio de autoridad de certificación.

Antes de empezar

Antes de solicitar un certificado, asegúrate de que tienes los permisos necesarios y un archivo kubeconfig.

Permisos obligatorios

Para obtener los permisos que necesitas para solicitar un certificado, pide al administrador de gestión de identidades y accesos de tu organización que te conceda el rol Solicitante del certificado del Servicio de Autoridades de Certificación (certificate-authority-service-certificate-requester). Para obtener más información sobre los roles, consulta el artículo Definiciones de roles.

Obtener el archivo kubeconfig

Para ejecutar comandos en el servidor de la API Management, haz lo siguiente:

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

  2. Usa la ruta al archivo kubeconfig del servidor de la API de gestión para sustituir MANAGEMENT_API_SERVER_KUBECONFIG en estas instrucciones.

Solicitar un certificado mediante una CA con el modo ACME habilitado

Si la autoridad de certificación está alojada en modo ACME, mostrará la URL del servidor ACME en su estado cuando esté lista.

Obtén la URL del servidor ACME de la AC de tu entorno de Distributed Cloud:

kubectl get certificateauthorities CA_NAME -n USER_PROJECT_NAMESPACE -ojson | jq -r '.status.acme.uri'

Haz los cambios siguientes:

  • CA_NAME: Nombre de la AC, que puede ser una AC raíz o una AC secundaria.
  • USER_PROJECT_NAMESPACE: nombre del espacio de nombres en el que reside el proyecto del usuario.

Solicitar un certificado mediante una AC con el modo ACME inhabilitado

Para crear una solicitud de certificado con el modo ACME inhabilitado, debes crear y aplicar un recurso CertificateRequest a tu instancia aislada de Distributed Cloud. Hay dos modos de hacerlo:

  • Crea un CertificateResource e incluye un CSR en el recurso.
  • Crea un CertificateResource con una clave privada generada automáticamente por GDC y proporciona las configuraciones del certificado como valores personalizados.

Solicitar un certificado mediante una CSR

  1. Crea un recurso CertificateRequest y guárdalo como un archivo YAML llamado cert-request.yaml. Usa tu clave privada para crear una solicitud de firma de certificado (CSR) y añádela a tu recurso.

    También puedes emitir el certificado con un conjunto preconfigurado de parámetros X.509 introduciendo el nombre de la plantilla en el campo certificateTemplate.

    apiVersion: pki.security.gdc.goog/v1
    kind: CertificateRequest
    metadata:
      name: CERT_REQ_NAME
      namespace: USER_PROJECT_NAMESPACE
    spec:
      certificateAuthorityRef:
        name: CA_NAME
        namespace: USER_PROJECT_NAMESPACE
      csr: CSR
      certificateTemplate: TEMPLATE_NAME
      signedCertificateSecret: SECRET_NAME
      notBefore: VALIDITY_START_TIME
      notAfter: VALIDITY_END_TIME
      subjectOverride: SUBJECT_OVERRIDE
    

    Sustituye las siguientes variables:

    Variable Descripción
    CERT_REQ_NAME El nombre del certificado.
    USER_PROJECT_NAMESPACE El nombre del espacio de nombres en el que reside el proyecto del usuario.
    CA_NAME Nombre de la AC, que puede ser una AC raíz o una AC secundaria.
    CSR La solicitud de firma de certificado que se va a firmar con la autoridad de certificación.
    SECRET_NAME El nombre del secreto de Kubernetes que contiene la clave privada y el certificado de CA firmado.

    Sustituye las siguientes variables opcionales:

    Variable Descripción
    TEMPLATE_NAME El nombre de la plantilla de certificado predefinida que quieras usar. Para ver una lista de las plantillas disponibles y los detalles sobre los conflictos, consulta Plantillas de certificados predefinidas.
    VALIDITY_START_TIME La hora a partir de la cual se considera que el certificado es válido. Este valor debe tener el formato YYYY-MM-DDTHH:MM:SSZ (por ejemplo, 2025-10-19T21:45:30Z). Si no se define, el certificado será válido inmediatamente después de emitirse.
    VALIDITY_END_TIME La hora a la que caduca el certificado. Este valor debe tener el formato YYYY-MM-DDTHH:MM:SSZ (por ejemplo, 2026-01-17T18:25:40Z). Si no se define, el certificado caduca 90 días después de la hora de inicio.
    SUBJECT_OVERRIDE Un asunto personalizado que se usará en el certificado emitido, que anula la información del asunto de la CSR. Proporcione este valor como el asunto X.509 sin procesar y codificado en DER de ASN.1.
  2. Aplica el recurso personalizado a tu instancia de Distributed Cloud:

    kubectl apply -f cert-request.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 solicitud de certificado esté lista:

    kubectl --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG -n USER_PROJECT_NAMESPACE get certificaterequest.pki.security.gdc.goog/CERT_REQ_NAME -ojson | jq -r ' .status.conditions[] | select( .type as $id | "Ready" | index($id))'
    

    El resultado debería ser similar al siguiente:

    {
      "lastTransitionTime": "2025-01-27T12:22:59Z",
      "message": "Certificate is issued",
      "observedGeneration": 1,
      "reason": "Issued",
      "status": "True",
      "type": "Ready"
    }
    
  4. Obtén el nombre del secreto del certificado:

    kubectl --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG -n USER_PROJECT_NAMESPACE get certificaterequest.pki.security.gdc.goog/CERT_REQ_NAME -ojson | jq -r '.spec.signedCertificateSecret'
    

    El resultado muestra el SECRET_NAME que contiene el certificado firmado:

    test-jwk-1
    

Solicitar un certificado con una clave generada automáticamente

  1. Crea un recurso CertificateRequest y guárdalo como un archivo YAML llamado cert-request.yaml. Rellene los valores elegidos para el certificado.

    También puedes emitir el certificado con un conjunto preconfigurado de parámetros X.509 introduciendo el nombre de la plantilla en el campo certificateTemplate.

    apiVersion: pki.security.gdc.goog/v1
    kind: CertificateRequest
    metadata:
      name: CERT_REQ_NAME
      namespace: USER_PROJECT_NAMESPACE
    spec:
      certificateAuthorityRef:
        name: CA_NAME
        namespace: USER_PROJECT_NAMESPACE
      certificateConfig:
        subjectConfig:
          commonName: COMMON_NAME
          organization: ORGANIZATION
          locality: LOCALITY
          state: STATE
          country: COUNTRY
          dnsNames: 
          - DNS_NAMES
          ipAddresses:
          - IP_ADDRESSES
          rfc822Names:
          - RFC822NAMES
          uris:
          - URIS
      certificateTemplate: TEMPLATE_NAME
      signedCertificateSecret: SECRET_NAME
      notBefore: VALIDITY_START_TIME
      notAfter: VALIDITY_END_TIME
      subjectOverride: SUBJECT_OVERRIDE
    

    Sustituye las siguientes variables:

    Variable Descripción
    CERT_REQ_NAME El nombre del certificado.
    USER_PROJECT_NAMESPACE El nombre del espacio de nombres en el que reside el proyecto del usuario.
    CA_NAME Nombre de la AC, que puede ser una AC raíz o una AC secundaria.
    SECRET_NAME El nombre del secreto de Kubernetes que contiene la clave privada y el certificado de CA firmado.

    Sustituye las siguientes variables opcionales. Debe incluir al menos uno de los campos del bloque spec.certificateConfig.subjectConfig del recurso CertificateRequest:

    Variable Descripción
    COMMON_NAME El nombre común del certificado.
    ORGANIZATION Organización que se va a usar en el certificado.
    LOCALITY La localidad del certificado.
    STATE Estado o provincia que se usará en el certificado.
    COUNTRY El país del certificado.
    DNS_NAMES DNSNames es una lista de dNSName subjectAltNames que se debe definir en el certificado.
    IP_ADDRESS Lista de ipAddress subjectAltNames que se va a definir en el certificado.
    RFC822_NAMES Lista de rfc822Name subjectAltNames que se va a definir en el certificado.
    URIS Lista de uniformResourceIdentifier subjectAltNames que se va a definir en el certificado.
    TEMPLATE_NAME El nombre de la plantilla de certificado predefinida que quieras usar. Para ver una lista de las plantillas disponibles y los detalles sobre los conflictos, consulta Plantillas de certificados predefinidas.
    VALIDITY_START_TIME La hora a partir de la cual se considera que el certificado es válido. Este valor debe tener el formato YYYY-MM-DDTHH:MM:SSZ (por ejemplo, 2025-10-19T21:45:30Z). Si no se define, el certificado será válido inmediatamente después de emitirse.
    VALIDITY_END_TIME La hora a la que caduca el certificado. Este valor debe tener el formato YYYY-MM-DDTHH:MM:SSZ (por ejemplo, 2026-01-17T18:25:40Z). Si no se define, el certificado caduca 90 días después de la hora de inicio.
    SUBJECT_OVERRIDE Un asunto personalizado que se usará en el certificado emitido, que anula la información del asunto de la CSR. Proporcione este valor como el asunto X.509 sin procesar y codificado en DER de ASN.1.
  2. Aplica el recurso personalizado a tu instancia de Distributed Cloud:

    kubectl apply -f cert-request.yaml --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG
    
  3. Verifica que la solicitud de certificado esté lista:

    kubectl --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG -n USER_PROJECT_NAMESPACE get certificaterequest.pki.security.gdc.goog/CERT_REQ_NAME -ojson | jq -r ' .status.conditions[] | select( .type as $id | "Ready" | index($id))'
    

    El resultado debería ser similar al siguiente:

    {
      "lastTransitionTime": "2025-01-27T12:22:59Z",
      "message": "Certificate is issued",
      "observedGeneration": 1,
      "reason": "Issued",
      "status": "True",
      "type": "Ready"
    }
    
  4. Obtén el nombre del secreto del certificado:

    kubectl --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG -n USER_PROJECT_NAMESPACE get certificaterequest.pki.security.gdc.goog/CERT_REQ_NAME -ojson | jq -r '.spec.signedCertificateSecret'
    

    El resultado muestra el SECRET_NAME que contiene el certificado firmado:

    test-jwk-1
    

Mostrar solicitudes de certificados

Usa el parámetro certificaterequests para enumerar todos los recursos CertificateRequest:

   kubectl --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG -n USER_PROJECT_NAMESPACE get certificaterequests

El resultado es similar al siguiente:

   NAMESPACE    NAME               READY   AGE
   foo          cert-req           True    30s