Docker搭建Laravel8本地环境时Passport无法创建密钥文件报错
Laravel 8 Docker环境Passport密钥校验死锁修复方案
问题根因
laravel/passport将密钥文件存在性校验逻辑放在服务提供者启动阶段,框架启动加载Passport服务时就会触发校验,该动作优先级高于所有artisan命令执行逻辑——哪怕执行的是php artisan passport:keys密钥生成命令本身,也会先被校验拦截,形成无密钥就无法生成密钥的死循环。
修复方案
方案1:占位文件绕过(无侵入、效率最高)
Passport启动阶段的校验仅判断目标文件是否存在、是否具备可读权限,不会校验文件内容合法性,可先创建空文件占位,再正常执行生成命令:
- 进入Docker容器内的项目根目录(对应报错路径
/var/www/html) - 执行以下命令创建空文件并配置正确权限:
touch storage/oauth-private.key storage/oauth-public.key chown www-data:www-data storage/oauth-*.key chmod 600 storage/oauth-*.key
- 直接执行
php artisan passport:keys即可正常运行,命令会自动覆盖空占位文件,写入合法密钥内容。
方案2:原生OpenSSL生成密钥(完全绕开artisan校验)
passport:keys底层就是调用OpenSSL生成RSA密钥对,可直接执行系统命令生成密钥,不需要走artisan流程:
cd /var/www/html/storage # 生成4096位RSA私钥 openssl genrsa -out oauth-private.key 4096 # 从私钥导出对应公钥 openssl rsa -in oauth-private.key -pubout -out oauth-public.key # 配置文件权限 chown www-data:www-data oauth-*.key chmod 600 oauth-*.key
该方式生成的密钥与artisan命令生成的密钥完全等效,不影响Passport任何功能运行。
后续配置
全新本地环境生成密钥后,需执行php artisan passport:client --personal创建个人访问客户端,否则个人令牌授权相关接口会抛出异常。
内容的提问来源于stack exchange,提问作者Klick
相关产品推荐
相关产品推荐

