Cloudflare SSL не работает с бэкэндом Elixir / Phoenix - PullRequest
0 голосов
/ 14 октября 2018

Я использую гибкий SSL Cloudflare для защиты своего сайта, и он отлично работает при запуске моего интерфейса vue.js.По сути, он делится сертификатом SSL с 50 случайными клиентами, и это происходит путем передачи моего DNS через их пограничную сеть.По сути, он сделал то, что мне было нужно, и все было в порядке, но теперь, когда я пытаюсь привязать его к бэкэнду феникса / эликсира, он ломается.

Проблема в том, что вы не можете сделать запрос http отвнутри ssl-страницы, потому что вы получите эту ошибку:

Blocked loading mixed active content

Это имеет смысл - если это ssl под нагрузкой, он должен быть ssl полностью вниз.Поэтому теперь мне нужно добавить SSL к эликсиру.

Этот сайт (https://elixirforum.com/t/run-phoenix-https-behind-cloudflare-without-key-keyfile/12660/2), похоже, нашел решение! Их ответ был:

configs = Keyword.put(config, :http, [:inet6, port: "80"])
 |> Keyword.put(:url, [scheme: "https", host: hostname, port: "443"])

Поэтому я сделал свой конфиг какэто:

config :albatross, AlbatrossWeb.Endpoint,
  http: [:inet6, port: "4000"],
  url: [scheme: "https", host: "my.website", port: "443"],
  secret_key_base: "SUPERSECRET",
  render_errors: [view: AlbatrossWeb.ErrorView, accepts: ~w(html json)],
  pubsub: [name: Albatross.PubSub,
           adapter: Phoenix.PubSub.PG2]

Это только позволяет мне перейти на http: и т. д. Так что я также попробовал это:

config :albatross, AlbatrossWeb.Endpoint,
  http: [:inet6, port: "4000"],
  https: [ :inet6, port: "4443"],
  url: [scheme: "https", host: "my.website", port: "443"],
  secret_key_base: "SUPERSECRET",
  render_errors: [view: AlbatrossWeb.ErrorView, accepts: ~w(html json)],
  pubsub: [name: Albatross.PubSub,
           adapter: Phoenix.PubSub.PG2]

Что не работает, конечно, потому что нет PEMфайлы. Так как я использую только elixir в качестве API (а не DNS), я не могу использовать подобные решения (http://51percent.tech/blog/uncategorized/serving-phoenix-apps-ssl-and-lets-encrypt/),, потому что letsencrypt не разрешает авторизацию только по IP-адресу (https://www.digitalocean.com/community/questions/ssl-for-ip-address).

*)1025 * Так что в этот момент я очень запутался. У кого-нибудь есть совет?

РЕДАКТИРОВАТЬ:


Кто-то упомянул, что вы можете пойтиперейти к cloudflare и генерировать сертификаты TLS, перейдя на crypto>Origin Certificates>Create Certificate. Я сделал это, загрузил файлы, сохранил их в своем проекте и запустил это:

config :albatross, AlbatrossWeb.Endpoint,
  http: [:inet6, port: "4000"],
  https: [ port: "4443", 
           keyfile: "priv/ssl/cloudflare/private.key", 
           certfile: "priv/ssl/cloudflare/public.pem"],
  url: [scheme: "https", host: "website.me", port: "443"],
  secret_key_base: "SUPERSECRET",
  render_errors: [view: AlbatrossWeb.ErrorView, accepts: ~w(html json)],
  pubsub: [name: Albatross.PubSub,
           adapter: Phoenix.PubSub.PG2]

Так каковы результаты всех возможных способовзапросить бэкэнд?

Ну, я запускаю docker-compose, поэтому https://backendservice:4443 - это то, что я запрашиваю из внешнего интерфейса. Это дает мне -

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://backendservice:4443/getComments?postnum=6. (Reason: CORS request did not succeed).[Learn More]
value of error :  Error: "Network Error"
    exports https://mywebsi.te/js/chunk-vendors.4345f11a.js:49:15423
    onerror https://mywebsi.te/js/chunk-vendors.4345f11a.js:65:538540
actions.js:61:12 

Так что это явно не работает.

Я могу перейти к http://my.ip.address:4000, но я не могу перейти к https://my.ip.address:4443.

Насколько я могу судить, облачные сертификаты TLS не работают.

Или, что более вероятно, я делаю что-то глупое при написании конфигурации elixir.


ДОПОЛНИТЕЛЬНАЯ УТОЧНЕНИЕ:


Да, выше есть ошибка заголовка CORS. Однако обратите внимание, что только запускает запрос https, а НЕ запросы http.Почему это происходит, очень запутанно.У меня есть плагин cors для elixir в точке входа моего приложения, который в настоящее время разрешает * входящие запросы.Вот и все - это должно быть довольно просто:

plug CORSPlug, origin: "*"

Более подробную информацию можно найти здесь (https://github.com/mschae/cors_plug).

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

По моему опыту работы с Cloudflare и веб-бэкэндами (и без учета запроса точного , вызывающего проблему), это обычно вызывается жестким кодированием зависимости CSS / JS с http:// илисделать запрос AJAX с http:// жестко закодированнымЕсли серверная часть, которую вы запрашиваете с http://, автоматически не перенаправляет на https://, вы получите сообщение об ошибке, которую видите.

Если вы используете Cloudflare «One-Click SSL», вот как запросы отправляются на ваш сервер:

[ Client Browser ] <-- HTTPS --> [ Cloudflare ] <-- HTTP --> [ Your Server ]

Поскольку связь между Cloudflare и вашим сервером завершенаhttp://, вам вообще не нужно изменять какую-либо конфигурацию Phoenix, , но существует 2 потенциальных источника ошибки:

  1. Автоматическое перенаправление на https:// не выполняетсяот Cloudflare (или Cloudflare не обслуживает ваш контент)
  2. У вас есть некоторые зависимости CSS / JS или запросы Ajax, которые жестко заданы в http://, а сервер, отвечающий на запросы, не перенаправляется автоматически на https://.

Точка устранения неполадок 1 : Согласно документам Cloudflare для их "SSL в один клик" , они должны автоматически перенаправлять http:// запросы на https:// (хотя это может быть настройка, которую вам нужно изменить).Если запрос поступает на ваш домен через http://, Cloudflare должен автоматически перенаправить на https://.Вы можете проверить, происходит ли это, запросив страницу из вашей серверной части в браузере, указав http:// явно в начале URL-адреса.Если вы не перенаправлены на https://, это может означать, что a) Cloudflare фактически не находится между вашим браузером и бэкэндом или b) что Cloudflare не перенаправляется автоматически на https://.В любом случае у вас есть несколько советов о вашем следующем шаге в решении проблемы.

Пункт устранения неполадок 2: Вы можете проверить это, используя вкладку «Сеть» в инструментах разработчика в вашемв браузере, либо вручную просматривая код вашего сайта в поисках зависимостей CSS / JS или запросов Ajax, жестко запрограммированных с http://.В инструментах разработчика вы можете проверить, какие именно запросы вызывают проблему (строка должна быть красной и иметь ошибку в смешанном контенте).Оттуда вы можете проверить, откуда исходит этот запрос в вашем коде.При поиске в коде жестко запрошенных http:// запросов большую часть времени вы можете просто заменить его на https:// напрямую, но вы должны дважды проверить URL в своем браузере, чтобы убедиться, что URL действительно доступен черезhttps://.Если зависимость CSS / JS или конечная точка Ajax на самом деле недоступна для https://, вам потребуется удалить / заменить ее.

Надеюсь, это поможет.

0 голосов
/ 04 июля 2019

Я, кажется, смог заставить мой веб-сайт работать со следующей конфигурацией:

config :my_app, MyAppWeb.Endpoint,
  force_ssl: [hsts: true],
  url: [host: "my.website", port: 443],
  http: [:inet6, port: 4000],
  https: [
    :inet6,
    port: 8443,
    cipher_suite: :strong,
    keyfile: "private.key.pem",
    certfile: "public.cert.pem",
    cacertfile: "intermediate.cert.pem"
  ],
  cache_static_manifest: "priv/static/cache_manifest.json"

, где private.key.pem и public.cert.pem - это сертификат происхождения, загруженный из Cloudflare.

(Обратите внимание, что сертификат происхождения, который вы можете загрузить с Cloudflare, полезен только для шифрования соединения между вашим веб-сайтом и Cloudflare.)

Мне также пришлось добавить правила маршрутизации через iptables.

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 4000
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8443

Эта конфигурация также работала ранее для установки с использованием letsencrypt сертификатов.

Я не уверен, нужна ли часть cacertfile: "intermediate.cert.pem".Я получил его из «Этапа 4» Документация Cloudflare .

0 голосов
/ 15 октября 2018

Я никогда не использовал Cloudflare, но я знаю, что Phoenix может притвориться, что он обслуживает содержимое https, если в заголовках запросов установлено x-forwarded-proto.Ваша конфигурация в порядке (без https, вам это не нужно).

Попробуйте добавить параметр force_ssl в конфигурации конечной точки.Это заставит Plug.SSL принудительно использовать SSL и перенаправить любой http-запрос на https.

config :albatross, AlbatrossWeb.Endpoint,
   http: [:inet6, port: "4000"],
   url: [scheme: "https", host: "my.website", port: "443"],
   force_ssl: [rewrite_on: [:x_forwarded_proto], host: nil],
   secret_key_base: "SUPERSECRET",
   render_errors: [view: AlbatrossWeb.ErrorView, accepts: ~w(html json)],
   pubsub: [name: Albatross.PubSub,
           adapter: Phoenix.PubSub.PG2]
...