Solicitar un certificado

En esta página, se describen los pasos para solicitar un certificado con Certificate Authority Service.

Para establecer la confianza y proteger la comunicación dentro de tu Google Distributed Cloud (GDC) aislado, solicita un certificado habilitado o inhabilitado para ACME desde Certificate Authority Service.

Antes de comenzar

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

Permisos necesarios

Para obtener los permisos que necesitas para solicitar un certificado, pídele a tu administrador de IAM de la organización que te otorgue el rol de Solicitante de certificados de CA (certificate-authority-service-certificate-requester). Para obtener más información sobre los roles, consulta Definiciones de roles.

Obtén el archivo kubeconfig

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

  1. Accede y genera el archivo kubeconfig para el servidor de la API de Management si no tienes uno.

  2. Usa la ruta de acceso al archivo kubeconfig del servidor de la API de administración para reemplazar MANAGEMENT_API_SERVER_KUBECONFIG en estas instrucciones.

Solicita un certificado con la CA y el modo ACME habilitado

Si la autoridad certificadora se aloja en el modo ACME, genera la URL del servidor ACME en su estado después de que esté lista.

Recopila la URL del servidor de la AC de ACME de tu entorno de Distributed Cloud:

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

Reemplaza lo siguiente:

  • CA_NAME: Es el nombre de la CA, que puede ser una CA raíz o una sub-CA.
  • USER_PROJECT_NAMESPACE: Es el nombre del espacio de nombres en el que reside el proyecto del usuario.

Solicita un certificado a la CA 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. Existen dos maneras de hacerlo:

  • Crea un CertificateResource y, luego, incluye un CSR en el recurso.
  • Crea un CertificateResource con una clave privada generada automáticamente por el GDC y proporciona los parámetros de configuración del certificado como valores personalizados.

Solicita un certificado con 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 agrégala a tu recurso.

    De manera opcional, puedes emitir el certificado con un conjunto preconfigurado de parámetros X.509. Para ello, ingresa 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
    

    Reemplaza las siguientes variables:

    Variable Descripción
    CERT_REQ_NAME Es el nombre del certificado.
    USER_PROJECT_NAMESPACE Es el nombre del espacio de nombres en el que reside el proyecto del usuario.
    CA_NAME Nombre de la CA, que puede ser una CA raíz o una sub-CA.
    CSR Es la solicitud de firma de certificado que se firmará con la CA.
    SECRET_NAME Nombre del secreto de Kubernetes que contiene la clave privada y el certificado de CA firmado.

    Reemplaza las siguientes variables opcionales:

    Variable Descripción
    TEMPLATE_NAME Es el nombre de la plantilla de certificado predefinida que deseas usar. Para obtener una lista de las plantillas disponibles y detalles sobre los conflictos, consulta Plantillas de certificados predefinidas.
    VALIDITY_START_TIME Es la fecha y hora a partir de las cuales 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 configura, el certificado es válido inmediatamente después de su emisión.
    VALIDITY_END_TIME Fecha y hora de vencimiento del certificado. Este valor debe tener el formato YYYY-MM-DDTHH:MM:SSZ (por ejemplo, 2026-01-17T18:25:40Z). Si no se configura, el certificado vencerá 90 días después de su hora de inicio.
    SUBJECT_OVERRIDE Es un asunto personalizado que se usará en el certificado emitido y que anulará la información del asunto en la CSR. Proporciona este valor como el sujeto 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
    

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

  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 es similar a este:

    {
      "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
    

Solicita un certificado con una clave generada automáticamente

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

    De manera opcional, puedes emitir el certificado con un conjunto preconfigurado de parámetros X.509. Para ello, ingresa 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
    

    Reemplaza las siguientes variables:

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

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

    Variable Descripción
    COMMON_NAME Es el nombre común del certificado.
    ORGANIZATION Organización que se usará en el certificado.
    LOCALITY Es la localidad del certificado.
    STATE Estado o provincia que se usará en el certificado.
    COUNTRY Es el país del certificado.
    DNS_NAMES DNSNames es una lista de dNSName subjectAltNames que se configurarán en el certificado.
    IP_ADDRESS Es una lista de ipAddress subjectAltNames que se configurarán en el certificado.
    RFC822_NAMES Es una lista de rfc822Name subjectAltNames que se configurarán en el certificado.
    URIS Es una lista de uniformResourceIdentifier subjectAltNames que se configurarán en el certificado.
    TEMPLATE_NAME Es el nombre de la plantilla de certificado predefinida que deseas usar. Para obtener una lista de las plantillas disponibles y detalles sobre los conflictos, consulta Plantillas de certificados predefinidas.
    VALIDITY_START_TIME Es la fecha y hora a partir de las cuales 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 configura, el certificado será válido inmediatamente después de su emisión.
    VALIDITY_END_TIME Fecha y hora de vencimiento del certificado. Este valor debe tener el formato YYYY-MM-DDTHH:MM:SSZ (por ejemplo, 2026-01-17T18:25:40Z). Si no se configura, el certificado vencerá 90 días después de su hora de inicio.
    SUBJECT_OVERRIDE Es un asunto personalizado que se usará en el certificado emitido y que anulará la información del asunto en la CSR. Proporciona este valor como el sujeto 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 es similar a este:

    {
      "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
    

Cómo mostrar las solicitudes de certificados

Usa el parámetro certificaterequests para enumerar todos los recursos de 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