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

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

Однако на сайте необходимо использовать вход через Facebook, а Facebook требует https-URL только для источников перехода. Я перепробовал все, что мог найти в Интернете о настройке SSL-сертификатов с помощью docker, но настройка 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, но безрезультатно:

введите описание изображения здесь


person smenzer    schedule 15.12.2020    source источник
comment
попробуйте это laravel.com/docs/8.x/sail#sharing- ваш-сайт   -  person Kamlesh Paul    schedule 15.12.2020


Ответы (3)


Проблема

В вашем случае вам нужен реальный домен, который у вас есть. Самозаверяющий сертификат не будет работать, поскольку 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-ссылку для разработки.

введите описание изображения здесь

person online Thomas    schedule 15.12.2020
comment
Это очень полезно, спасибо! Я буду держать вас на вилке, звучит многообещающе! Я пробовал использовать sail share, но получаю сообщение об ошибке, что это недопустимая команда ... - person smenzer; 15.12.2020
comment
@smenzer Чтобы использовать этот короткий псевдоним, вам необходимо правильно установить парус: laravel.com/docs/8.x/sail#configuring-a-bash-alias, иначе вам понадобится vendor/bin/sail share - person online Thomas; 15.12.2020
comment
Я сделал то, что вы упомянули (обновил описание подробностями), но сделать это по-прежнему не удалось vendor/bin/sail share - person smenzer; 16.12.2020
comment
@smenzer, возможно, это невозможно в Windows. Однако я предлагаю пропустить эту часть и пока использовать ngrok. - person online Thomas; 16.12.2020
comment
Я на макинтоше. но сейчас я пытаюсь использовать ngrok. Мне пришлось изменить порт приложения в .env на 9000, а затем, похоже, он работает и дает мне доступ по https. Просто нужно отработать интеграцию с фейсбуком. с нетерпением жду готовности вашего проекта! - person smenzer; 16.12.2020
comment
@smenzer Я пропустил, что контейнер докеров меняет порт на 80 вместо обычного порта 9000 при запуске php artisan serve - person online Thomas; 16.12.2020
comment
@onlineThomas - дополнительный удар для форка, над которым вы работаете! звучит здорово! - person UX Andre; 31.12.2020
comment
@smenzer Я только что видел это в другом посте. По-видимому, версия паруса, которую вы получаете по умолчанию, не самая последняя, ​​вам нужно использовать composer require laravel/sail --dev, найденный в комментариях здесь laracasts.com/series/whats-new-in-laravel-8/episodes/12 - person Harvey Dobson; 08.01.2021
comment
спасибо @HarveyDobson! - person smenzer; 11.01.2021

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

person Incubus_inside    schedule 18.12.2020
comment
это помогло. странно, что документированный способ запуска проекта laravel (curl -s https://laravel.build/example-app | bash из laravel .com / docs / 8.x / installation # getting-started-on-macos) не включает это по умолчанию. - person smenzer; 19.12.2020
comment
Sail - это необязательная среда разработки, такая как Laragon, Valet и т. Д. - person Dan Abrey; 17.05.2021

Я решил эту проблему, используя 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.

person Gilbert    schedule 16.06.2021
comment
Это выглядит многообещающе! Мне интересно, не упустил ли я что-нибудь; настройка вышеуказанного с новой установкой (через 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. Есть предположения? - person runofthemill; 16.06.2021
comment
Вы имеете в виду, что изменили laravel.test в своем docker-compose.yml? Если так, то я не думаю, что вы можете изменить laravel.test, поскольку я думаю, что Sail использует это для внутренних целей. Но вы можете обновить свой файл hosts, чтобы использовать любой локальный домен, который вы хотите. Вы также можете проверить журналы службы caddy, чтобы узнать, что она делает. - person Gilbert; 18.06.2021
comment
Ах интересно! Да, журналы службы Caddy показали, что он работает, но даже не подтверждает запрос, когда я сделал его в браузере. Попробую еще раз с laravel.test. Ваше здоровье! - person runofthemill; 18.06.2021
comment
Я сделал, как вы сказали, даже домен в файле hosts на laravel.test, но я все еще получаю This site can’t provide a secure connection laravel.test sent an invalid response. в браузере Chrome - person Ya Basha; 09.07.2021