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

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:
- Criando registros DNS manualmente (a atualização automática não é suportada)
- Criando registros DNS usando o servidor acme-dns (mais detalhes podem ser encontrados aqui .
- 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.

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

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

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.