En este documento, se describen los pasos para crear una autoridad certificadora subordinada (CA subordinada).
Las AC subordinadas son responsables de emitir certificados directamente a las entidades finales, como usuarios, computadoras y dispositivos. Están firmados criptográficamente por una AC superior, que suele ser la AC raíz. 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 podría ser otra AC creada en CA Service, por ejemplo, la AC raíz o una AC externa. Con las AC externas, el Servicio de AC genera una solicitud de firma de certificado (CSR) que la AC externa debe firmar.
Este documento está dirigido 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 GDC aislado.
Antes de comenzar
Antes de crear una CA 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 la organización de IAM para solicitar el rol de administrador del Servicio de autoridad certificadora
(certificate-authority-service-admin) en el espacio de nombres del proyecto de la
autoridad certificadora.
Prepara el entorno
Genera un archivo kubeconfig para configurar el acceso a
kubectl.
Crea una AC subordinada administrada
Para una AC subordinada administrada, el firmante del certificado de la AC es otra AC (AC raíz) creada en Certificate Authority Service.
Para crear una AC subordinada administrada, aplica un recurso personalizado a tu instancia de Distributed Cloud Appliance.
Crea un recurso
CertificateAuthorityy 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_ENABLEDReemplaza las siguientes variables:
Variable Descripción SUB_CA_NAME Es el nombre de la CA subordinada. USER_PROJECT_NAMESPACE Es el nombre del espacio de nombres en el que reside el proyecto del usuario. COMMON_NAME Es el nombre común del certificado de la AC. DURATION Es la duración 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).ROOT_CA_NAME Es el nombre de la CA raíz. SECRET_NAME Es el nombre del Secret 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 Es el tiempo de rotación antes de que venza el certificado de la AC. ORGANIZATIONS Son las 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 Estado o provincias que se usarán en el certificado. STREET_ADDRESSES Son las direcciones que se usarán en el certificado. POSTAL_CODES Son los códigos postales que se usarán en el certificado. EXTENDED_KEY_USAGE Es el uso extendido de la clave para el certificado. Si se proporcionan, los valores permitidos son serverAuthyclientAuth.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, 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 de este certificado depende del algoritmo. RSA permite 2048, 3072, 4096 o 8192 (el valor predeterminado es 2048). ECDSA permite 256, 384 o 521 (el valor predeterminado es 256). Ed25519 ignora el tamaño. ACME_ENABLED Si se establece en true, la AC 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_KUBECONFIGReemplaza
MANAGEMENT_API_SERVER_KUBECONFIGpor la ruta de acceso al archivo kubeconfig del servidor de la API de administración.Verifica la preparación de la CA subordinada. 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 AC subordinada a partir de una AC externa
Esta AC subordinada admite la firma de certificados de hoja con AC externas o administradas por el usuario. Genera una CSR para que la firmen los usuarios.
Crea un recurso
CertificateAuthorityy 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_ENABLEDReemplaza las siguientes variables:
Variable Descripción SUB_CA_NAME Es el nombre de la CA subordinada. USER_PROJECT_NAMESPACE El ID del proyecto en el que deseas importar la imagen. COMMON_NAME Es el nombre común del certificado de la AC. DURATION Es la duración 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).SECRET_NAME Es el nombre del Secret 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 Es el tiempo de rotación antes de que venza el certificado de la AC. ORGANIZATION Es la 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 Estado o provincias que se usarán en el certificado. STREET_ADDRESSES Son las direcciones que se usarán en el certificado. POSTAL_CODES Son los códigos postales que se usarán en el certificado. EXTENDED_KEY_USAGE Es el uso extendido de la clave para el certificado. Si se proporcionan, los valores permitidos son serverAuthyclientAuth.KEY_ALGORITHYM Es el algoritmo de clave privada que se usa para este certificado. Los valores permitidos son RSA,Ed25519oECDSA. Si no se proporciona el tamaño, el valor predeterminado es 256 paraECDSAy 2048 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. RSApermite 2048, 3072, 4096 u 8192 (el valor predeterminado es 2048).ECDSApermite 256, 384 o 521 (el valor predeterminado es 256).Ed25519ignora el tamaño.ACME_ENABLED Si se establece en true, la AC 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_KUBECONFIGSe genera una CSR para la CA subordinada dentro del servidor de la API de administración de GDC. Debes descargar la CSR y firmarla. Una vez firmado, puedes subir el certificado firmado al servidor de la API de administración de GDC.
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"' | bashEl comando genera un archivo CSR llamado
sub_ca.csren el directorio actual. Este archivo contiene una CSR para un certificado de la AC deX.509.Usa la AC raíz del cliente para solicitar certificados de la AC firmados para el archivo
sub_ca.csr.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.crten el directorio actual.Si corresponde, obtén el certificado de la AC raíz del cliente y almacénalo en el archivo
ca.crten el directorio actual.Verifica el nombre común (CN) del certificado de la AC:
openssl x509 -noout -subject -in sub_ca.crtSi tu configuración requiere extensiones de nombre alternativo del sujeto (SAN), verifica las extensiones de SAN en el certificado:
openssl x509 -text -noout -in sub_ca.crt | grep -A 1 "Subject Alternative Name"Genera el
specpara aplicar un parche al recursoCertificateAuthority:echo "spec: caCertificate: externalCA: signedCertificate: certificate: $(base64 -w0 SUB_CA_NAME.crt) ca: $(base64 -w0 ca.crt)" > patch.txtEl contenido del archivo
patch.txtes similar al siguiente:spec: caCertificate: externalCA: signedCertificate: certificate: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURSekNDQ… ca: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURRVENDQ…Edita el campo
specdel recursoCertificateAuthority:kubectl patch certificateauthority SUB_CA_NAME -n USER_PROJECT_NAMESPACE--patch-file patch.txt --type='merge'Verifica la preparación de la CA subordinada de tipo Trae tu propia CA (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 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 de Distributed Cloud con aislamiento físico, 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