daanra/laravel-lets-encrypt

一个使用Let's Encrypt轻松生成SSL证书的Laravel包

v0.5.3 2024-04-16 17:48 UTC

README

Latest Version on Packagist GitHub Tests Action Status Total Downloads

一个用于使用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)。有关更多信息,请参阅许可证文件