Este documento descreve as etapas para criar uma autoridade de certificação subordinada (Sub CA, na sigla em inglês).
As Sub CAs são responsáveis por emitir certificados diretamente para entidades finais, como usuários, computadores e dispositivos. Elas são assinadas criptograficamente por uma CA mãe, geralmente a CA raiz. Os sistemas que confiam na CA raiz confiam automaticamente nas Sub CAs e nos certificados que elas emitem.
O signatário do certificado de CA pode ser outra CA criada no CA Service, por exemplo, a CA raiz, ou uma CA externa. Com CAs externas, o CA Service gera uma solicitação de assinatura de certificado (CSR, na sigla em inglês) que a CA externa precisa assinar.
Este documento é destinado a públicos-alvo do grupo de operadores de aplicativos, como desenvolvedores de aplicativos ou cientistas de dados, que gerenciam ciclos de vida de certificados no projeto. Para mais informações, consulte Públicos-alvo da documentação do GDC com isolamento físico.
Antes de começar
Antes de criar uma Sub CA, é necessário solicitar as permissões necessárias e preparar o ambiente.
Solicitar papéis do IAM
Para criar, atualizar e excluir recursos de autoridade de certificação, entre em contato com o administrador do IAM da organização para solicitar o papel de Certificate Authority Service Admin (certificate-authority-service-admin) no namespace do projeto da autoridade de certificação.
Preparar o ambiente
Faça o download e instale a CLI gdcloud, caso ainda não tenha feito isso.
Gere um arquivo kubeconfig para configurar o acesso
kubectl.
Criar uma Sub CA gerenciada
Para uma Sub CA gerenciada, o signatário do certificado de CA é outra CA (CA raiz) criada no CA Service.
Para criar uma Sub CA gerenciada, aplique um recurso personalizado à instância do dispositivo do Distributed Cloud.
Crie um recurso
CertificateAuthoritye salve-o como um arquivo YAML chamadosubca.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_ENABLEDSubstitua as seguintes variáveis:
Variável Descrição SUB_CA_NAME O nome da Sub CA. USER_PROJECT_NAMESPACE O nome do namespace em que o projeto do usuário reside. COMMON_NAME O nome comum do certificado de CA. DURATION O tempo de vida solicitado do certificado de CA. Especifique como uma duração em horas (por exemplo, 1000h). Unidades como dias (d) ou anos (y) não são aceitas.ROOT_CA_NAME O nome da CA raiz. SECRET_NAME O nome do secret do Kubernetes que contém a chave privada e o certificado de CA assinado. As variáveis a seguir são valores opcionais:
Variável Descrição RENEW_BEFORE O tempo de rotação antes da expiração do certificado de CA. ORGANIZATIONS Organizações a serem usadas no certificado. ORGANIZATIONAL_UNITS Unidades organizacionais a serem usadas no certificado. COUNTRIES Países a serem usados no certificado. LOCALITIES Cidades a serem usadas no certificado. PROVINCES Estados ou províncias a serem usados no certificado. STREET_ADDRESSES Endereços a serem usados no certificado. POSTAL_CODES Códigos postais a serem usados no certificado. EXTENDED_KEY_USAGE O uso de chave estendida para o certificado. Se fornecido, os valores permitidos são serverAutheclientAuth.KEY_ALGORITHYM O algoritmo de chave privada usado para esse certificado. Os valores permitidos são RSA, Ed25519 ou ECDSA. Se o tamanho não for fornecido, o padrão será 256 para ECDSA e 2048 para RSA. O tamanho da chave é ignorado para Ed25519. KEY_SIZE O tamanho, em bits, da chave privada para esse certificado depende do algoritmo. O RSA permite 2048, 3072, 4096 ou 8192 (padrão 2048). O ECDSA permite 256, 384 ou 521 (padrão 256). O Ed25519 ignora o tamanho. ACME_ENABLED Se definido como true, a CA será executada no modo ACME e vai gerar o URL do servidor ACME. Em seguida, você poderá usar o cliente e o protocolo ACME para gerenciar certificados.Aplique o recurso personalizado à instância do Distributed Cloud:
kubectl apply -f subca.yaml --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIGSubstitua
MANAGEMENT_API_SERVER_KUBECONFIGpelo caminho do arquivo kubeconfig do servidor da API Management.Verifique a prontidão da Sub CA. Leva cerca de 40 minutos para que a CA fique pronta:
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))'A saída será assim:
{ "lastTransitionTime": "2025-01-24T17:09:29Z", "message": "CA reconciled", "observedGeneration": 2, "reason": "Ready", "status": "True", "type": "Ready" }
Criar uma Sub CA de uma CA externa
Essa Sub CA oferece suporte à assinatura de certificados de folha com CAs externas ou gerenciadas pelo usuário. Ela gera uma CSR para os usuários assinarem.
Crie um recurso
CertificateAuthoritye salve-o como um arquivo YAML chamadosubca-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_ENABLEDSubstitua as seguintes variáveis:
Variável Descrição SUB_CA_NAME O nome da subCA. USER_PROJECT_NAMESPACE O ID do projeto em que você quer importar a imagem. COMMON_NAME O nome comum do certificado de CA. DURATION O tempo de vida solicitado do certificado de CA. Especifique como uma duração em horas (por exemplo, 1000h). Unidades como dias (d) ou anos (y) não são aceitas.SECRET_NAME O nome do secret do Kubernetes que contém a chave privada e o certificado de CA assinado. As variáveis a seguir são valores opcionais:
Variável Descrição RENEW_BEFORE O tempo de rotação antes da expiração do certificado de CA. ORGANIZATION Organização a ser usada no certificado. ORGANIZATIONAL_UNITS Unidades organizacionais a serem usadas no certificado. COUNTRIES Países a serem usados no certificado. LOCALITIES Cidades a serem usadas no certificado. PROVINCES Estados ou províncias a serem usados no certificado. STREET_ADDRESSES Endereços a serem usados no certificado. POSTAL_CODES Códigos postais a serem usados no certificado. EXTENDED_KEY_USAGE O uso de chave estendida para o certificado. Se fornecido, os valores permitidos são serverAutheclientAuth.KEY_ALGORITHYM O algoritmo de chave privada usado para esse certificado. Os valores permitidos são RSA,Ed25519ouECDSA. Se o tamanho não for fornecido, o padrão será 256 paraECDSAe 2048 paraRSA. O tamanho da chave é ignorado paraEd25519.KEY_SIZE O tamanho, em bits, da chave privada para esse certificado depende do algoritmo. O RSApermite 2048, 3072, 4096 ou 8192 (padrão 2048). OECDSApermite 256, 384 ou 521 (padrão 256).Ed25519ignora o tamanho.ACME_ENABLED Se definido como true, a CA será executada no modo ACME e vai gerar o URL do servidor ACME. Em seguida, você poderá usar o cliente e o protocolo ACME para gerenciar certificados.Aplique o recurso personalizado à instância do Distributed Cloud:
kubectl apply -f subca-external.yaml --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIGUma CSR para a Sub CA é gerada no servidor da API Management do GDC. É necessário fazer o download da CSR e assiná-la. Depois de assinado, você pode fazer o upload do certificado assinado para o servidor da API Management do GDC.
Reúna as solicitações de assinatura de certificado (CSR) do ambiente do 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"' | bashO comando gera um arquivo CSR chamado
sub_ca.csrno diretório atual. Esse arquivo contém uma CSR para um certificado de CAX.509.Use a CA raiz do cliente para solicitar certificados de CA assinados para o arquivo
sub_ca.csr.Para uma solicitação de assinatura de certificado aprovada, é necessário receber um certificado de CA assinado pela CA raiz do cliente. Armazene o certificado no arquivo
sub_ca.crtno diretório atual.Se aplicável, receba o certificado de CA raiz do cliente e armazene-o no arquivo
ca.crtno diretório atual.Verifique o nome comum (CN) do certificado de CA:
openssl x509 -noout -subject -in sub_ca.crtSe a configuração exigir extensões de nome alternativo do sujeito (SAN, na sigla em inglês), verifique as extensões SAN no certificado:
openssl x509 -text -noout -in sub_ca.crt | grep -A 1 "Subject Alternative Name"Gere o
specpara corrigir o recursoCertificateAuthority:echo "spec: caCertificate: externalCA: signedCertificate: certificate: $(base64 -w0 SUB_CA_NAME.crt) ca: $(base64 -w0 ca.crt)" > patch.txtO conteúdo do arquivo
patch.txté semelhante ao seguinte:spec: caCertificate: externalCA: signedCertificate: certificate: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURSekNDQ… ca: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURRVENDQ…Edite o campo
specdo recursoCertificateAuthority:kubectl patch certificateauthority SUB_CA_NAME -n USER_PROJECT_NAMESPACE--patch-file patch.txt --type='merge'Verifique a prontidão da Sub CA do tipo "traga seu próprio" (BYO, na sigla em inglês). Normalmente, leva cerca de 40 minutos para que a CA fique pronta:
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))'A saída será assim:
{ "lastTransitionTime": "2024-04-30T22:10:50Z", "message": "Certificate authority is ready for use", "observedGeneration": 3, "reason": "Ready", "status": "True", "type": "Ready" }Verifique a data de validade dos certificados de CA assinados:
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
Listar CAs
Para listar todos os recursos do Certificate Authority Service na instância com isolamento físico do Distributed Cloud, faça o seguinte:
Use o parâmetro certificateauthorities para listar todos os recursos CertificateAuthority:
kubectl --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG -n USER_PROJECT_NAMESPACE get certificateauthorities
A saída será assim:
NAMESPACE NAME READY REASON AGE
foo root-ca True Ready 7h24m
foo sub-ca True Ready 7h24m