O appliance com isolamento físico do Google Distributed Cloud (GDC) fornece uma API de infraestrutura de chave pública (PKI) para receber certificados da Web. Nesta página, fornecemos instruções para fazer a transição de um modo de certificado de PKI para outro. Para mais informações sobre os tipos de configuração do modo PKI, consulte Configuração de certificado TLS da Web.
Antes de começar
Para receber as permissões necessárias para configurar o emissor de certificado padrão da PKI,
peça ao administrador do IAM da organização para conceder a você a função de administrador da PKI de infraestrutura
(infra-pki-admin) no namespace do sistema.
Migrar para o modo de subautoridade de certificação BYO
Esta seção fornece uma série de etapas para fazer a transição para o modo de certificado BYO (traga sua própria subautoridade de certificação).
Criar uma subautoridade de certificação BYO
Para criar uma subautoridade de certificação BYO, aplique um recurso personalizado à sua instância de appliance isolado do GDC.
Crie um recurso
CertificateAuthoritye salve-o como um arquivo YAML. No exemplo a seguir, você vê um recursoCertificateAuthorityapiVersion: pki.security.gdc.goog/v1 kind: CertificateAuthority metadata: name: CA_NAME namespace: pki-system spec: caProfile: commonName: COMMON_NAME duration: DURATION renewBefore: RENEW_BEFORE caCertificate: externalCA: {} certificateProfile: keyUsage: - digitalSignature - keyCertSign - crlSign extendedKeyUsage: - serverAuth secretConfig: secretName: SECRET_NAMESubstitua as seguintes variáveis:
- CA_NAME: o nome da subCA.
- COMMON_NAME: o nome comum do certificado da CA.
- DURATION: o tempo de vida solicitado do certificado da CA.
- RENEW_BEFORE: o tempo de rotação antes da expiração do certificado de CA.
- SECRET_NAME: o nome do secret do Kubernetes que vai conter a chave privada e o certificado da CA assinado.
Aplique o recurso personalizado à instância do dispositivo isolado do GDC.
kubectl apply -f byo-subca.yaml --kubeconfig MANAGEMENT_API_SERVERSubstitua MANAGEMENT_API_SERVER pelo arquivo kubeconfig do servidor da API Management.
Uma CSR para a subautoridade certificadora é gerada e aguarda sua assinatura. Para assinar a CSR, siga as instruções na seção Assinar o certificado da subCA BYO.
Assinar o certificado da subCA BYO
Receba as solicitações de assinatura de certificado (CSR) do seu ambiente do GDC:
kubectl get certificateauthorities CA_NAME -n pki-system -ojson | jq -j '"echo ", .status.externalCA.csr, " | base64 -d > ","sub_ca.csr\n"' | bashO comando gera o arquivo
sub_ca.csrno diretório atual. Esse arquivo contém uma CSR para um certificado de CA X.509.Use o protocolo da 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, você vai receber um certificado de CA assinado pela CA raiz do cliente. Armazene o certificado no arquivo
sub_ca.crtno diretório atual. Além disso, obtenha o certificado da CA raiz do cliente e armazene-o no arquivoca.crtno diretório atual. Entre em contato com o PMO para receber instruções exatas.Verifique as extensões de nome alternativo do assunto (SAN) no certificado:
openssl x509 -text -noout -in sub_ca.crt | grep -A 1 "Subject Alternative Name"Se o certificado da CA tiver um nome comum (CN) em vez de um SAN, verifique o
CNno certificado:openssl x509 -text -noout -in sub_ca.crt | grep -A 1 "Subject: CN"Gere a especificação para corrigir o recurso
CertificateAuthority:echo "spec: caCertificate: externalCA: signedCertificate: certificate: $(base64 -w0 sub_ca.crt) ca: $(base64 -w0 ca.crt)" > patch.txtO conteúdo do arquivo
patch.txté semelhante ao snippet a seguir:spec: caCertificate: externalCA: signedCertificate: certificate: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURSekNDQ… ca: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURRVENDQ…Edite a especificação do recurso
CertificateAuthority:kubectl patch certificateauthority CA_NAME -n pki-system --patch-file patch.txt --type='merge'Verifique se a subCA BYO está pronta:
kubectl get certificateauthority CA_NAME -n pki-system -ojson | jq -r ' .status.conditions[] | select( .type as $id | "Ready" | index($id))'Você verá uma saída semelhante a esta:
{ "lastTransitionTime": "2024-04-30T22:10:50Z", "message": "Certificate authority is ready for use", "observedGeneration": 3, "reason": "Ready", "status": "True", "type": "Ready" }Verifique a validade dos certificados de CA assinados:
kubectl -n pki-system get secret SECRET_NAME -ojson | jq -j '"echo ", .metadata.name, " $(echo ", .data["tls.crt"], "| base64 -d | openssl x509 -enddate -noout)\n"' | bashCrie um arquivo YAML de recurso
CertificateIssuere salve-o. Por exemplo,byo-subca-issuer.yaml:apiVersion: pki.security.gdc.goog/v1 kind: CertificateIssuer metadata: name: BYO_SUBCA_ISSUER namespace: pki-system spec: caaasConfig: certificateAuthorityRef: namespace: pki-system name: CA_NAMESubstitua BYO_SUBCA_ISSUER pelo nome do emissor da subCA BYO.
Aplique o recurso personalizado à instância do appliance isolado do GDC no servidor da API Management usando a CLI
kubectl:kubectl apply -f byo-subca-issuer.yaml --kubeconfig MANAGEMENT_API_SERVERVerifique se o novo emissor está pronto:
kubectl -n pki-system get certificateissuer.pki.security.gdc.goog/BYO_SUBCA_ISSUER -ojson | jq -r ' .status.conditions[] | select( .type as $id | "Ready" | index($id))'
Transição para o modo de certificado BYO
Esta seção apresenta uma série de etapas para fazer a transição para o modo BYO-cert.
Criar um CertificateIssuer BYO
Crie um recurso
CertificateIssuere salve-o como um arquivo YAML. Por exemplo,byo-cert-issuer.yaml. Esse emissor de certificado BYO usa odefault-tls-cagerenciado como a CA substituta:apiVersion: pki.security.gdc.goog/v1 kind: CertificateIssuer metadata: name: BYO_CERT_ISSUER_NAME namespace: pki-system spec: byoCertConfig: fallbackCertificateAuthority: name: default-tls-ca namespace: pki-systemSubstitua BYO_CERT_ISSUER_NAME pelo nome do emissor de certificado BYO.
Aplique o recurso personalizado à instância do dispositivo isolado do GDC no servidor da API Management:
kubectl apply -f byo-cert-issuer.yaml --kubeconfig MANAGEMENT_API_SERVERVerifique se o novo emissor está pronto.
kubectl -n pki-system get certificateissuer.pki.security.gdc.goog/BYO_CERT_ISSUER_NAME -ojson | jq -r ' .status.conditions[] | select( .type as $id | "Ready" | index($id))'A saída será assim:
{ "lastTransitionTime": "2024-05-01T22:25:20Z", "message": "", "observedGeneration": 1, "reason": "FallbackCAReady", "status": "True", "type": "Ready" }
Assinar o certificado BYO
Enquanto espera que a CSR seja assinada externamente, um certificado BYO pode ser emitido temporariamente por uma CA de substituição especificada no emissor do certificado BYO. Confira o status atual do BYO-cert
default-wildcard-cert:kubectl get certificate.pki.security.gdc.goog/default-wildcard-cert -n istio-system -o json | jq -r ' .status.conditions[] | select( .type as $id | "Ready" | index($id))'A saída será assim:
{ "lastTransitionTime": "2024-05-03T08:42:10Z", "message": "Certificate is issued by a fallback CA", "observedGeneration": 1, "reason": "UsingFallbackCA", "status": "True", "type": "Ready" }O motivo pronto indica
UsingFallbackCApara informar que a CA de substituição emitiu o certificado. Em seguida, ele é armazenado no secret e fica pronto para uso.Consiga o nome do secret do certificado:
kubectl -n istio-system get certificate.pki.security.gdc.goog/default-wildcard-cert -ojson | jq -r '.spec.secretConfig.secretName'A saída será assim:
web-tlsVerifique o emissor do secret:
kubectl get secret web-tls -n istio-system -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -text -noout | grep IssuerA saída será assim:
Issuer: CN = GDC Managed ORG TLS CAUm certificado BYO pode usar temporariamente um certificado correspondente enquanto aguarda a própria assinatura de CSR. Um certificado example-service com dnsName como
example-service.org-1.zone1.google.gdch.testé correspondido pelodefault-wildcard-certcom DNSName*.org-1.zone1.google.gdch.testdo mesmo emissor de certificado. O certificado example-service pode ter o seguinte status enquanto aguarda a assinatura da CSR:{ "lastTransitionTime": "2024-05-03T22:30:51Z", "message": "Using a matched issued Certificate: default-wildcard-cert/istio-system", "observedGeneration": 1, "reason": "UsingMatchedCert", "status": "True", "type": "Ready" }Extraia a CSR do status do certificado:
kubectl -n istio-system get certificate.pki.security.gdc.goog/default-wildcard-cert -ojson | jq -r ' .status.byoCertStatus.csrStatus'A saída será assim:
{ "conditions": [ { "lastTransitionTime": "2024-05-03T18:14:19Z", "message": "", "observedGeneration": 1, "reason": "WaitingForSigning", "status": "False", "type": "Ready" } ], "csr": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSB..." }Há diferentes métodos para assinar uma CSR com base na configuração da CA externa. Ao assinar, use o SAN da CSR. Exemplo:
function signCert() { certName=$1 ns=$2 # Download the CSR from the certificate kubectl get certificate.pki.security.gdc.goog $certName -n $ns -o jsonpath='{.status.byoCertStatus.csrStatus.csr}' | base64 -d > $certName.csr # Get SAN from the csr san=$(openssl req -in $certName.csr -noout -text | grep 'DNS:' | sed -s 's/^[ ]*//') # Save SAN to extension config cat <<EOF >$certName-csr.ext keyUsage=digitalSignature,keyEncipherment extendedKeyUsage=serverAuth,clientAuth subjectAltName=${san} EOF # Sign the CSR with an external CA. You need to prepare the external CA cert and key openssl x509 -req -in $certName.csr -days 365 -CA ext-ca.crt -CAkey ext-ca.key -CAcreateserial -extfile $certName-csr.ext -out $certName-signed.crt openssl x509 -in $certName-signed.crt -text -noout # Upload the externally signed certificate by patching. echo "spec: byoCertificate: certificate: $(base64 -w0 $certName-signed.crt) ca: $(base64 -w0 ext-ca.crt)" > patch.txt kubectl patch certificate.pki.security.gdc.goog $certName -n $ns --patch-file patch.txt --type='merge' } # Use the function to sign the default-wildcard-cert in the istio-system namespace signCert default-wildcard-cert istio-systemVerifique os seguintes detalhes:
- O status da CSR do certificado é
Ready
kubectl -n istio-system get certificate.pki.security.gdc.goog/default-wildcard-cert -ojson | jq -r ' .status.byoCertStatus.csrStatus.conditions'[ { "lastTransitionTime": "2024-05-03T21:56:25Z", "message": "", "observedGeneration": 2, "reason": "Signed", "status": "True", "type": "Ready" } ]- O certificado é
Readypelo motivoIssued
kubectl get certificate.pki.security.gdc.goog/default-wildcard-cert -n istio-system -o json | jq -r ' .status.conditions[] | select( .type as $id | "Ready" | index($id))'A saída será assim:
{ "lastTransitionTime": "2024-05-03T08:42:10Z", "message": "Certificate is issued", "observedGeneration": 2, "reason": "Issued", "status": "True", "type": "Ready" }- O secret é atualizado:
kubectl get secret web-tls -n istio-system -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -text -noout | grep IssuerA saída será assim:
Issuer: CN = external-ca- O status da CSR do certificado é
Reemissão de certificado
Para mudar o emissor padrão para o novo, consulte Mudar o emissor de certificado padrão
Para reemitir imediatamente os certificados com o novo emissor padrão, consulte Reemitir manualmente certificados da Web da ICP.