Rumo à automação SSL

Muitas vezes, temos que trabalhar com certificados SSL. Vamos relembrar o processo de criação e instalação de um certificado (no caso geral para a maioria).


  • Encontre um provedor (um site no qual podemos comprar SSL).
  • Gere CSR.
  • Envie para o seu provedor.
  • Verifique a propriedade do domínio.
  • Obter um certificado.
  • Converta o certificado no formulário desejado (opcional). Por exemplo, de pem para PKCS # 12.
  • Instale o certificado no servidor web.

Relativamente rápido, não complicado e compreensível. Essa opção é bastante adequada se tivermos no máximo uma dúzia de projetos. E se houver mais, e eles tiverem pelo menos três ambientes? Desenvolvimento clássico - preparação - produção. Nesse caso, você deve pensar em automatizar esse processo. Sugiro que você mergulhe mais fundo no problema e encontre uma solução que minimize o tempo necessário para criar e manter certificados no futuro. O artigo apresentará uma análise do problema e um pequeno guia para repetição.


Farei uma reserva com antecedência: a principal especialização de nossa empresa é .net e, consequentemente, IIS e outros Windows resultantes. Portanto, o cliente ACME e todas as ações para ele também serão descritos em termos de uso do Windows.


Para quem isso é relevante e alguns dados de origem


Empresa K representada pelo autor. URL (por exemplo): company.tld


O Projeto X é um dos nossos projetos, com o qual cheguei à conclusão de que, mesmo assim, é necessário avançar para a máxima economia de tempo ao trabalhar com certificados. Este projeto possui quatro ambientes: desenvolvedor, teste, preparo e produção. O desenvolvedor e o teste estão do nosso lado, a preparação e a produção estão do lado do cliente.


Uma característica do projeto é que ele possui um grande número de módulos disponíveis como subdomínios.


Ou seja, temos a seguinte imagem:


DevTesteEstadiamentoProdução
projectX.dev.company.tldprojectX.test.company.tldstaging.projectX.tldprojectX.tld
module1.projectX.dev.company.tldmodule1.projectX.test.company.tldmodule1.staging.projectX.tldmodule1.projectX.tld
module2.projectX.dev.company.tldmodule2.projectX.test.company.tldmodule2.staging.projectX.tldmodule2.projectX.tld
............
moduleN.projectX.dev.company.tldmoduleN.projectX.test.company.tldmoduleN.staging.projectX.tldmoduleN.projectX.tld

Para produção, o certificado curinga adquirido é usado, não há perguntas. Mas abrange apenas o primeiro nível do subdomínio. Portanto, se houver um certificado para * .projectX.tld - ele funcionará para staging.projectX.tld, mas para o module1.staging.projectX.tld, ele já não possui. Mas não tenho vontade de comprar uma em separado.


E este é apenas um exemplo de um projeto de uma empresa. E o projeto, é claro, não é um.


Os motivos comuns para todos resolverem esse problema são mais ou menos assim:


  • Mais recentemente, o Google propôs reduzir o período máximo de validade dos certificados SSL . Com todas as consequências.
  • Facilitar o processo de emissão e manutenção de SSL para as necessidades internas dos projetos e da empresa como um todo.
  • Armazenamento centralizado de registros de certificado, que resolve parcialmente o problema de verificação de domínio usando DNS e atualizações automáticas subseqüentes, além de resolver o problema de confiança do cliente. No entanto, o CNAME causa mais confiança no servidor da empresa parceira / contratada do que em um recurso de terceiros.
  • Bem, finalmente, neste caso, a frase “é melhor ter do que não ter” se encaixa perfeitamente.

Escolhendo um provedor SSL e etapas preparatórias


Das opções disponíveis para certificados SSL gratuitos, cloudflare e letsencrypt foram considerados. O DNS para este (e alguns outros projetos) está hospedado no cloudflare, mas não sou fã de usar seus certificados. Portanto, foi decidido usar o letsencrypt.
Para criar um certificado SSL curinga, você deve confirmar a propriedade do domínio. Este procedimento envolve a criação de algum registro DNS (TXT ou CNAME), com a verificação subsequente ao emitir um certificado. O Linux possui um utilitário chamado certbot , que permite automatizar parcialmente (ou completamente para alguns provedores de DNS) esse processo. Para o Windows, das opções de cliente ACME encontradas e testadas , optei pelo WinACME .


E o registro para o domínio é criado, vá para a criação do certificado:


imagem


Estamos interessados ​​na última conclusão, a saber, as opções disponíveis para verificar a propriedade do domínio para emitir um certificado curinga:


  1. Criando registros DNS manualmente (a atualização automática não é suportada)
  2. Criando registros DNS usando o servidor acme-dns (mais detalhes podem ser encontrados aqui .
  3. Criando registros DNS usando seu próprio script (analógico do plugin cloudflare para certbot).

À primeira vista, o terceiro ponto é bastante adequado, mas se o provedor de DNS não suportar essa funcionalidade? E precisamos de um caso geral. E o caso geral é de registros CNAME, todos eles os suportam. Portanto, paramos no ponto 2 e vamos configurar nosso servidor DNS ACME.


Configurando o servidor ACME-DNS e o processo de emissão de certificado


Por exemplo, criei o domínio 2nd.pp.ua e no futuro o usarei.


Um pré-requisito para a operação correta do servidor é a criação de registros NS e A para seu domínio. E o primeiro momento desagradável que me deparei - o cloudflare (pelo menos no modo de uso gratuito) não permite criar simultaneamente um registro NS e A para o mesmo host. Não que isso fosse um problema, mas no bind é possível. O suporte respondeu que o painel deles não permite isso. Não importa, crie duas entradas:


acmens.2nd.pp.ua. IN A 35.237.128.147 acme.2nd.pp.ua. IN NS acmens.2nd.pp.ua. 

Nesse estágio, o host acmens.2nd.pp.ua deve ser resolvido.


 $ ping acmens.2nd.pp.ua PING acmens.2nd.pp.ua (35.237.128.147) 56(84) bytes of data 

Mas acme.2nd.pp.ua não será resolvido, pois o servidor DNS que o serve ainda não está em execução.


Os registros são criados, vá para configurar e executar o servidor DNS do ACME. Vou colocá-lo no servidor ubuntu no contêiner do docker , mas você pode executá-lo onde houver golang. O Windows também está bom, mas ainda prefiro um servidor Linux.


Crie os diretórios e arquivos necessários:


 $ mkdir config $ mkdir data $ touch config/config.cfg 

Aproveite vim seu editor de texto favorito e insira uma configuração de amostra no config.cfg.


Para ter sucesso, basta ajustar as seções geral e api:


 [general] listen = "0.0.0.0:53" protocol = "both" domain = "acme.2nd.pp.ua" nsname = "acmens.2nd.pp.ua" nsadmin = "admin.2nd.pp.ua" records = "acme.2nd.pp.ua. A 35.237.128.147", "acme.2nd.pp.ua. NS acmens.2nd.pp.ua.", ] ... [api] ... tls = "letsencrypt" … 

Além disso, se desejado, crie um arquivo de composição de encaixe no diretório principal do serviço:


 version: '3.7' services: acmedns: image: joohoi/acme-dns:latest ports: - "443:443" - "53:53" - "53:53/udp" - "80:80" volumes: - ./config:/etc/acme-dns:ro - ./data:/var/lib/acme-dns 

Feito. Você pode correr.


 $ docker-compose up -d 

Nesse estágio, o host acme.2nd.pp.ua deve começar a ser acme.2nd.pp.ua e 404 deve aparecer em https://acme.2nd.pp.ua


 $ ping acme.2nd.pp.ua PING acme.2nd.pp.ua (35.237.128.147) 56(84) bytes of data. $ curl https://acme.2nd.pp.ua 404 page not found 

Se isso não aparecer - o docker logs -f <container_name> no auxílio, felizmente, os logs são bastante legíveis.


Podemos começar a criar um certificado. Abra o powershell como administrador e execute o winacme. Estamos interessados ​​na eleição:


  • M: Criar novo certificado (opções completas)
  • 2: Entrada manual
  • 2: [dns-01] Crie registros de verificação com o acme-dns ( https://github.com/joohoi/acme-dns )
  • Quando perguntados sobre o link para o servidor DNS do ACME, inserimos a URL do servidor criado (https) em resposta. URL do servidor acme-dns: https://acme.2nd.pp.ua

No servidor, o cliente emite uma entrada que deve ser adicionada ao servidor DNS existente (procedimento único):


 [INFO] Creating new acme-dns registration for domain 1nd.pp.ua Domain: 1nd.pp.ua Record: _acme-challenge.1nd.pp.ua Type: CNAME Content: c82a88a5-499f-464f-96e4-be7f606a3b47.acme.2nd.pp.ua. Note: Some DNS control panels add the final dot automatically. Only one is required. 

imagem


Criamos o registro necessário e verifique se ele foi criado corretamente:


imagem


 $ dig CNAME _acme-challenge.1nd.pp.ua +short c82a88a5-499f-464f-96e4-be7f606a3b47.acme.2nd.pp.ua. 

Confirmamos que criamos a entrada necessária no winacme e continuamos o processo de criação do certificado:


imagem


Como usar o certbot como cliente é descrito aqui .


Isso conclui o processo de criação de um certificado, você pode instalá-lo em um servidor web e usá-lo. Se, ao criar um certificado, também for criada uma tarefa no agendador, no futuro o processo de renovação do certificado ocorrerá automaticamente.

Source: https://habr.com/ru/post/pt483770/


All Articles