【问题标题】:how do you enable ssl using laravel 8 sail你如何使用 laravel 8sai 启用 ssl
【发布时间】:2021-03-25 21:08:25
【问题描述】:

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

但是,该网站需要使用 Facebook 登录,而 Facebook 仅在推荐人上需要 https url。我已经尝试了所有我可以在网上找到的关于使用 docker 设置 SSL 证书的方法,但是使用手动创建的证书(通过 mkcert)设置 nginx 或尝试使用letsencrypt都因各种原因而失败(端口冲突,让加密想要域成为一个真正的人(如果我确实创建了该子域,则在 acme 挑战中失败)等等。我已将证书复制到 docker 映像中的/etc/ssl/certs 并运行update-ca-certificates,尝试设置应用程序端口443在我的.env 文件中以及在docker-compose.yml 文件中打开两个端口80443 ......但所有这些都以浏览器拒绝https://local.dev.domain.com 的请求而告终

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

任何指针?

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

我也尝试使用 vendor/bin/sail share 不使用 bash 别名,但无济于事:

【问题讨论】:

标签: laravel docker ssl laravel-8 laravel-sail


【解决方案1】:

问题

在您的情况下,您需要一个真实的域,并且您拥有该域。自签名证书不起作用,因为 Facebook 不会承认它是受信任的。要获得该域的免费 ssl 证书,您可以使用 Let's Encrypt,获得该证书的最简单方法是使用 certbot。问题是您需要在您的网络服务器上安装该证书。不幸的是,Laravel Sail uses the build-in webserver 不支持 ssl。你需要在应用前面放一个像nginx这样的网络服务器和install the certificate there

我目前正在开发a fork,它可以满足您的需求,但还没有完成。

解决方法

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

这是sail share启用的

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

【讨论】:

  • 这个超级有用,谢谢!我会在你的叉子上放一个,听起来很有希望!我试过使用sail share,但我收到一个错误,说它不是一个有效的命令...
  • @smenzer 你需要正确安装sai才能使用这个短别名:laravel.com/docs/8.x/sail#configuring-a-bash-alias否则你需要vendor/bin/sail share
  • 我在 Mac 上。但我现在正在尝试使用 ngrok。我不得不将 .env 中的应用程序端口更改为 9000,然后它似乎可以工作并给我 https 访问权限。只需要解决与 facebook 的集成。期待您的项目准备就绪!
  • @onlineThomas 为你正在开发的叉子加分!听起来不错!
  • @smenzer 我刚刚在另一篇文章中看到了这个。显然您默认获得的sail 版本不是最新的,您需要使用composer require laravel/sail --dev 在此处的cmets 中找到laracasts.com/series/whats-new-in-laravel-8/episodes/12
【解决方案2】:

我通过使用Caddy 作为 Laravel Sail 容器的反向代理解决了这个问题。 Caddy 有一个名为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 gistThis blog post 解释了如何信任 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 中的类似错误。有什么想法吗?
  • 您的意思是您在docker-compose.yml 中更改了laravel.test?如果是这样,我认为您无法更改 laravel.test,因为我认为 Sail 在内部使用它。但是您可以更新您的主机文件以使用您想要的任何本地域。您可能还想查看球童服务的日志以了解它在做什么。
  • 有趣啊!是的,Caddy 服务日志显示它正在运行,但当我在浏览器中发出请求时甚至没有确认请求。我会用laravel.test 再试一次。干杯!
  • 我按照你所说的做了,即使是hosts文件中的域到laravel.test,但我仍然在chrome浏览器中得到This site can’t provide a secure connection laravel.test sent an invalid response.
  • 这很整洁,而且很有效!我们怎样才能让 Laravel Mix webpack devserver 在不同的端口上也反向代理 React Fast Refresh 或 HRM?例如http://localhost:8081.
【解决方案3】:

要使“sail share”工作,您必须设置别名并在您的项目上运行“composer require laravel/sail --dev”。这将安装最新版本的sails,0.0.6版本包含“share”命令

【讨论】:

【解决方案4】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 2022-01-16
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多