rogierw / letsencrypt-client
此包已被弃用,不再维护。作者建议使用 https://github.com/RogierW/rw-acme-client 包。
LetsEncrypt 客户端库,用于 ACME v2,用 PHP 编写。
4.2.0
2024-04-06 07:45 UTC
Requires
- php: ^8.2
- ext-curl: *
- ext-json: *
- ext-mbstring: *
- ext-openssl: *
- psr/log: ^3.0
- spatie/dns: ^2.5
- spatie/laravel-data: ^3.9
Requires (Dev)
- larapack/dd: ^1.0
This package is auto-updated.
Last update: 2024-04-06 07:47:32 UTC
README
此库允许您请求、续订和撤销由 Let's Encrypt 提供的 SSL 证书。
如果您正在寻找一个易于使用的 CLI 工具来管理您的 LE 证书,请查看 RW ACME CLI 项目。
要求
- PHP ^8.2
- OpenSSL >= 1.0.1
- cURL 扩展
- JSON 扩展
注意
安装
您可以通过 composer 安装此包
composer require rogierw/rw-acme-client
用法
创建一个 Rogierw\RwAcme\Api
客户端实例,并向其提供一个本地账户,该账户将用于存储账户密钥。
$localAccount = new \Rogierw\RwAcme\Support\LocalFileAccount(__DIR__.'/__account', 'test@example.com'); $client = new Api(localAccount: $localAccount);
您也可以先创建客户端,然后稍后传递本地账户数据
$client = new Api(); // Do some stuff. $localAccount = new \Rogierw\RwAcme\Support\LocalFileAccount(__DIR__.'/__account', 'test@example.com'); $client->setLocalAccount($localAccount);
请注意,在执行以下任何调用之前,必须 设置本地账户。
创建账户
if (!$client->account()->exists()) { $account = $client->account()->create(); } // Or get an existing account. $account = $client->account()->get();
account
和 localAccount
的区别
account
是在 ACME(Let's Encrypt)服务器上创建的账户,其数据来自localAccount
。localAccount
处理用于向 ACME 服务器发送请求的私钥/公钥对和联系电子邮件地址。根据实现方式,这些数据可能存储在本地或数据库中。
创建订单
$order = $client->order()->new($account, ['example.com']);
续订
只需创建一个新订单以续订现有证书,如上所述。请确保您使用与初始请求相同的账户。
获取订单
$order = $client->order()->get($order->id);
域名验证
获取 DCV 状态
$validationStatus = $client->domainValidation()->status($order);
http-01
获取验证文件的名称和内容
// Get the data for the HTTP challenge; filename and content. $validationData = $client->domainValidation()->getValidationData($validationStatus, \Rogierw\RwAcme\Enums\AuthorizationChallengeEnum::HTTP);
这将返回一个数组
Array ( [0] => Array ( [type] => http-01 [identifier] => example.com [filename] => sqQnDYNNywpkwuHeU4b4FTPI2mwSrDF13ti08YFMm9M [content] => sqQnDYNNywpkwuHeU4b4FTPI2mwSrDF13ti08YFMm9M.kB7_eWSDdG3aWIaPSp6Uy4vLBbBI5M0COvM-AZOBcoQ ) )
Let's Encrypt 验证服务器将向以下 URL 发送请求
http://example.com/.well-known/acme-challenge/sqQnDYNNywpkwuHeU4b4FTPI2mwSrDF13ti08YFMm9M
dns-01
获取 TXT 记录的名称和值
// Get the data for the DNS challenge. $validationData = $client->domainValidation()->getValidationData($validationStatus, \Rogierw\RwAcme\Enums\AuthorizationChallengeEnum::DNS);
这将返回一个数组
Array ( [0] => Array ( [type] => dns-01 [identifier] => example.com [name] => _acme-challenge [value] => 8hSNdxGNkx4MI7ZN5F8uZj3cTSMX92SGMCMHQMh0cMA ) )
开始域名验证
http-01
try { $client->domainValidation()->start($account, $validationStatus[0], \Rogierw\RwAcme\Enums\AuthorizationChallengeEnum::HTTP); } catch (DomainValidationException $exception) { // The local HTTP challenge test has been failed... }
dns-01
try { $client->domainValidation()->start($account, $validationStatus[0], \Rogierw\RwAcme\Enums\AuthorizationChallengeEnum::DNS); } catch (DomainValidationException $exception) { // The local DNS challenge test has been failed... }
生成 CSR
$privateKey = \Rogierw\RwAcme\Support\OpenSsl::generatePrivateKey(); $csr = \Rogierw\RwAcme\Support\OpenSsl::generateCsr(['example.com'], $privateKey);
完成订单
if ($order->isReady() && $client->domainValidation()->allChallengesPassed($order)) { $client->order()->finalize($order, $csr); }
获取实际证书
if ($order->isFinalized()) { $certificateBundle = $client->certificate()->getBundle($order); }
撤销证书
if ($order->isValid()) { $client->certificate()->revoke($certificateBundle->fullchain); }