Skip to content

Instantly share code, notes, and snippets.

@gtitov
Last active February 21, 2022 12:03
Show Gist options
  • Select an option

  • Save gtitov/23e1b09c06e45bea66943b39c0c16eff to your computer and use it in GitHub Desktop.

Select an option

Save gtitov/23e1b09c06e45bea66943b39c0c16eff to your computer and use it in GitHub Desktop.
Настройка использования доменного имени и протокола HTTPS на nginx с использованием acme.sh

Использование доменного имени и протокола HTTPS

Предполагаем, что у нас есть доменное имя example.ru, наш email [email protected], имеющий права адиминистратора пользователь user. Сертификат может быть подключен только к доменному имени.

Подключение доменного имени

Предполагаем, что для доменного имени сделаны A Records, указывающие на IP сервера, на котором мы размещаем сайт.

Про работу с доменным именем для nginx можно почитать тут

Обычно для работы с веб используют специального пользователя www-data. Про образцовую работу с пользователями можно посмотреть тут

Создаём папку под сайт с доменным именем. Даём пользователю права на полное использование папки, проверяем их присвоение, создаём тестовый index.html.

Неважно будем ли размещать итоговый сайт именно в этой папке: она нужна для описываемого способа получения сертификата.

sudo mkdir -p /var/www/example.ru/html
sudo chown -R user:user /var/www/example.ru/html
sudo chmod -R g+rw /var/www/example.ru/html
ls -la /var/www/example.ru/html
nano /var/www/example.ru/html/index.html

Создаём конфигурационный файл nginx для сайта.

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.ru
sudo nano /etc/nginx/sites-available/example.ru

Его содержание должно быть похоже на то, что приведено ниже

server {
        listen 80;
        listen [::]:80;

        root /var/www/example.ru/html;

        # Add index.php to the list if you are using PHP
        index index.html;

        server_name example.ru www.example.ru;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }
}

Если подключится к сайту не получится, стоит проверить фаервол sudo ufw status и убедиться, что нужные порты открыты

sudo ln -s /etc/nginx/sites-available/example.ru /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
sudo systemctl status nginx 

Проверяем подключение к сайту, переходя по доменному имени в браузере. В данном примере перейти нужно было бы по http://example.ru

Установка программы для получения сертификата

Про установку см. тут

Из домашней папки выполнить

curl https://get.acme.sh | sh -s [email protected]

Чтобы заработала команда acme.sh, надо открыть терминал заново.

Запрос сертификата

Про получение сертификата тут

Предполагается, что уже работает веб-сервер (например, Apache или nginx) и по 80 порту отдаёт данные, например, из /var/www/html

В конфигурационном файле сервера данные должны отдаваться через указанную в запросе ниже папку

У пользователя, который запрашивает сертификат, должны быть права на запись в папку! sudo chown -R user:user /var/www/example.ru/html && sudo chmod -R g+rw /var/www/example.ru/html

acme.sh --issue -d example.ru -d www.example.ru -w /var/www/example.ru/html

Должны получить вот такое окончание

[Fri 27 Aug 2021 10:43:21 AM BST] Your cert is in: /root/.acme.sh/example.ru/example.ru.cer
[Fri 27 Aug 2021 10:43:21 AM BST] Your cert key is in: /root/.acme.sh/example.ru/example.ru.key
[Fri 27 Aug 2021 10:43:21 AM BST] The intermediate CA cert is in: /root/.acme.sh/example.ru/ca.cer
[Fri 27 Aug 2021 10:43:21 AM BST] And the full chain certs is there: /root/.acme.sh/example.ru/fullchain.cer

Установка сертификата на nginx

Про установку сертификата на nginx тут

Про Apache тут

Создадим папку для сертификата и переместим его туда

mkdir /etc/nginx/ssl
mkdir /etc/nginx/ssl/example.ru
sudo chown -R user:user /etc/nginx/ssl/example.ru/
sudo chmod -R g+rw /etc/nginx/ssl/example.ru/
# не уверен насчёт `sudo` в `sudo service nginx force-reload`
acme.sh --install-cert -d example.ru -d www.example.ru --key-file /etc/nginx/ssl/example.ru/example.ru.key --fullchain-file /etc/nginx/ssl/example.ru/example.ru.fullchain --cert-file /etc/nginx/ssl/example.ru/example.ru.cer --reloadcmd "sudo service nginx force-reload"

Открываем конфигурационный файл sudo nano /etc/nginx/sites-available/example.ru и делаем его похожим на это.

server {
        listen 80;
        listen [::]:80;

        listen 443 ssl;
        listen [::]:443 ssl;
        ssl_certificate /etc/nginx/ssl/example.ru/example.ru.cer;
        ssl_certificate_key /etc/nginx/ssl/example.ru/example.ru.key;

        root /var/www/example.ru/html;

        # Add index.php to the list if you are using PHP
        index index.html;

        server_name example.ru www.example.ru;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }
}

Проверяем корректность конфигурации.

sudo nginx -t
sudo systemctl restart nginx
sudo systemctl status nginx
sudo ufw allow 'Nginx Full'

Теперь при обращении по доменному имени можно использовать протокол HTTPS. В данном примере перейти нужно было бы по https://example.ru

Перенаправление HTTP трафика на HTTPS

Подробнее про редирект с HTTP на HTTPS тут

HTTP-прокотол теперь можно не использовать для обращения к сайту по доменному имени. Перенаправим запросы по HTTP на HTTPS. Открываем конфигурационный файл sudo nano /etc/nginx/sites-available/example.ru и делаем его похожим на это.

server {
        listen 80;
        listen [::]:80;
        server_name example.ru www.example.ru;
        return 301 https://$server_name$request_uri;

}

server {
        listen 443 ssl;
        listen [::]:443 ssl;
        ssl_certificate /etc/nginx/ssl/example.ru/example.ru.fullchain; # exactly fullchain!
        ssl_certificate_key /etc/nginx/ssl/example.ru/example.ru.key;

        server_name example.ru www.example.ru;

        root /var/www/example.ru/html;

        # Add index.php to the list if you are using PHP
        index index.html;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }
}

Проверяем корректность конфигурации.

sudo nginx -t
sudo systemctl restart nginx
sudo systemctl status nginx

Теперь при обращении по доменному имени по протоколу HTTP запрос будет перенаправляться на HTTPS. В данном примере при переходе на http://example.ru открылась бы страница https://example.ru

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment