En esta página, se describen los pasos para crear una autoridad certificadora subordinada (Sub CA).
Las sub-CA son responsables de emitir certificados directamente a las entidades finales, como usuarios, computadoras y dispositivos. Están firmados de forma criptográfica por una CA principal, a menudo la CA raíz. Los sistemas que confían en la CA raíz confían automáticamente en las CA 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 CA externas, el servicio de CA genera una solicitud de firma de certificado (CSR) que la CA externa debe firmar.
Antes de comenzar
Para obtener los permisos que necesitas para crear una entidad de certificación secundaria, pídele al administrador de IAM de tu organización que te otorgue el rol de administrador del servicio de la entidad de certificación (certificate-authority-service-admin
). 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, asegúrate de tener los siguientes recursos:
Accede y genera el archivo kubeconfig para el servidor de la API de Management si no tienes uno.
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.
Crea una sub-CA administrada
En el caso de una sub-CA administrada, el firmante del certificado de CA es otra CA (CA raíz) creada en el servicio de CA.
Para crear una sub-CA administrada, aplica un recurso personalizado a tu instancia de Distributed Cloud Appliance.
Crea un recurso
CertificateAuthority
y guárdalo como un archivo YAML llamadosubca.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 Nombre de la sub-CA. USER_PROJECT_NAMESPACE Es el nombre del espacio de nombres en el que reside el proyecto del usuario. COMMON_NAME Nombre común del certificado de CA. DURATION Es la vida útil solicitada del certificado de CA. ROOT_CA_NAME Nombre de la CA raíz. SECRET_NAME 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 Es el tiempo de rotación antes de que venza el certificado de CA. ORGANIZATIONS Organizaciones que se usarán en el certificado. ORGANIZATIONAL_UNITS Son las unidades organizativas que se usarán en el certificado. COUNTRIES Son los países que se usarán en el certificado. LOCALITIES Son las ciudades que se usarán en el certificado. PROVINCES Estados o provincias que se usarán en el certificado. STREET_ADDRESSES Son las direcciones de la calle que se usarán en el certificado. POSTAL_CODES Códigos postales que se usarán en el certificado. EXTENDED_KEY_USAGE Es el uso extendido de la clave del certificado. Si se proporciona, los valores permitidos son serverAuth
yclientAuth
.KEY_ALGORITHYM Es 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, se establece en 256 de forma predeterminada para ECDSA y en 2,048 para RSA. El tamaño de la clave se ignora para 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 configura en true
, la CA se ejecuta en modo ACME y genera la URL del servidor de ACME. Luego, puedes usar el cliente y el protocolo de ACME para administrar los certificados.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.Verifica que la sub CA esté lista. La CA tarda alrededor de 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 sub-CA a partir de una CA externa
Esta sub-CA admite la firma de certificados de hoja con CAs externas o administradas por el usuario. Genera una CSR para que los usuarios la firmen.
Crea un recurso
CertificateAuthority
y guárdalo como un archivo YAML llamadosubca-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 Es el nombre de la subCA. USER_PROJECT_NAMESPACE Es el ID del proyecto en el que deseas importar la imagen. COMMON_NAME Nombre común del certificado de CA. DURATION Es la vida útil solicitada del certificado de CA. SECRET_NAME 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 Es el tiempo de rotación antes de que venza el certificado de CA. ORGANIZATION Organización que se usará en el certificado. ORGANIZATIONAL_UNITS Son las unidades organizativas que se usarán en el certificado. COUNTRIES Son los países que se usarán en el certificado. LOCALITIES Son las ciudades que se usarán en el certificado. PROVINCES Estados o provincias que se usarán en el certificado. STREET_ADDRESSES Son las direcciones de la calle que se usarán en el certificado. POSTAL_CODES Códigos postales que se usarán en el certificado. EXTENDED_KEY_USAGE Es el uso extendido de la clave del certificado. Si se proporciona, los valores permitidos son serverAuth
yclientAuth
.KEY_ALGORITHYM Es el algoritmo de clave privada que se usa para este certificado. Los valores permitidos son RSA
,Ed25519
oECDSA
. Si no se proporciona el tamaño, el valor predeterminado es 256 paraECDSA
y 2,048 paraRSA
. Se ignora el tamaño de la clave paraEd25519
.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 configura en true
, la CA se ejecuta en modo ACME y genera la URL del servidor de ACME. Luego, puedes usar el cliente y el protocolo de ACME para administrar los certificados.Aplica el recurso personalizado a tu instancia de Distributed Cloud:
kubectl apply -f subca-external.yaml --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG
Se genera una CSR para la sub-CA dentro del servidor de la API de administración de GDC. Debes descargar la CSR y firmarla. Una vez que lo firmes, podrás subir el certificado firmado al servidor de la API de GDC Management.
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 CA deX.509
.Usa la CA raíz del cliente para solicitar certificados de CA firmados para el archivo
sub_ca.csr
.En el caso de una solicitud de firma de certificado aprobada, debes obtener un certificado de CA firmado por la CA raíz del cliente. Almacena el certificado en el archivo
sub_ca.crt
del directorio actual.Si corresponde, obtén el certificado de CA raíz del cliente y almacénalo en el archivo
ca.crt
del directorio actual.Verifica las extensiones de nombre alternativo del sujeto (SAN) en el certificado:
openssl x509 -text -noout -in sub_ca.crt | grep -A 1 "Subject Alternative Name"
Si el certificado de CA tiene un nombre común (CN) en lugar de un SAN, verifica el CN en el certificado:
openssl x509 -text -noout -in sub_ca.crt | grep -A 1 "Subject: CN"
Genera el
spec
para aplicar parches al recursoCertificateAuthority
: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…
Edita el campo
spec
del recursoCertificateAuthority
:kubectl patch certificateauthority SUB_CA_NAME -n USER_PROJECT_NAMESPACE--patch-file patch.txt --type='merge'
Verifica la preparación de la sub CA externa (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" }
Verifica la fecha de vencimiento de los certificados de CA 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 CAs
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 de 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