bootok / acme
纯 PHP 实现的 ACME v2 (RFC 8555) 客户端,DNS-01 验证,PHP 8.2+,无重依赖
v1.0.0
2026-10-04 14:30 UTC
Requires
- php: >=8.2
- ext-openssl: *
Requires (Dev)
None
Suggests
None
Provides
None
Conflicts
None
Replaces
None
This package is not auto-updated.
Last update: 2026-11-02 13:11:16 UTC
README
纯 PHP 实现的 ACME v2 (RFC 8555) 客户端。仅支持 DNS-01 验证(通配符证书的唯一途径),面向无人值守的自动签发与续期。
一个好的开始,是给你的域名一张免费的证书。
- 依赖极少:
ext-openssl,零第三方包(HTTP 传输内置实现,可插拔) - 支持 Let's Encrypt / ZeroSSL / Buzz(PEBBLE 测试)
- DNS-01:manual(人工加 TXT)/ 阿里云 / 腾讯云(API 3.0 TC3 签名)可插拔
- 通配符、多域名 SAN、ECC 证书
- 签发过程回调(onStage),TXT 清理失败不毁掉已到手的证书
环境要求
- PHP >= 8.2
- ext-openssl
安装
composer require bootok/acme
快速开始
use BootOk\Acme\AcmeClient;
use BootOk\Acme\CertificateIssuer;
use BootOk\Acme\Dns\AliyunProvider;
$issuer = new CertificateIssuer(
caDirectory: AcmeClient::CA_LETS_ENCRYPT, // 也有 CA_LETS_ENCRYPT_STAGING 测试环境
accountKeyPem: $accountKeyPem, // PEM 格式账号密钥
email: 'you@example.com',
dns: new AliyunProvider([
'access_key_id' => '...',
'access_key_secret' => '...',
]),
);
$result = $issuer->issue(
domains: ['example.com', '*.example.com'],
onStage: function (string $stage, string $message) {
echo "[{$stage}] {$message}\n"; // order / dns / dns_wait / challenge / finalize / cleanup
},
);
设计要点
- 协议自研:JWS / ES256 定长签名、目录协商、challenge 轮询全部按 RFC 8555 实现,不依赖任何 ACME 库
- 零依赖:除 openssl 扩展外不 require 任何第三方包,适合嵌入任意项目
- DNS 供应商可插拔:实现
DnsProvider接口(name()+ 记录读写)即可接入新服务商 - 面向无人值守:错误分类清晰,清理阶段失败不影响签发结果