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 Add a cluster to an ASM instance e Upgrade an ASM instance.
Um gateway de entrada implantado, com as portas 80 e 443 expostas. Para mais informações, consulte Create an ingress gateway.
A aplicação httpbin implantada no cluster associado à instância do ASM. Para mais informações, consulte Deploy the httpbin application.
O cert-manager instalado. Para mais informações, consulte Install cert-manager.
Suporte à API de Ingress ativado no gateway de entrada do ASM. Para mais informações, consulte Step 1: Enable Ingress API access.
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 comunicação segura com o servidor ACME. Certificados de CAs públicas como o Let's Encrypt são confiáveis por padrão na maioria dos navegadores web. Isso significa que, quando um usuário visita seu site, o navegador confia automaticamente no certificado SSL/TLS do site. A função principal de uma CA pública é provar ao navegador que o servidor é o proprietário legítimo do domínio. Para isso, a CA deve verificar se o solicitante realmente controla o domínio antes de emitir o certificado. Para mais informações sobre o protocolo ACME, consulte Automatic Certificate Management Environment.
Resolução de desafios
Um desafio é o método 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. Isso garante que apenas o proprietário legítimo de um domínio possa obter um certificado para ele, prevenindo falsificação de domínio e aumentando a segurança. O cert-manager suporta dois tipos principais de desafios: HTTP-01 e DNS-01.
O desafio HTTP-01 exige a comprovação de propriedade mediante a inserção de um arquivo com uma chave de validação em uma URL específica no seu servidor. Essa URL deve ser publicamente acessível e incluir o domínio para o qual você solicita o certificado. Quando o servidor ACME recupera a chave com sucesso nesse caminho, ele considera o domínio validado. Para simplificar, o cert-manager automatiza esse processo. Ao configurar um desafio HTTP-01, o cert-manager ajusta temporariamente os recursos de 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 necessária ao servidor ACME.
O desafio DNS-01 requer a prova de propriedade mediante a 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 pode verificar a propriedade do seu domínio executando uma consulta DNS. Se receber as permissões necessárias, o cert-manager poderá criar e enviar automaticamente o registro TXT necessário ao seu provedor de DNS para resolver o desafio DNS-01.
Em um ambiente 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, que funciona com base em um princípio semelhante.
Etapa 1: Preparar um domínio público
Para usar o Let's Encrypt na emissão de um certificado, é necessário um domínio público que aponte para o gateway de entrada do ASM. Para instruções específicas, consulte a documentação do seu provedor de DNS. Se você utilizar o Alibaba Cloud DNS, consulte Add DNS records. Para mais informações 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 de Ingress com umaingressClassNamedefinida comoistio. As etapas a seguir explicam o funcionamento desse solucionador.NotaO cert-manager suporta solucionadores tanto para a API de Ingress quanto para a API de Gateway. O ASM também oferece suporte a ambas as APIs. Este exemplo utiliza a API de Ingress.
-
Aguarde até que o Issuer esteja pronto. Execute o comando a seguir 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 seguinte recurso.
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. Execute o comando a seguir para verificar seu status.
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 de certificado
Após a criação do recurso Certificate, o cert-manager utiliza o Issuer especificado para emitir um certificado para o domínio. Durante esse processo, o solucionador configurado é ativado.
O Let's Encrypt usa um desafio HTTP-01 para confirmar que o servidor solicitante possui o domínio. Para isso, envia uma solicitação HTTP para o domínio e espera receber uma resposta válida para concluir a verificação. Neste exemplo, o gateway de entrada possui apenas regras de roteamento para a aplicação httpbin, sem configuração específica para o desafio. O Let's Encrypt realmente envia uma solicitação de desafio? Como ela é respondida?
Execute o comando a seguir para verificar os logs do gateway e determinar se o Let's Encrypt enviou uma solicitação de desafio.
kubectl -n istio-system logs ${GATEWAY_POD_NAME} | grep letsencrypt | tail -1
O log mostra que o gateway recebeu e processou com sucesso uma solicitação do Let's Encrypt. Como o Issuer foi configurado com uma ingressClassName definida como istio, o cert-manager cria automaticamente um recurso de Ingress temporário com a mesma ingressClassName istio. Esse recurso de 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 de 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 informações, consulte Manage Istio gateways.
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 virtual service httpbin-vs existente conforme mostrado abaixo. Para mais informações, consulte Manage virtual services.
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 -
No seu navegador, acesse
https://${YOUR_DOMAIN}.Na barra de endereços do navegador, clique em no ícone de cadeado
. A mensagem Connection is secure será exibida, indicando que seu navegador confia no certificado.