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: Jun 28, 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 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.

Nota

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

  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 Ingress com uma ingressClassName definida como istio. As etapas a seguir explicam o funcionamento desse solucionador.

    Nota

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

  2. Aguarde até que o Issuer esteja pronto. Execute o comando abaixo 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 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
  2. Aguarde até que o Certificate esteja pronto. Verifique o status executando o comando abaixo.

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

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"
}

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

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

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