Search by

bootok / acme

hellobin

纯 PHP 实现的 ACME v2 (RFC 8555) 客户端,DNS-01 验证,PHP 8.2+,无重依赖

v1.0.0 2026-10-04 14:30 UTC

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() + 记录读写)即可接入新服务商
  • 面向无人值守:错误分类清晰,清理阶段失败不影响签发结果

License

MIT