Spec-Zone.ru › Phoenix

Использование SSL

Исходный код

Чтобы подготовить приложение к обработке запросов через SSL, нужно добавить немного конфигурации и две переменные окружения. Для работы SSL потребуются файл ключа и файл сертификата от центра сертификации. Переменные окружения должны содержать пути к этим двум файлам.

Конфигурация состоит из нового ключа https: для конечной точки, значением которого является список ключевых слов с портом, путем к файлу ключа и путем к файлу сертификата (PEM). Если добавить ключ otp_app: со значением, равным имени приложения, Plug начнет искать эти файлы в корневом каталоге приложения. Затем файлы можно поместить в каталог priv и задать пути priv/our_keyfile.key и priv/our_cert.crt.

Вот пример конфигурации из config/runtime.exs.

import Config

config :hello, HelloWeb.Endpoint,
  http: [port: String.to_integer(System.get_env("PORT"))],
  url: [host: "example.com"],
  cache_static_manifest: "priv/static/cache_manifest.json",
  https: [
    port: 443,
    cipher_suite: :strong,
    otp_app: :hello,
    keyfile: System.get_env("SOME_APP_SSL_KEY_PATH"),
    certfile: System.get_env("SOME_APP_SSL_CERT_PATH"),
    # OPTIONAL Key for intermediate certificates:
    cacertfile: System.get_env("INTERMEDIATE_CERTFILE_PATH")
  ]

Без ключа otp_app: необходимо указать абсолютные пути к файлам в файловой системе, чтобы Plug мог их найти.

Path.expand("../../../some/path/to/ssl/key.pem", __DIR__)

Параметры в ключе https: передаются адаптеру Plug, обычно Bandit, который, в свою очередь, использует Plug.SSL для выбора параметров TLS-сокета. Дополнительные сведения о доступных параметрах и их значениях по умолчанию см. в документации Plug.SSL.configure/1. Полезную информацию также содержат руководство Plug по HTTPS и документация Erlang/OTP по ssl.

SSL в режиме разработки

Если вы хотите использовать HTTPS в режиме разработки, самоподписанный сертификат можно создать, выполнив команду: mix phx.gen.cert. Для этого требуется Erlang/OTP версии 20 или новее.

После создания самоподписанного сертификата конфигурацию для разработки в config/dev.exs можно обновить, чтобы запустить конечную точку HTTPS:

config :my_app, MyAppWeb.Endpoint,
  ...
  https: [
    port: 4001,
    cipher_suite: :strong,
    keyfile: "priv/cert/selfsigned_key.pem",
    certfile: "priv/cert/selfsigned.pem"
  ]

Эта конфигурация может заменить http, либо можно запустить HTTP- и HTTPS-серверы на разных портах.

Принудительное использование SSL

Во многих случаях требуется принудительно направлять все входящие запросы через SSL, перенаправляя HTTP на HTTPS. Для этого можно задать параметр :force_ssl в конфигурации конечной точки. Он принимает список параметров, которые передаются в Plug.SSL. По умолчанию для HTTPS-запросов задается заголовок "strict-transport-security", который заставляет браузеры всегда использовать HTTPS. Например:

config :my_app, MyAppWeb.Endpoint,
  force_ssl: [rewrite_on: [:x_forwarded_proto]]

Если поступает небезопасный запрос (HTTP), приведенная выше конфигурация перенаправит его на версию HTTPS, используя :host, указанный в конфигурации :url. Ключ rewrite_on: задает HTTP-заголовок, который обратный прокси-сервер или балансировщик нагрузки перед приложением использует для указания, был ли запрос получен по HTTP или HTTPS.

Чтобы динамически перенаправлять на host текущего запроса, задайте :host в конфигурации :force_ssl равным nil. В таких случаях при работе за прокси-сервером также необходимо задать x_forwarded_host и x_forwarded_port:

config :my_app, MyAppWeb.Endpoint,
  force_ssl: [rewrite_on: [:x_forwarded_proto, :x_forwarded_host, :x_forwarded_port], host: nil]

Кроме того, имейте в виду, что force_ssl перенаправляет все запросы, кроме запросов с localhost. Если приложение выполняет проверки работоспособности с другого источника, например "127.0.0.1" или внутреннего IP-адреса, возможно, потребуется явно исключить их из force_ssl:

config :my_app, MyAppWeb.Endpoint,
  force_ssl: [rewrite_on: [:x_forwarded_proto], exclude: ["localhost", "127.0.0.1"]]

Важно отметить, что force_ssl: — это конфигурация, задаваемая во время компиляции, поэтому обычно ее указывают в prod.exs; она не будет работать, если задать ее в runtime.exs.

Дополнительные сведения о последствиях переноса обработки TLS на внешний компонент, особенно связанных с защищенными файлами cookie, см. в руководстве Plug по HTTPS. Обратите внимание: параметры, передаваемые в Plug.SSL в этом документе, в приложении Phoenix следует задавать с помощью параметра конечной точки force_ssl:.

HSTS

HSTS (сокращение от 'HTTP Strict-Transport-Security') — это механизм, позволяющий веб-сайтам объявить, что доступ к ним возможен только через защищенное соединение (HTTPS). Он был введен для предотвращения атак типа «человек посередине», при которых удаляется шифрование SSL/TLS. HSTS заставляет веб-браузеры перенаправлять запросы с HTTP на HTTPS и отказываться от соединения, если оно не использует SSL/TLS.

Если задан force_ssl: [hsts: true], добавляется заголовок Strict-Transport-Security с параметром max-age, определяющим срок действия политики. Современные веб-браузеры реагируют на это, в частности, перенаправлением запросов с HTTP на HTTPS. RFC6797, в котором определяется HSTS, также указывает, что браузер должен хранить политику для узла и применять ее до истечения срока ее действия. Кроме того, в нем указано, что согласно этой политике трафик на любом порту, кроме 80, считается зашифрованным.

Хотя HSTS рекомендуется использовать в рабочей среде, при доступе к приложениям на localhost он может приводить к неожиданному поведению. Например, доступ к приложению с включенным HSTS по адресу https://localhost:4000 приводит к тому, что весь последующий трафик с localhost, кроме трафика через порт 80, считается зашифрованным. Это может нарушить работу других локальных серверов или прокси-серверов на вашем компьютере, не связанных с приложением Phoenix и не поддерживающих зашифрованный трафик.

Если вы случайно включили HSTS для localhost, возможно, потребуется очистить кеш браузера, прежде чем он снова начнет принимать HTTP-трафик с localhost.

Для Chrome:

  1. Откройте панель инструментов разработчика.
  2. Нажмите и удерживайте значок перезагрузки рядом с адресной строкой, чтобы открыть выпадающее меню.
  3. Выберите «Очистить кеш и выполнить жесткую перезагрузку».

Для Safari:

  1. Очистите кеш браузера.
  2. Удалите запись из ~/Library/Cookies/HSTS.plist или удалите файл целиком.
  3. Перезапустите Safari.

Инструкции для других браузеров см. в документации по HSTS.

Кроме того, установка параметра :expires для force_ssl в значение 0 должна привести к истечению срока действия записи и отключению HSTS.

Дополнительные сведения о параметрах HSTS см. в документации Plug.SSL.

← Предыдущая страница Смена баз данных
Следующая страница → Создание клиента Channels

Пакет Hex Предварительный просмотр Hex (текущий файл) Скачать версию ePub

Создано с помощью ExDoc (v0.40.3) для языка программирования Elixir

© 2014 Chris McCord
Licensed under the MIT License.
https://phoenix.hexdocs.pm/using_ssl.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API