Automatizando a criação de certificados OpenSSL, a assinatura Let'sEncrypt e a associação do diretório do site, em um ambiente Nginx

3

Eu tenho um servidor Ubuntu 16.04 VPS e Nginx. Agora estou implementando o HTTP1 (sem TLS, utilizando a porta 80), mas desejo ir "um passo à frente" e trabalhar com HTTP2 (com TLS, utilizando a porta 443), para todos os meus sites (Wordpress).

Supondo que eu ajustei meu ambiente dessa maneira:

1. Firewall

ufw app list # Choose Nginx HTTPS

2. Blocos de servidores

Bloco de servidores padrão

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name server_domain_or_IP;
    return 302 https://$server_name$request_uri;
}

server {

    # SSL configuration

    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    include snippets/self-signed.conf;
    include snippets/ssl-params.conf;
}

Cada bloco de servidor do site

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    root /var/www/html/example.com;
    index index.php index.html index.htm index.nginx-debian.html;
    example.com www.example.com;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}

Agora preciso criar certificados OpenSSL, assiná-los com Let'sEncrypt e associá-los a cada diretório de site, respectivamente.

Minha pergunta:

Como a criação de certs OSSL, sinalização LE e associação SDIR podem ser feitas o mais automaticamente possível dentro do terminal? Claro que há uma parte em que preciso verificar um domínio do meu e-mail, mas além disso, AFAIU, tudo é feito a partir do terminal, portanto, pode ser totalmente automatizado.

Você pode compartilhar um exemplo de código de script Bash (ou uma utilização de um utilitário específico, talvez GNU make ), que ajuda a alcançar isso?

Notas

  1. Eu prefiro humildemente uma solução sem docker ( Eu leio aqui e as cabeceiras do fato de que tem a ver com a renovação, também parece implementar o docker que eu não tenho intenção de fazer por um pequeno servidor privado de menos de 10 sites pequenos, por meio do minimalismo).

  2. Eu entendo que criar, assinar e associar o site dir, requer um algoritmo diferente do que a renovação. Eu estou perguntando apenas sobre como criar, assinar e associar.

Por que eu mesmo faço essa pergunta:

Bom, eu só quero usar o HTTP2 no meu VPS mínimo autogerenciado (sem personalização de kernel / shell, sem compilações, quase sem utilitários contrib), e parece insano implementar manualmente esse algoritmo para muitos sites, ou cada vez que um novo site é adicionado.

    
por JohnDoea 05.08.2017 / 21:28

4 respostas

3

É fácil criar e atualizar os certificados Vamos codificar com dehydrated ( link ).

Você precisa adicionar /.well-known/acme-challenge/ location para cada site, pois o serviço Let's Encrypt examinará as respostas de desafio sob este local para confirmar que você é o proprietário dos sites para os quais você solicitou certificados:

location /.well-known/acme-challenge/ { allow all; root /st/hosting/hamilton/htdocs; } 

E use o mesmo caminho na configuração desidratada:

egrep -v "^#|^[[:space:]]*$" config                                          
WELLKNOWN="/st/hosting/hamilton/htdocs/.well-known/acme-challenge"
CONTACT_EMAIL=<you@email>

Depois disso, coloque todos os seus domínios em domain.txt file: em cada linha, o primeiro domínio será CommonName e os outros nomes serão AlternativeNames , por exemplo:

head -n1 domains.txt
hamilton.rinet.ru jenkins.hamilton.rinet.ru munin.hamilton.rinet.ru

Depois disso, você deve colocar dehydrated -c no cron e usar um script como este para instalar novos certificados gerados:

#!/bin/sh

CERTS_DIR=/usr/local/etc/dehydrated/certs
NGINX_SSL=/usr/local/etc/nginx/ssl
DOMAINS=$(awk '{ print $1 }' /usr/local/etc/dehydrated/domains.txt)

for d in $DOMAINS; do
  short_d=${d%%.rinet.ru}
  short_d=${short_d%%.ru}
  # short_d=${short_d##www.}
  cp -v ${CERTS_DIR}/$d/fullchain.pem ${NGINX_SSL}/${short_d}.crt
  cp -v ${CERTS_DIR}/$d/privkey.pem ${NGINX_SSL}/${short_d}.key
done

# Also update certs for Dovecot
cp -v ${CERTS_DIR}/hamilton.rinet.ru/fullchain.pem /usr/local/etc/dovecot/certs/certs/server.crt
cp -v ${CERTS_DIR}/hamilton.rinet.ru/privkey.pem /usr/local/etc/dovecot/certs/private/server.key
    
por 08.08.2017 / 07:14
2

Primeiramente, gostaria de verificar alguns dos clientes LetsEncrypt . Particularmente, os listados para o Nginx. Eu começaria lá antes de reinventar a roda, já que você originalmente queria usar certificados assinados pela LE.

Se, em vez disso, você quiser usar o OpenSSL para criar certificados autoassinados, poderá percorrer sua lista de nomes de domínio e executar openssl para cada domínio com um comando semelhante a:

openssl req -x509 -newkey rsa:2048 -keyout examplekey.pem -out examplecert.pem -nodes -days 365 -set_serial NNNNN -subj "/C=US/L=Any City/OU=FooBar Inc/CN=*.example.com"

É claro que, para cada domínio, você deseja alterar examplekey.pem , examplecert.pem e *.example.com . Substitua NNNNN por um número de série, incremento para cada iteração do loop.

Você deve ser capaz de escrever facilmente um script que faça um loop através dos nomes de domínio desejados e atualize os vários arquivos de configuração do Nginx.

    
por 08.08.2017 / 05:22
1

Eu vou adicionar acmetool ao anel de vamos criptografar clientes aqui, é simples assim que você conseguir alimentar os caminhos. acmetool want www.site1.org acmetool want www.site2.net etc Você tem que apontar o pedido acme para o lugar certo com um local {} bloco no nginx ... ele lida com as atualizações via cron, se quiser.

    
por 14.08.2017 / 10:42
0

Use certbot --nginx -d your.domain.name deve fazer o truque e o certbot deve atualizar automaticamente sua configuração do nginx

Ok, então, depois de ter sua configuração do Virtualhosts, você pode rodar em todos os domínios em que usará o comando ssl certbot --nginx -d your.domain.name , que fará algumas perguntas e gerará o arquivo de configuração apropriado. Ou você pode simplesmente executar certbot --nginx se você já tiver nomes de host no nginx. Incluirá automaticamente os arquivos de configuração para o nginx, o antigo será salvo como .old.

Você pode verificar este tutorial também: link Não esqueça de adicionar o crontab com o certbot --renew.

    
por 14.08.2017 / 10:32