Azure Traffic Manager + Azure App Services + Let's Encrypt - Gerando Certificados SSL Gratuitos

Azure Traffic Manager + Azure App Services + Let's Encrypt - Gerando Certificados SSL Gratuitos

Olá PessoALL,

Tempinho que eu não escrevo por aqui né? As coisas tem andado um pouco corridas (mas em um bom sentido), peço desculpas pela ausência e acredito que no decorrer das próximas semanas voltarei a rotina normal de escrever para o blog e gravar tutorias para o canal do youtube.

O tutorial de hoje é um daqueles artigos que eu escrevo para poder me lembrar em um futuro de como eu resolvi um problema (rsrsrs) e compartilhar com vocês uma forma simples.

Para quem tem visto minhas palestras, eu tenho falado um um pouco sobre disaster recovery em APIs e tive um problema sério em um cliente pela falta de não ter redundância, uma forma simples de resolver isso é usando o [Azure Traffic Manager](https://azure.microsoft.com/pt-br/services/traffic-manager/).

Se você gostaria de saber mais sobre como usar o Azure Traffic Manager, pode assistir minha palestra no Azure Tech Nights.

Cenário

Eu tenho um setup bem simples, um traffic manager configurado para performance (quem responde ao ping mais rápido) com 2 endpoints, 1 em cada costa dos EUA.
O meu "problema" é que o traffic manager só fornece trafego http e nós gastariamos que todas as requisições fossem feitas via https.

Nós poderíamos usar um domínio customizado que tivesse o redirecionamento para o traffic manager e até encorajo que vocês façam isso, mas nesse caso de ser uma api de uso interno, nós decidimos usar o próprio endereço do traffic manager.

Gerando o certificado SSL gratuito

Para gerar o certificado estou utilizando a api da [Let's Encrypt](https://letsencrypt.org/) que é gratuito, inclusive se você precisar de certificados wildcard.

Estou usando a ferramenta indicada por eles chamada `certbot`, essa ferramenta é feita para UNIX, se voce tiver no windows recomendo que use o WSL ou tenha um container para executar os comandos.
Eu tenho um container UBUNTU que uso para propósitos gerais e é como vou executar os comandos desse tutorial.

Chega de papo e vamos lá:

Para gerar o certificado use o seguinte comando: `certbot certonly --manual` e siga os passos.

Requisitando um novo certificado

Observe que para validar a propriedade do domínio ou que o domínio aponta para um servidor que você tem controle o robô pede que você sirva um arquivo de uma url que ele determina, que vai seguir o seguinte padrão: `http://seudominio/.well-known/acme-challenge/stringDeValidacao`

Normalmente seria só criar os arquivos no servidor e servir o valor esperado pelo robô, mas se você esta usando IIS, por padrão ele não reconhece arquivos sem extensão.
Se esse for o seu caso, siga os seguinte passos:

1- Crie a estrutura de pastas `.well-known/acme-challenge`

Estrutura de pastas

2 - Crie um arquivo web.config dentro da pasta acme-challenge

Crie um arquivo `web.config` para habilitar arquivos sem extensão e o módulo de arquivos estáticos.

<?xml version="1.0" encoding="UTF-8"?>
  <configuration>
   <system.webServer>
     <staticContent>
         <mimeMap fileExtension="." mimeType="text/plain" />
     </staticContent>
     <handlers>
         <clear />
         <add name="StaticFile" path="*" verb="*" type=""
                 modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule"
                 scriptProcessor="" resourceType="Either" requireAccess="Read"
                 allowPathInfo="false" preCondition="" responseBufferLimit="4194304" />
     </handlers>
    <rewrite>
        <rules>
            <clear />
        </rules>
    </rewrite>
  </system.webServer>
</configuration>

Agora que temos as configurações necessárias, execute o comando `certbot certonly --manual` novamente e edite o arquivo com os valores esperados.

Certificado gerado

Importando o certificado no Azure App Service

Com nosso certificado gerado, agora precisamos importá-lo no nosso app service. Observe que os certificados gerados pelo certbot estão no formato .pem e no azure precisamos dos certificados no formato .pfx

Para exportar o certificado vamos utilizar a ferramenta openssl que ja vem instalada na maioria das distribuições linux e no macOs.

`openssl pkcs12 -export -out dominio.com.pfx -inkey /etc/letsencrypt/live/dominio.com/privkey.pem -in /etc/letsencrypt/live/dominio.com/fullchain.pem`

Com isso teremos nosso certificado exportado, se você assim como eu usa um container para executar os comandos, para copiar o arquivo para o host utilize o comando `docker cp`.

`docker cp container-id:/certificates/dominio.com.pfx .`

Agora basta localizar o app service desejado e fazer o import do certificado

Por hoje é só \o/
Espero que essa dica tenha sido útil.

[]s e até a próxima.