Как включить ssl с помощью паруса laravel 8

Я только что создал новый проект Laravel 8, следуя инструкциям в их документах . Используя Laravel Sail У меня есть сайт, работающий локально на моей машине, с использованием sail up. Я настроил запись в /etc/hosts, поэтому я перехожу по URL-адресу http://local.dev.domain.com (заменяя domain.com фактическое доменное имя, которым я владею, и указывая на localhost в файле /etc/hosts)... все работает отлично.

Однако сайт должен использовать вход через Facebook, а Facebook требует URL-адреса https только для рефереров. Я пробовал все, что мог найти в Интернете о настройке SSL-сертификатов с помощью докера, но настройка nginx с сертификатами, созданными вручную (через mkcert), или попытка использовать letsencrypt не увенчались успехом по разным причинам (конфликты в портах, letsencrypting хочет, чтобы домен был настоящий (и не справится с acme, если я создам этот субдомен) и т. д. Я скопировал сертификаты в /etc/ssl/certs в образе докера и запустил update-ca-certificates, попытался установить порт приложения 443 в моем .env файле, а также открыть оба порта 80 и 443 в файле docker-compose.yml... но все заканчивается тем, что браузер отклоняет запрос к https://local.dev.domain.com

Я потратил часы, пытаясь заставить это работать, но похоже, что никто не использовал образ докера Laravel Sail с SSL.

Любые указатели?

[Изменить для получения дополнительной информации] Как указано в комментариях, вам нужно установить псевдоним, чтобы просто использовать sail ..., но я уже сделал это:

Я также пробовал без псевдонима bash, используя vendor/bin/sail share, но безрезультатно:

попробуйте это laravel.com/docs/8.x/sail#sharing-your-site

Kamlesh Paul 15.12.2020 09:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
14
1
17 190
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Проблема

В вашем случае нужен реальный домен, который у вас есть. Самоподписанный сертификат не будет работать, так как Facebook не признает его доверенным. Чтобы получить бесплатный ssl-сертификат для этого домена, вы можете использовать Let's Encrypt, самый простой способ получить этот сертификат — использовать certbot. Проблема в том, что вам нужно установить этот сертификат на свой веб-сервер. Laravel Sail использует встроенный веб-сервер , который, к сожалению, не поддерживает ssl. Вам нужно поставить перед приложением веб-сервер типа nginx и установить туда сертификат.

В настоящее время я работаю над форком, который позволяет то, что вам нужно, однако он еще не закончен.

Обходной путь

На данный момент вы можете использовать встроенный туннель, предоставленный Expose: https://beyondco.de/docs/expose/server/ssl

Это включено sail share

Вместо этого может быть проще использовать ngrok, что по сути то же самое, но коммерческое. Все, что вам нужно сделать, это загрузить, зарегистрироваться и запустить ngrok http --region=eu 9000, и он создаст для вас ссылку https для разработки.

Это супер полезно, спасибо! Я буду держать на вашей вилке, звучит действительно многообещающе! Я пытался использовать sail share, но получаю сообщение об ошибке, говорящее, что это недопустимая команда...

smenzer 15.12.2020 11:49

@smenzer Вам нужно правильно установить парус, чтобы использовать этот короткий псевдоним: laravel.com/docs/8.x/sail#configuring-a-bash-alias в противном случае вам нужно vendor/bin/sail share

online Thomas 15.12.2020 11:56

Я сделал то, что вы упомянули (обновил описание с подробностями), но все равно не получилось vendor/bin/sail share

smenzer 15.12.2020 22:07

@smenzer, возможно, это невозможно в Windows. Однако я предлагаю пропустить эту часть и пока использовать ngrok.

online Thomas 16.12.2020 07:35

Я на маке. но сейчас я пытаюсь использовать ngrok. Мне пришлось изменить порт приложения в .env на 9000, и тогда он, кажется, работает и дает мне доступ по https. Так же нужно проработать интеграцию с фейсбуком. с нетерпением жду готовности вашего проекта!

smenzer 16.12.2020 10:42

@smenzer Я пропустил, что контейнер докеров меняет порт на 80 вместо обычного порта 9000 при запуске php artisan serve

online Thomas 16.12.2020 12:14

@onlineThomas дополнительный удар по форку, над которым вы работаете! звучит здорово!

Andre W. 31.12.2020 00:37

@smenzer Я только что видел это в другом посте. Судя по всему, версия паруса, которую вы получаете по умолчанию, не самая последняя, ​​вам нужно использовать composer require laravel/sail --dev, найденный в комментариях здесь laracasts.com/series/whats-new-in-laravel-8/episodes/12

Harvey Dobson 08.01.2021 12:14

Чтобы заставить работать «sail share», вам нужно установить псевдоним и запустить «composer require laravel/sail --dev» в вашем проекте. Это установит последнюю версию паруса, версия 0.0.6 включает команду «поделиться».

это помогло. странно, что документированный способ запуска проекта laravel (curl -s https://laravel.build/example-app | bash с laravel.com/docs/8.x/installation#getting-started-on-macos) не включает это по умолчанию

smenzer 18.12.2020 22:15

Sail — это необязательная среда разработки, такая как Laragon или Valet и т. д.

Dan Abrey 17.05.2021 09:34

Просто обратите внимание, что Sail теперь включен по умолчанию при использовании онлайн-конструктора. Если вы хотите углубиться в конфиги, вы можете использовать artisan publish:sail.

Nilpo 28.10.2022 03:53

Я решил эту проблему, используя Caddy в качестве обратного прокси-сервера для контейнера Laravel Sail. Caddy имеет функцию под названием автоматический HTTPS, которая может генерировать локальные сертификаты на лету.

1 - Добавьте Caddy в качестве услуги в свой docker-compose.yml

services:
    caddy:
        image: caddy:latest
        restart: unless-stopped
        ports:
            - '80:80'
            - '443:443'
        volumes:
            - './docker/Caddyfile:/etc/caddy/Caddyfile'
            - sailcaddy:/data
            - sailcaddy:/config
        networks:
            - sail
            
    # Remove "ports" from laravel.test service
            
volumes:
    sailcaddy:
        driver: local

2 - Создайте простой Caddyfile и настройте его как обратный прокси

{
    on_demand_tls {
        ask http://laravel.test/caddy-check
    }
    local_certs
}

:443 {
    tls internal {
        on_demand
    }

    reverse_proxy laravel.test {
        header_up Host {host}
        header_up X-Real-IP {remote}
        header_up X-Forwarded-For {remote}
        header_up X-Forwarded-Port {server_port}
        header_up X-Forwarded-Proto {scheme}

        health_timeout 5s
    }
}

3 - Настройте конечную точку для Caddy, чтобы авторизовать, для каких доменов он генерирует сертификаты.

<?php

namespace App\Http\Controllers;

use App\Store;
use Illuminate\Http\Request;

class CaddyController extends Controller
{
    public function check(Request $request)
    {
        $authorizedDomains = [
            'laravel.test',
            'www.laravel.test',
            // Add subdomains here
        ];

        if (in_array($request->query('domain'), $authorizedDomains)) {
            return response('Domain Authorized');
        }

        // Abort if there's no 200 response returned above
        abort(503);
    }
}

См. эту суть для полного изменения кода. Этот пост в блоге объясняет, как доверять корневым сертификатам Caddy.

Это выглядит действительно многообещающе! Мне интересно, не пропустил ли я что-нибудь; настройка выше с новой установкой (через curl -s "https://laravel.build/example-app" | bash) и настройка laravel.test на example-app.test, а затем попытка достижения example-app.test возвращает «Этот сайт не может обеспечить безопасное соединение \ example-app.test отправил недопустимый ответ. \ ERR_SSL_PROTOCOL_ERROR» в Chrome, и подобные ошибки в Safari/FF. Есть предположения?

runofthemill 16.06.2021 22:12

Вы имеете в виду, что изменили laravel.test в своем docker-compose.yml? Если это так, я не думаю, что вы можете изменить laravel.test, поскольку я думаю, что Sail использует его внутри. Но вы можете обновить файл hosts, чтобы использовать любой локальный домен, который вы хотите. Вы также можете проверить журналы службы кэдди, чтобы узнать, что она делает.

Gilbert 18.06.2021 10:27

Ах интересно! Да, журналы службы Caddy показали, что он работает, но даже не подтверждает запрос, когда я его делал в браузере. Попробую еще раз с laravel.test. Ваше здоровье!

runofthemill 18.06.2021 22:52

Я сделал, как вы сказали, даже домен в файле hosts для laravel.test, но я все равно получаю This site can’t provide a secure connection laravel.test sent an invalid response. в браузере Chrome

Ya Basha 09.07.2021 17:12

Это аккуратно и это работает! Как мы можем заставить сервер разработки веб-пакета Laravel Mix также использовать обратный прокси-сервер React Fast Refresh или HRM на другом порту? Например http://localhost:8081.

Christos Lytras 05.12.2021 15:27

Я все это сделал, установил rootCA, скопировав его в /etc/local/share/ca-certificates и запустив sudo update-ca-certificates (у меня Ubuntu). Однако при посещении laravel.test chrome по-прежнему выдает NET::ERR_CERT_AUTHORITY_INVALID. Есть идеи? Кажется, что дата истечения срока действия равна дате выпуска...

Ken 04.08.2022 11:54

Для тех, у кого возникли проблемы с установкой rootCA, а Chrome по-прежнему выдает NET::ERR_CERT_AUTHORITY_INVALID: экспортируйте сертификат Caddy rootCA и импортируйте его в chrome, используя его настройки (chrome://settings/certificates). Так что делайте sudo docker cp your-caddy-container-name:/config/caddy/pki/authorities/loca‌​l/root.crt ~/Downloads/caddy-root.crt (может быть, вам придется сделать sudo chown your-user:your-user ~/Downloads/caddy-root.crt). А затем импортируйте этот экспортированный сертификат как «Авторитет» в настройках Chrome (отметьте все флажки). НЕ ДЕЛАЙТЕ ЭТОГО С ДРУГИМИ СЕРТИФИКАТАМИ!

Ken 08.08.2022 08:54

Я пытался заставить это решение работать в течение нескольких дней. Настройка достаточно проста, но Caddy не может проверить домены, потому что это создает петлю перенаправления. Caddy отправляет запрос на http://laravel.test/caddy-check, который затем перенаправляет на https://laravel.test/caddy-check, что приводит к сбою запроса с ошибкой following http redirects is not allowed. Поскольку, по-видимому, нет способа исключить эту единственную конечную точку, все решение является ложным.

Nilpo 28.10.2022 02:29

На самом деле есть более простой способ. Я сделал следующее:

изменил порт laravel.test на что-то другое, например 8085 делайте это из .env, чтобы избежать проблем, добавьте APP_PORT env var

затем (этот шаг был выполнен нашим системным администратором), поскольку laravel Sailing фактически устанавливает apache в систему, вы можете вручную установить обратный прокси-сервер для портов 80 и 443 на порт 8085, и это должно помочь.

конечно, вам придется установить certbot на этот экземпляр apache.

Другие вопросы по теме