Skip to content

Instantly share code, notes, and snippets.

@gtitov
Last active February 21, 2022 12:03
Show Gist options
  • Save gtitov/23e1b09c06e45bea66943b39c0c16eff to your computer and use it in GitHub Desktop.
Save gtitov/23e1b09c06e45bea66943b39c0c16eff to your computer and use it in GitHub Desktop.

Revisions

  1. gtitov revised this gist Feb 21, 2022. 1 changed file with 2 additions and 0 deletions.
    2 changes: 2 additions & 0 deletions https.md
    Original file line number Diff line number Diff line change
    @@ -85,6 +85,8 @@ curl https://get.acme.sh | sh -s [email protected]
    > В конфигурационном файле сервера данные должны отдаваться через указанную в запросе ниже папку
    > У пользователя, который запрашивает сертификат, должны быть права на запись в папку! `sudo chown -R user:user /var/www/example.ru/html && sudo chmod -R g+rw /var/www/example.ru/html`
    ```bash
    acme.sh --issue -d example.ru -d www.example.ru -w /var/www/example.ru/html
    ```
  2. gtitov revised this gist Oct 19, 2021. 1 changed file with 2 additions and 0 deletions.
    2 changes: 2 additions & 0 deletions https.md
    Original file line number Diff line number Diff line change
    @@ -83,6 +83,8 @@ curl https://get.acme.sh | sh -s [email protected]

    > Предполагается, что уже работает веб-сервер (например, Apache или nginx) и по 80 порту отдаёт данные, например, из `/var/www/html`
    > В конфигурационном файле сервера данные должны отдаваться через указанную в запросе ниже папку
    ```bash
    acme.sh --issue -d example.ru -d www.example.ru -w /var/www/example.ru/html
    ```
  3. gtitov revised this gist Sep 1, 2021. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion https.md
    Original file line number Diff line number Diff line change
    @@ -171,7 +171,7 @@ server {
    server {
    listen 443 ssl;
    listen [::]:443 ssl;
    ssl_certificate /etc/nginx/ssl/example.ru/example.ru.cer;
    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;
  4. gtitov revised this gist Aug 27, 2021. 1 changed file with 34 additions and 34 deletions.
    68 changes: 34 additions & 34 deletions https.md
    Original file line number Diff line number Diff line change
    @@ -1,6 +1,6 @@
    # Использование доменного имени и протокола HTTPS

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

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

    @@ -15,18 +15,18 @@
    > Неважно будем ли размещать итоговый сайт именно в этой папке: она нужна для описываемого способа получения сертификата.
    ```bash
    sudo mkdir -p /var/www/mydomain.ru/html
    sudo chown -R user:user /var/www/mydomain.ru/html
    sudo chmod -R g+rw /var/www/mydomain.ru/html
    ls -la /var/www/mydomain.ru/html
    nano /var/www/mydomain.ru/html/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 для сайта.

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

    Его содержание должно быть похоже на то, что приведено ниже
    @@ -36,12 +36,12 @@ server {
    listen 80;
    listen [::]:80;
    root /var/www/mydomain.ru/html;
    root /var/www/example.ru/html;
    # Add index.php to the list if you are using PHP
    index index.html;
    server_name mydomain.ru www.mydomain.ru;
    server_name example.ru www.example.ru;
    location / {
    # First attempt to serve request as file, then
    @@ -55,13 +55,13 @@ server {
    > Если подключится к сайту не получится, стоит проверить фаервол `sudo ufw status` и убедиться, что нужные порты открыты
    ```bash
    sudo ln -s /etc/nginx/sites-available/mydomain.ru /etc/nginx/sites-enabled/
    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://mydomain.ru
    Проверяем подключение к сайту, переходя по доменному имени в браузере. В данном примере перейти нужно было бы по http://example.ru


    ## Установка программы для получения сертификата
    @@ -84,16 +84,16 @@ curl https://get.acme.sh | sh -s [email protected]
    > Предполагается, что уже работает веб-сервер (например, Apache или nginx) и по 80 порту отдаёт данные, например, из `/var/www/html`
    ```bash
    acme.sh --issue -d mydomain.ru -d www.mydomain.ru -w /var/www/mydomain.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/mydomain.ru/mydomain.ru.cer
    [Fri 27 Aug 2021 10:43:21 AM BST] Your cert key is in: /root/.acme.sh/mydomain.ru/mydomain.ru.key
    [Fri 27 Aug 2021 10:43:21 AM BST] The intermediate CA cert is in: /root/.acme.sh/mydomain.ru/ca.cer
    [Fri 27 Aug 2021 10:43:21 AM BST] And the full chain certs is there: /root/.acme.sh/mydomain.ru/fullchain.cer
    [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
    ```


    @@ -107,14 +107,14 @@ acme.sh --issue -d mydomain.ru -d www.mydomain.ru -w /var/www/mydomain.ru/html

    ```bash
    mkdir /etc/nginx/ssl
    mkdir /etc/nginx/ssl/mydomain.ru
    sudo chown -R user:user /etc/nginx/ssl/mydomain.ru/
    sudo chmod -R g+rw /etc/nginx/ssl/mydomain.ru/
    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 mydomain.ru -d www.mydomain.ru --key-file /etc/nginx/ssl/mydomain.ru/mydomain.ru.key --fullchain-file /etc/nginx/ssl/mydomain.ru/mydomain.ru.fullchain --cert-file /etc/nginx/ssl/mydomain.ru/mydomain.ru.cer --reloadcmd "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/mydomain.ru` и делаем его похожим на это.
    Открываем конфигурационный файл `sudo nano /etc/nginx/sites-available/example.ru` и делаем его похожим на это.

    ```
    server {
    @@ -123,15 +123,15 @@ server {
    listen 443 ssl;
    listen [::]:443 ssl;
    ssl_certificate /etc/nginx/ssl/mydomain.ru/mydomain.ru.cer;
    ssl_certificate_key /etc/nginx/ssl/mydomain.ru/mydomain.ru.key;
    ssl_certificate /etc/nginx/ssl/example.ru/example.ru.cer;
    ssl_certificate_key /etc/nginx/ssl/example.ru/example.ru.key;
    root /var/www/mydomain.ru/html;
    root /var/www/example.ru/html;
    # Add index.php to the list if you are using PHP
    index index.html;
    server_name mydomain.ru www.mydomain.ru;
    server_name example.ru www.example.ru;
    location / {
    # First attempt to serve request as file, then
    @@ -150,33 +150,33 @@ sudo systemctl status nginx
    sudo ufw allow 'Nginx Full'
    ```

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

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


    Подробнее про редирект с HTTP на HTTPS [тут](https://serverfault.com/questions/67316/in-nginx-how-can-i-rewrite-all-http-requests-to-https-while-maintaining-sub-dom)

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

    ```
    server {
    listen 80;
    listen [::]:80;
    server_name mydomain.ru www.mydomain.ru;
    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/mydomain.ru/mydomain.ru.cer;
    ssl_certificate_key /etc/nginx/ssl/mydomain.ru/mydomain.ru.key;
    ssl_certificate /etc/nginx/ssl/example.ru/example.ru.cer;
    ssl_certificate_key /etc/nginx/ssl/example.ru/example.ru.key;
    server_name mydomain.ru www.mydomain.ru;
    server_name example.ru www.example.ru;
    root /var/www/mydomain.ru/html;
    root /var/www/example.ru/html;
    # Add index.php to the list if you are using PHP
    index index.html;
    @@ -196,4 +196,4 @@ sudo nginx -t
    sudo systemctl restart nginx
    sudo systemctl status nginx
    ```
    Теперь при обращении по доменному имени по протоколу HTTP запрос будет перенаправляться на HTTPS. В данном примере при переходе на http://mydomain.ru открылась бы страница https://mydomain.ru
    Теперь при обращении по доменному имени по протоколу HTTP запрос будет перенаправляться на HTTPS. В данном примере при переходе на http://example.ru открылась бы страница https://example.ru
  5. gtitov created this gist Aug 27, 2021.
    199 changes: 199 additions & 0 deletions https.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,199 @@
    # Использование доменного имени и протокола HTTPS

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

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

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

    Про работу с доменным именем для nginx можно почитать [тут](https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-server-blocks-virtual-hosts-on-ubuntu-16-04)

    > Обычно для работы с веб используют специального пользователя `www-data`. Про образцовую работу с пользователями можно посмотреть [тут](https://decovar.dev/blog/2021/04/05/acme-sh-instead-of-certbot/)
    Создаём папку под сайт с доменным именем. Даём пользователю права на полное использование папки, проверяем их присвоение, создаём тестовый `index.html`.

    > Неважно будем ли размещать итоговый сайт именно в этой папке: она нужна для описываемого способа получения сертификата.
    ```bash
    sudo mkdir -p /var/www/mydomain.ru/html
    sudo chown -R user:user /var/www/mydomain.ru/html
    sudo chmod -R g+rw /var/www/mydomain.ru/html
    ls -la /var/www/mydomain.ru/html
    nano /var/www/mydomain.ru/html/index.html
    ```

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

    ```bash
    sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/mydomain.ru
    sudo nano /etc/nginx/sites-available/mydomain.ru
    ```

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

    ```
    server {
    listen 80;
    listen [::]:80;
    root /var/www/mydomain.ru/html;
    # Add index.php to the list if you are using PHP
    index index.html;
    server_name mydomain.ru www.mydomain.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` и убедиться, что нужные порты открыты
    ```bash
    sudo ln -s /etc/nginx/sites-available/mydomain.ru /etc/nginx/sites-enabled/
    sudo nginx -t
    sudo systemctl restart nginx
    sudo systemctl status nginx
    ```

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


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

    Про установку см. [тут](https://github.com/acmesh-official/acme.sh/wiki/How-to-install)

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

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

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


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

    Про получение сертификата [тут](https://github.com/acmesh-official/acme.sh/wiki/How-to-issue-a-cert)

    > Предполагается, что уже работает веб-сервер (например, Apache или nginx) и по 80 порту отдаёт данные, например, из `/var/www/html`
    ```bash
    acme.sh --issue -d mydomain.ru -d www.mydomain.ru -w /var/www/mydomain.ru/html
    ```

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

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


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

    Про установку сертификата на nginx [тут](https://github.com/acmesh-official/acme.sh#3-install-the-cert-to-apachenginx-etc)

    > Про Apache [тут](https://github.com/acmesh-official/acme.sh/wiki/Deploy-ssl-certs-to-apache-server)
    Создадим папку для сертификата и переместим его туда

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

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

    ```
    server {
    listen 80;
    listen [::]:80;
    listen 443 ssl;
    listen [::]:443 ssl;
    ssl_certificate /etc/nginx/ssl/mydomain.ru/mydomain.ru.cer;
    ssl_certificate_key /etc/nginx/ssl/mydomain.ru/mydomain.ru.key;
    root /var/www/mydomain.ru/html;
    # Add index.php to the list if you are using PHP
    index index.html;
    server_name mydomain.ru www.mydomain.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://mydomain.ru

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


    Подробнее про редирект с HTTP на HTTPS [тут](https://serverfault.com/questions/67316/in-nginx-how-can-i-rewrite-all-http-requests-to-https-while-maintaining-sub-dom)

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

    ```
    server {
    listen 80;
    listen [::]:80;
    server_name mydomain.ru www.mydomain.ru;
    return 301 https://$server_name$request_uri;
    }
    server {
    listen 443 ssl;
    listen [::]:443 ssl;
    ssl_certificate /etc/nginx/ssl/mydomain.ru/mydomain.ru.cer;
    ssl_certificate_key /etc/nginx/ssl/mydomain.ru/mydomain.ru.key;
    server_name mydomain.ru www.mydomain.ru;
    root /var/www/mydomain.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://mydomain.ru открылась бы страница https://mydomain.ru