daanra / laravel-lets-encrypt
一个使用Let's Encrypt轻松生成SSL证书的Laravel包
Requires
- php: ^7.2|^8.0
- ext-openssl: *
- guzzlehttp/guzzle: ^7.4
- illuminate/console: ^7.0|^8.0|^9.0|^10.0|^11.0
- illuminate/filesystem: ^7.0|^8.0|^9.0|^10.0|^11.0
- illuminate/support: ^7.0|^8.0|^9.0|^10.0|^11.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.0
- orchestra/testbench: ^7.0|^8.0|^9.0
- phpunit/phpunit: ^10.0
This package is auto-updated.
Last update: 2024-09-16 18:45:21 UTC
README
一个用于使用Let's Encrypt轻松生成和续订SSL证书的Laravel包。如果您有一个管理多个域名SSL证书的Laravel应用程序,此包特别有用。如果您只需为应用程序生成单个SSL证书,则不建议使用此包。
此包基本上是一个围绕Acme PHP的Laravel友好封装。
安装
您可以通过composer安装此包
composer require daanra/laravel-lets-encrypt
如果您在使用Guzzle时遇到由于冲突依赖项导致的安装问题,您可能需要运行
composer require daanra/laravel-lets-encrypt guzzlehttp/guzzle:^6.0 -w
发布配置文件和迁移
php artisan vendor:publish --provider="Daanra\LaravelLetsEncrypt\LetsEncryptServiceProvider" --tag="lets-encrypt"
运行迁移
php artisan migrate
注意
您必须以某种方式返回存储的挑战,每当它从/.well-known/acme-challenge
端点检索时。您可以通过适当配置NGINX/Apache或注册路由来完成此操作
Route::get('/.well-known/acme-challenge/{token}', function (string $token) { return \Illuminate\Support\Facades\Storage::get('public/.well-known/acme-challenge/' . $token); })
有时,NGINX/Apache配置中默认禁用了/.well-known/
前缀(请参阅#4)。如果您希望Laravel返回挑战,请确保将其转发到您的Laravel应用程序。
使用方法
为特定域名创建新的SSL证书很容易
// Puts several jobs on the queue to handle the communication with the lets-encrypt server [$certificate, $pendingDispatch] = \Daanra\LaravelLetsEncrypt\Facades\LetsEncrypt::create('mydomain.com'); // You could, for example, chain some jobs to enable a new virtual host // in Apache and send a notification once the website is available [$certificate, $pendingDispatch] = \Daanra\LaravelLetsEncrypt\Facades\LetsEncrypt::create('mydomain.com', [ new CreateNewApacheVirtualHost('mydomain.com'), new ReloadApache(), new NotifyUserOfNewCertificate(request()->user()), ]); // You can also do it synchronously: \Daanra\LaravelLetsEncrypt\Facades\LetsEncrypt::createNow('mydomain.com');
从v0.3.0版本开始提供备用语法
LetsEncrypt::certificate('mydomain.com') ->chain([ new SomeJob() ]) ->delay(5) ->retryAfter(4) ->setTries(4) ->setRetryList([1, 5, 10]) ->create(); // or ->renew()
在此处可以指定所有作业的值
- tries (作业可以尝试的次数)
- retryAfter (等待重新尝试作业前的秒数)
- retryList (等待重新尝试作业的秒数列表)
- chain (在证书成功获取后执行一些作业)
- delay (设置作业的延迟时间)
您也可以使用artisan命令实现相同的功能
php artisan lets-encrypt:create -d mydomain.com
证书存储在数据库中。您可以这样查询它们
// All certificates \Daanra\LaravelLetsEncrypt\Models\LetsEncryptCertificate::all(); // All expired certificates \Daanra\LaravelLetsEncrypt\Models\LetsEncryptCertificate::query()->expired()->get(); // All currently valid certificates \Daanra\LaravelLetsEncrypt\Models\LetsEncryptCertificate::query()->valid()->get(); // All certificates that should be renewed (because they're more than 60 days old) \Daanra\LaravelLetsEncrypt\Models\LetsEncryptCertificate::query()->requiresRenewal()->get(); // Find certificate by domain $certificate = LetsEncryptCertificate::where('domain', 'mydomain.com')->first(); // If you no longer need it, you can soft delete $certificate->delete(); // Or use a hard delete $certificate->forceDelete();
主题备用名称
还可以指定如下主题备用名称(需要 >= 0.5.0)
LetsEncrypt::certificate('mydomain.com') ->setSubjectAlternativeNames(['mydomain2.com']) ->create();
失败事件
如果某个作业失败,则会触发以下事件之一
Daanra\LaravelLetsEncrypt\Events\CleanUpChallengeFailed Daanra\LaravelLetsEncrypt\Events\ChallengeAuthorizationFailed Daanra\LaravelLetsEncrypt\Events\RegisterAccountFailed Daanra\LaravelLetsEncrypt\Events\RequestAuthorizationFailed Daanra\LaravelLetsEncrypt\Events\RequestCertificateFailed Daanra\LaravelLetsEncrypt\Events\StoreCertificateFailed Daanra\LaravelLetsEncrypt\Events\RenewExpiringCertificatesFailed
每个事件都实现了Daanra\LaravelLetsEncrypt\Interfaces\LetsEncryptCertificateFailed
接口,因此您也可以监听该接口。
自动续订证书
证书有效期为90天。在这90天结束之前,您将想要续订它们。为此,您可以在App\Console\Kernel
中添加以下内容
protected function schedule(Schedule $schedule) { $schedule->job(new \Daanra\LaravelLetsEncrypt\Jobs\RenewExpiringCertificates)->daily(); }
这将自动续订所有超过60天的证书,确保它们不会过期。
配置
默认情况下,此包将使用Let's Encrypt的测试服务器颁发证书。您应该在生产服务器的.env
文件中设置
LETS_ENCRYPT_API_URL=https://acme-v02.api.letsencrypt.org/directory
。
默认情况下,此包将尝试使用HTTP-01挑战来验证证书。因此,一个文件将暂时存储在应用程序的存储目录中,路径为app/public/.well-known/acme-challenge/<CHALLENGE_TOKEN>
。您可以通过在配置中的path_generator
下设置自定义的PathGenerator
类来自定义此行为。请注意,Let's Encrypt期望以下路径
/.well-known/acme-challenge/<CHALLENGE_TOKEN>
返回位于$pathGenerator->getPath($token)
的文件的正文。
测试
composer test
变更日志
请参阅变更日志获取关于最近更改的更多信息。
贡献
请参阅贡献指南获取详细信息。
安全性
如果您发现任何安全相关的问题,请发送电子邮件至opensource@daanraatjes.dev而不是使用问题跟踪器。如果您有任何问题,请通过创建一个问题而不是发送电子邮件来提问。
致谢
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。