O protocolo Automatic Certificate Management Environment (ACME) automatiza a obtenção e a renovação de certificados X.509. Esse protocolo permite que uma autoridade certificadora (CA) verifique automaticamente a propriedade de um domínio e emita o certificado correspondente. O Let's Encrypt é uma CA pública sem fins lucrativos que utiliza o protocolo ACME para emitir certificados confiáveis na maioria dos navegadores web. Este tópico descreve como usar o cert-manager com o Let's Encrypt para emitir um certificado HTTPS confiável para um gateway de entrada do ASM.
Pré-requisitos
Um cluster do Container Service for Kubernetes (ACK) adicionado a uma instância do Service Mesh (ASM) versão 1.16 ou posterior. Para mais informações, consulte Adicionar um cluster a uma instância do ASM e Atualizar uma instância do ASM.
Um gateway de entrada implantado, com as portas 80 e 443 expostas. Para mais informações, consulte Criar um gateway de entrada.
A aplicação httpbin implantada no cluster associado à instância do ASM. Para mais informações, consulte Implantar a aplicação httpbin.
O cert-manager instalado. Para mais informações, consulte Instalar o cert-manager.
Suporte à API Ingress ativado no gateway de entrada do ASM. Para mais informações, consulte Etapa 1: Ativar acesso à API Ingress.
ACME no cert-manager
Ao utilizar o cert-manager, o componente ACME Issuer registra uma conta de usuário em um servidor de CA compatível com o protocolo ACME. Durante a criação de um ACME Issuer, o cert-manager gera uma chave privada para estabelecer comunicação segura com o servidor ACME. Certificados emitidos por CAs públicas, como o Let's Encrypt, são confiáveis por padrão na maioria dos navegadores web. Assim, quando um usuário acessa seu site, o navegador confia automaticamente no certificado SSL/TLS apresentado. A função principal de uma CA pública é comprovar ao navegador que o servidor é o proprietário legítimo do domínio. Para isso, a CA precisa verificar se o solicitante realmente controla o domínio antes de emitir o certificado. Para mais detalhes sobre o protocolo ACME, consulte Automatic Certificate Management Environment.
Resolução de desafios
Um desafio é o mecanismo pelo qual o protocolo ACME verifica a propriedade do seu domínio. Durante a emissão do certificado, o servidor ACME exige que o cliente complete um desafio específico. Essa validação garante que apenas o proprietário legítimo do domínio possa obter um certificado, prevenindo falsificações e aumentando a segurança. O cert-manager suporta dois tipos principais de desafios: HTTP-01 e DNS-01.
No desafio HTTP-01, você deve provar a propriedade colocando um arquivo com uma chave de validação em uma URL específica do seu servidor. Essa URL precisa ser publicamente acessível e incluir o domínio para o qual o certificado está sendo solicitado. Quando o servidor ACME recupera a chave com sucesso nesse caminho, ele considera o domínio validado. Para simplificar esse processo, o cert-manager automatiza as etapas necessárias. Ao configurar um desafio HTTP-01, o cert-manager ajusta temporariamente os recursos Ingress do cluster para rotear solicitações de validação para um pequeno serviço web. Esse serviço apresenta a chave de validação exigida ao servidor ACME.
Já o desafio DNS-01 requer a prova de propriedade por meio da criação de um registro DNS TXT específico contendo uma chave de validação. Após a propagação do registro pelo sistema DNS, o servidor ACME verifica a propriedade do domínio realizando uma consulta DNS. Se receber as permissões necessárias, o cert-manager cria e envia automaticamente o registro TXT exigido ao seu provedor de DNS para resolver o desafio DNS-01.
Em ambientes de produção, confirme se sua autoridade certificadora suporta o protocolo ACME. Em caso afirmativo, o gateway de entrada do ASM pode obter automaticamente um certificado da CA por meio do cert-manager. Por exemplo, a Sectigo suporta o protocolo ACME, operando com base em princípios semelhantes.
Etapa 1: Preparar um domínio público
Para emitir um certificado com o Let's Encrypt, é necessário ter um domínio público apontando para o gateway de entrada do ASM. Consulte a documentação do seu provedor de DNS para obter instruções específicas. Caso utilize o Alibaba Cloud DNS, veja Adicionar registros DNS. Para saber mais sobre o Let's Encrypt, acesse Getting Started.
Etapa 2: Criar um recurso Issuer do Let's Encrypt
-
Use o KubeConfig do seu cluster de plano de dados para criar o seguinte recurso.
apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: letsencrypt-prod-issuer namespace: istio-system spec: acme: email: 'te**@mail.com' # This field is optional but recommended. The ACME server may use this email to send you important notices about your certificate. privateKeySecretRef: name: letsencrypt-prod server: https://acme-v02.api.letsencrypt.org/directory solvers: - http01: ingress: ingressClassName: istioO recurso Issuer acima especifica um solucionador
http01que usa a API Ingress com umaingressClassNamedefinida comoistio. As etapas a seguir explicam o funcionamento desse solucionador.NotaO cert-manager oferece suporte a solucionadores tanto para a API Ingress quanto para a API Gateway. O ASM também suporta ambas as APIs. Este exemplo utiliza a API Ingress.
-
Aguarde até que o Issuer esteja pronto. Execute o comando abaixo para verificar seu status.
kubectl -n istio-system get issuer letsencrypt-prod-issuerSaída esperada:
NAME READY AGE letsencrypt-prod-issuer True 8m3s
Etapa 3: Emitir um certificado
-
Use o KubeConfig do seu cluster de plano de dados para criar o recurso a seguir.
apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: istio-ingressgateway-certs namespace: istio-system spec: dnsNames: - ${YOUR_DOMAIN} # For example, test.com issuerRef: group: cert-manager.io kind: Issuer name: letsencrypt-prod-issuer secretName: istio-ingressgateway-certs -
Aguarde até que o Certificate esteja pronto. Verifique o status executando o comando abaixo.
kubectl -n istio-system get certificate istio-ingressgateway-certsSaída esperada:
NAME READY SECRET AGE istio-ingressgateway-certs True istio-ingressgateway-certs 59m
Processo de emissão do certificado
Após a criação do recurso Certificate, o cert-manager utiliza o Issuer especificado para emitir um certificado para o domínio. Nesse momento, o solucionador configurado é ativado.
O Let's Encrypt emprega um desafio HTTP-01 para confirmar que o servidor solicitante do certificado é proprietário do domínio. Para validar, o Let's Encrypt envia uma solicitação HTTP ao domínio e aguarda uma resposta válida. Neste exemplo, o gateway de entrada possui regras de roteamento apenas para a aplicação httpbin, sem configuração específica para o desafio. Será que o Let's Encrypt realmente envia uma solicitação de desafio? E como ela é respondida?
Execute o comando a seguir para inspecionar os logs do gateway e determinar se houve envio de uma solicitação de desafio pelo Let's Encrypt.
kubectl -n istio-system logs ${GATEWAY_POD_NAME} | grep letsencrypt | tail -1
Os logs indicam que o gateway recebeu e processou com êxito uma solicitação do Let's Encrypt. Como o Issuer foi configurado com uma ingressClassName igual a istio, o cert-manager cria automaticamente um recurso Ingress temporário com a mesma ingressClassName istio. Esse recurso Ingress encaminha a solicitação de desafio para o solucionador do cert-manager, que conclui a verificação.
Depois que o recurso Certificate estiver pronto, não será possível visualizar o recurso Ingress temporário ao executar kubectl -n istio-system get ingress. Isso ocorre porque o cert-manager exclui automaticamente os recursos relacionados ao solucionador, como Ingress, Service e Deployment, após a emissão bem-sucedida do certificado.
Etapa 4: Verificar o certificado
-
Crie o seguinte recurso Gateway para configurar o certificado gerado na Etapa 3 na porta 443 do gateway. Para mais detalhes, consulte Gerenciar gateways do Istio.
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: httpbin-https namespace: default spec: selector: istio: ingressgateway servers: - hosts: - ${YOUR_DOMAIN} port: name: https number: 443 protocol: HTTPS tls: credentialName: istio-ingressgateway-certs mode: SIMPLE -
Modifique o serviço virtual httpbin-vs existente conforme mostrado abaixo. Para mais informações, consulte Gerenciar serviços virtuais.
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: httpbin-vs namespace: default spec: gateways: - httpbin - httpbin-https # Add this line. hosts: - '*' http: - name: test route: - destination: host: httpbin.default.svc.cluster.local port: number: 8000 -
Acesse
https://${YOUR_DOMAIN}no seu navegador.Na barra de endereços do navegador, clique em no ícone de cadeado
. A mensagem Connection is secure será exibida, indicando que o navegador confia no certificado.