php实现acme协议
使用 PHP 实现 ACME 协议(如 Let's Encrypt)
ACME(Automated Certificate Management Environment)协议是 Let's Encrypt 等证书颁发机构(CA)用于自动化证书管理的标准协议。以下是使用 PHP 实现 ACME 协议的关键步骤:
安装依赖库
推荐使用 acmephp 或 letsencrypt-php 等开源库简化实现。通过 Composer 安装:
composer require acmephp/acmephp
初始化 ACME 客户端
配置 ACME 客户端连接到 Let's Encrypt 的目录URL(生产或测试环境):
use AcmePhp\Core\AcmeClient;
use AcmePhp\Core\Protocol\AuthorizationChallenge;
$client = new AcmeClient('https://acme-v02.api.letsencrypt.org/directory');
注册账户
创建或加载 ACME 账户密钥对,并注册账户:
use AcmePhp\Core\Ssl\KeyPair;
$accountKeyPair = KeyPair::createFromPrivateKeyFile('/path/to/account.key');
$client->registerAccount($accountKeyPair, 'mailto:contact@example.com');
发起证书申请
为域名申请证书时,需先验证域名所有权:
$domain = 'example.com';
$order = $client->requestOrder([$domain]);
完成域名验证
ACME 通常通过 HTTP-01 或 DNS-01 挑战验证域名。以 HTTP-01 为例:
$challenges = $client->getAuthorizationChallenges($order, $domain);
foreach ($challenges as $challenge) {
if ($challenge->getType() === 'http-01') {
// 将挑战令牌写入指定路径
file_put_contents('/var/www/.well-known/acme-challenge/' . $challenge->getToken(), $challenge->getPayload());
}
}
$client->challengeAuthorization($challenge);
签发证书
验证通过后,生成 CSR 并获取证书:
use AcmePhp\Ssl\CertificateRequest;
use AcmePhp\Ssl\DistinguishedName;
$domainKeyPair = KeyPair::createFromPrivateKeyFile('/path/to/domain.key');
$csr = new CertificateRequest(new DistinguishedName($domain), $domainKeyPair);
$certificate = $client->finalizeOrder($order, $csr);
file_put_contents('/path/to/certificate.crt', $certificate->getPem());
自动化续期
ACME 证书有效期通常为 90 天。可通过定时任务(如 Cron)调用上述流程实现自动续期:
0 0 * * * /usr/bin/php /path/to/acme_renewal.php
注意事项
- 密钥安全:妥善保管账户和域名的私钥。
- 速率限制:Let's Encrypt 对申请频率有限制,测试阶段建议使用沙盒环境(
https://acme-staging-v02.api.letsencrypt.org/directory)。 - 日志记录:记录证书申请和续期的操作日志,便于排查问题。
通过以上步骤,PHP 应用可集成 ACME 协议实现自动化证书管理。如需更高级功能(如通配符证书),需结合 DNS-01 挑战和 DNS API 实现。







