Я использую гибкий 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).