nginx certificado certbot www e não www

1

Eu realmente não me dei conta de como criar certificados (funcionais) usando o certbot para o nginx.

Meus sites-ativados agora são assim:

Primeiro, um bloco para o domínio www com SSL. Todo o material SSL é criado pelo certbot.

server {
root …
index … 
server_name www.doman.com
listen 443 ssl;
ssl_certificate …
ssl_certificate_key …
include …
ssl_dhparam … 
}

Depois disso, um redirecionamento da porta 80 para a porta 443 para www e não www. A primeira parte - a instrução if - é criada pelo certbot e não por mim.

server {
if ($host = www.example.com {
    return 301 https://$host$request_uri;
    }

listen *:80;
server_name domain.com www.example.com;
return 301 https://www.example.com$request_uri;

}

E finalmente, um bloco para 443 sem www. Eu quero que isso redirecione para www.

server {
listen 443;
server_name www.domain.com
return 301 https://www.example.com$request_uri;
}

Isso funciona bem para o domínio com www. No entanto, sem www, eu recebo "este site não pode ser alcançado". Mesmo quando eu tento com http e não https.

Onde estou fodendo isso? Meu palpite é que o terceiro bloco, que usou 443 para não-www, também precisa de certificados SSL. Mas eu uso criação automática de certbots, e não adiciona nenhum.

    
por Mattis Erngren 09.02.2018 / 16:43

1 resposta

2

Eu não permito que o certbot crie minhas configurações de servidor web. Eu francamente não confio para acertar, já que ele já está fazendo algumas práticas pouco eficientes.

Então eu recebo certificados com certbot certonly --webroot -w /var/www -d domain -d domain ...

E a configuração do meu nginx fica assim (para um domínio de exemplo):

server {
    server_name www.yes-www.org yes-www.org;

    access_log off;

    include includes/listen-80;
    include includes/cloudflare;
    include includes/letsencrypt;

    return 301 https://$host$request_uri;
}

Para a porta 80, estou apenas exibindo nomes de host e redirecionando para https e www incondicionalmente.

server {
    server_name yes-www.org;

    access_log off;

    ssl_certificate /etc/letsencrypt/live/www.yes-www.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.yes-www.org/privkey.pem;

    include includes/listen-443;
    include includes/cloudflare;
    include includes/ssl;
    include includes/hsts;
    include includes/letsencrypt;

    return 301 https://www.yes-www.org$request_uri;
}

Para a porta 443, não-www, estou apenas redirecionando para www incondicionalmente.

server {
    server_name www.yes-www.org;

    root /srv/www/yes-www.org;

    access_log /var/log/nginx/yes-www.org-access.log nginx;
    access_log /var/log/nginx/cache.log cache;
    error_log /var/log/nginx/yes-www.org-error.log;

    ssl_certificate /etc/letsencrypt/live/www.yes-www.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.yes-www.org/privkey.pem;

    include includes/listen-443;
    include includes/cloudflare;
    include includes/letsencrypt;
    include includes/ssl;
    include includes/hsts;
    include includes/favicon;
    include includes/wordpress;
    include includes/php;
    include /srv/www/yes-www.org/nginx.conf;

    location ~ /\.(ht|git) {
        deny all;
    }
}

E finalmente aqui estou servindo um site.

Observe que o conteúdo de /etc/nginx/includes/letsencrypt é:

location /.well-known/acme-challenge/ {
    root /var/www;
    try_files $uri =404;
}

O que torna certbot certonly acima do trabalho.

    
por 09.02.2018 / 18:09