influunt media

influunt media

Who am I?

Блог разработчика: обзор инструментов, практические примеры, мысли и исследования


Nginx. Переход с http на https


Протокол HTTPS - расширение HTTP поддерживающее шифрование. Данные кодируются с помощью криптографических протоколов SSL или TLS и передаются по сети. По умолчанию за протоколом закреплен TCP порт 443.

Nginx. Переход с http на https

Добавление HTTPS сервера

Виртуальный сервер описывается в секции server { ... } в рамках контекста http { ... }. Возможно создание нескольких серверов в рамках одного контекста. Для использования шифрования нужно указать директиву ssl, сертификат сервера ssl_certificate и секретный ключ ssl_certificate_key:

server {
  listen              443 ssl;
  server_name         domain.tld;
  server_name         www.domain.tld;
  ssl_certificate     /etc/ssl/domain.tld.crt;
  ssl_certificate_key /etc/ssl/domain.tld.key;

  ...
}

Секретный ключ может быть в одном файле вместе с сертификатом (Например, в cert файле). В этом случае ssl_certificate и ssl_certificate_key будут ссылатся на один и тот же файл.

Для уменьшения объема пересылаемого трафика стоит включить компрессию. Nginx реализует алгоритм сжатия gzip:

http {

  ...

  gzip on;
  gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss     text/javascript;
  gzip_disable "msie6";

  server {

    ...

  }
}
Перенаправление на HTTPS

Перенаправление пользователей на https лучше делать с помощью 301 кода состояния. Клиент, получив такой код от сервера, перейдет по адресу из в заголовка ответа Location:

HTTP/1.1 301 Moved Permanently
Server: nginx/1.4.6 (Ubuntu)
Date: Mon, 19 Sep 2016 17:59:49 GMT
Content-Type: text/html
Content-Length: 193
Connection: keep-alive
Location: https://www.domain.tld/

<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.4.6 (Ubuntu)</center>
</body>
</html>

В nginx предусмотрена директива возврата return код_состояния url. Возврат выполняется в рамках server, location, if (if предназначен для тонкой настройки обработки запросов. В статье он будет опущен).

Контекст server подойдет для приложений передающих данные через http (REST, SOAP и другие):

server {
  listen 80;
  return 301 https://www.domain.tld$request_uri;
}

Перенаправление всего трафика на уровне server может иметь побочные последствия. Поисковые системы не смогут загрузить robots.txt или sitemap.xml получив код состояния 301, вместо ожидаемого 200. Некоторые сервисы, не умеющие обрабатывать перенаправление, перестанут работать.

Использование возврата в контексте location дает наибольшую гибкость. Можно перенаправлять все запросы пользователей, кроме robots.txt и sitemap.xml:

server {
  listen 80;

  location ^/robots.txt { ... }
  location ^/sitemap.xml { ... }

  location / {
    return 301 https://www.domain.tld$request_uri;
  }
}
Полный листинг конфигурации

Полный листинг двух виртуальных серверов, включая активированный режим компрессии:

http {

  ...

  gzip on;
  gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss     text/javascript;
  gzip_disable "msie6";

  server {
    listen 80;

    server_name domain.tld;
    server_name www.domain.tld;

    location ^/robots.txt {
      try_files $uri =404;
    }

    location ^/sitemap.xml {
      try_files $uri =404;
    }

    location / {
      return 301 https://www.domain.tld$request_uri;
    }
  }
  server {
    listen 443 ssl;

    server_name domain.tld;
    server_name www.domain.tld;

    ssl_certificate     /etc/ssl/domain.tld.crt;
    ssl_certificate_key /etc/ssl/domain.tld.key;

    ...
  }
}
Выводы

Использование HTTPS повышает сложность прослушивания трафика. При передаче по сети данные могут быть сохранены проксирующим сервером (Например, squid), подслушаны злоумышленником или даже искажены. Криптография частично решает эту проблему, однако протокол не лишен уязвимостей.

Уменьшение накладных расходов на передачу по сети. Ряд экспериментов показал эффективность 80 и более процентов при использовании компрессии gzip. С другой стороны возврастет загруженность процессорного времени и оперативной памяти.

Бесплатные SSL сертификаты. Центр сертификации Let's Encrypt выдает SSL и TLS сертификаты бесплатно, любому желающему. Процесс получения сертификата основан на протоколе ACME и выполняется без участия пользователя.

Все это делает HTTPS привлекательным к использованию как в крупных бизнесс проектах, так и блоге, наподобие моего.