Назад | Перейти на главную страницу

Сертификат nginx certbot с www и без www

Я не особо разбирался в том, как создавать (рабочие) сертификаты с помощью certbot для nginx.

Мои сайты-включения теперь выглядят так:

Во-первых, блокировка домена www с SSL. Все материалы SSL созданы certbot.

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

После этого выполняется перенаправление с порта 80 на порт 443 как для www, так и без www. Первая часть - оператор if - создана certbot, а не мной.

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;

}

И, наконец, блок для 443 без www. Я хочу, чтобы это перенаправляло на www.

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

Это хорошо работает для домена с www. Однако без www я получаю «этот сайт недоступен». Даже когда я пробую использовать http, а не https.

Где я это делаю? Я предполагаю, что третий блок, который использовал 443 для не-www, также требует сертификатов SSL. Но я использую автоматическое создание certbots, и он ничего не добавляет.

Я не разрешаю certbot создавать конфигурации моего веб-сервера. Честно говоря, я не верю, что он все сделает правильно, поскольку он уже выполняет некоторые не очень эффективные практики.

Так что я получаю сертификаты с certbot certonly --webroot -w /var/www -d hostname -d hostname ...

И моя конфигурация nginx выглядит так (для одного примера домена):

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

    access_log off;

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

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

Для порта 80 я просто обслуживаю оба имени хоста и безоговорочно перенаправляю на https и www.

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;

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

Для порта 443 без www я просто перенаправляюсь на www безоговорочно.

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;
    }
}

И, наконец, я обслуживаю веб-сайт.

Обратите внимание, что содержимое /etc/nginx/includes/letsencrypt являются:

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

Что делает certbot certonly как указано выше.