如何使用 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] 中打开端口 80
和 443
=] 文件...但都以浏览器拒绝对 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。
我刚刚创建了一个新的 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] 中打开端口 80
和 443
=] 文件...但都以浏览器拒绝对 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。