如何使用 laravel 8 sail 启用 ssl

how do you enable ssl using laravel 8 sail

我刚刚创建了一个新的 Laravel 8 项目,按照说明 in their docs. Using Laravel Sail 我在我的机器上本地安装了站点 运行ning,使用 sail up 就可以了。我已经在 /etc/hosts 中设置了一个条目,所以我去的 url 是 http://local.dev.domain.com (用 domain.com 代替我拥有的实际域名,并指向 localhost/etc/hosts 文件中)...一切都很好。

但是,该站点需要使用 Facebook 登录,而 Facebook 仅在引荐来源网址上需要 https urls。我已经尝试了所有我能在网上找到的关于使用 docker 设置 SSL 证书的方法,但是使用手动创建的证书(通过 mkcert)设置 nginx 或尝试使用 letsencrypt 都因各种原因(冲突端口,letsencrypting 希望该域是一个真实的域(如果我确实创建了该子域,则在 acme 挑战中失败),等等。我已将证书复制到 docker 图像中的 /etc/ssl/certs 和 运行 update-ca-certificates,尝试在我的 .env 文件中设置应用程序端口 443 以及在 [=24] 中打开端口 80443 =] 文件...但都以浏览器拒绝对 https://local.dev.domain.com

的请求而告终

我花了几个小时试图让它工作,但似乎没有人使用过带有 SSL 的 Laravel Sail docker 图像。

有什么指点吗?

[编辑以获取更多信息] 正如评论中指出的那样,您需要设置一个别名才能使用 sail ...,但我已经这样做了:

我也试过没有 bash 别名,使用 vendor/bin/sail share 无济于事:

问题

在您的情况下,您需要一个您拥有的真实域。自签名证书不起作用,因为 Facebook 不会承认它是可信的。要为该域获取免费的 ssl 证书,您可以使用 Let's Encrypt,获取该证书的最简单方法是使用 certbot。问题是您需要在您的网络服务器上安装该证书。 Laravel启航uses the build-in webserver that does not support ssl unfortunatly. You need to put a webserver like nginx in front of the app and install the certificate there.

我目前正在研究 a fork 来满足您的需求,但尚未完成。

解决方法

现在您可以使用 Expose 提供的内置隧道:https://beyondco.de/docs/expose/server/ssl

这是由 sail share

启用的

使用 ngrok 可能更容易,它本质上是相同的,但商业化。您所要做的就是下载、注册和 运行 ngrok http --region=eu 9000 它会为您创建一个 https link 用于开发。

为了让“sail share”工作,你必须在你的项目上设置别名和运行“composer require laravel/sail --dev”。这将安装最新版本的 sail,版本 0.0.6 包括“共享”命令

我使用 Caddy as a reverse proxy to the Laravel Sail container. Caddy has a feature called automatic 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);
    }
}

请参阅 this gist for the full code changes involved. This blog post 解释如何信任 Caddy 根证书。

实际上有一个更简单的方法。我做了以下事情:

已将 laravel.test 端口更改为其他端口,例如 8085 从 .env 开始,这样你就可以避免问题,添加 APP_PORT env var

然后(这一步已经由我们的系统管理员完成)因为 laravel sail 实际上是在系统中安装 apache,你可以手动将端口 80 和 443 设置为端口 8085 的反向代理,然后应该可以解决问题。

当然你必须在那个 apache 实例上安装 certbot。