Todos os produtos
Search
Central de documentação

Alibaba Cloud Service Mesh:Emitir um certificado para um gateway de entrada do ASM

Última atualização: Sep 12, 2026

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

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.

Nota

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

  1. 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: istio

    O recurso Issuer acima especifica um solucionador http01 que usa a API de Ingress com uma ingressClassName definida como istio. As etapas a seguir explicam o funcionamento desse solucionador.

    Nota

    O 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.

  2. Aguarde até que o Issuer esteja pronto. Execute o comando a seguir para verificar seu status.

    kubectl -n istio-system get issuer letsencrypt-prod-issuer

    Saída esperada:

    NAME                      READY   AGE
    letsencrypt-prod-issuer   True    8m3s

Etapa 3: Emitir um certificado

  1. 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
  2. Aguarde até que o Certificate esteja pronto. Execute o comando a seguir para verificar seu status.

    kubectl -n istio-system get certificate istio-ingressgateway-certs

    Saí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

Show the expected output

{
    "authority_for": "xxxxxxx",
    "bytes_received": "0",
    "bytes_sent": "87",
    "downstream_local_address": "xx.xx.xx.xx:80",
    "downstream_remote_address": "xx.xx.xx.xx:57101",
    "duration": "0",
    "istio_policy_status": "-",
    "method": "GET",
    "path": "/.well-known/acme-challenge/JfKvfdSNmkR7UqmCQU0OSkJC3EsnP4ZUiCc28OLLLxA",
    "protocol": "HTTP/1.1",
    "request_id": "e6806d08-0469-4383-be8e-4d7506b39ec5",
    "requested_server_name": "-",
    "response_code": "200",
    "response_flags": "-",
    "route_name": "-",
    "start_time": "2024-04-08T12:04:06.153Z",
    "trace_id": "-",
    "upstream_cluster": "outbound|8089||cm-acme-http-solver-c4ch9.istio-system.svc.cluster.local",
    "upstream_host": "xx.xx.xx.xx:8089",
    "upstream_local_address": "xx.xx.xx.xx:55886",
    "upstream_response_time": "0",
    "upstream_service_time": "0",
    "upstream_transport_failure_reason": "-",
    "user_agent": "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)",
    "x_forwarded_for": "xx.xx.xx.xx"
}

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

  1. 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
  2. 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
  3. No seu navegador, acesse https://${YOUR_DOMAIN}.

    Na barra de endereços do navegador, clique em no ícone de cadeado image. A mensagem Connection is secure será exibida, indicando que seu navegador confia no certificado.