skoerfgen / acmecert
用于 Let's Encrypt 和其他 ACME v2 - RFC 8555 兼容的证书授权机构的 PHP 客户端库
Requires
- php: >=5.6.0
- ext-openssl: *
Suggests
- ext-curl: Optional for better http performance
README
用于 Let's Encrypt 和其他 ACME v2 - RFC 8555 兼容的证书授权机构的 PHP 客户端库。
版本:3.4.0
描述
ACMECert 是一款设计用于帮助您通过几行 PHP 代码自动设置 SSL/TLS 证书/续订过程的工具。
它独立运行,并包含一系列函数,允许您
- 生成 RSA / EC (椭圆曲线) 密钥
- 管理账户:注册/外部账户绑定 (EAB)/更新/停用 和 账户密钥轮换
- 获取/吊销 证书(要续订证书,只需获取一个新的证书即可)
- 解析 证书 / 获取证书的 剩余天数 或 百分比,以确定证书的有效性
- 获取/使用 ACME 续订信息 (ARI)
- 等等...
查看 函数参考 获取完整列表
它将获取证书的复杂性抽象为 ACME 协议(创建订单、获取授权、计算挑战令牌、轮询状态、生成 CSR、最终订单、请求证书)到一个单独的函数 getCertificateChain(或 getCertificateChains 以获取所有备用链),您可以在其中指定您想要获取证书的一组域名以及要使用的挑战类型(支持所有 挑战类型)。此函数将第三个参数作为一个用户定义的回调函数,每当需要满足挑战时都会调用该函数。您负责设置/删除挑战令牌
$handler=function($opts){ // Write code to setup the challenge token here. // Return a function that gets called when the challenge token should be removed again: return function($opts){ // Write code to remove previously setup challenge token. }; }; $ac->getCertificateChain(..., ..., $handler);
请参阅 getCertificateChain 的描述以获取有关回调函数的详细信息。
下面也提供了 获取证书 的示例。
ACMECert 中的每个函数在失败时,而不是返回 FALSE
,都会抛出一个 异常,如果 ACME 服务器返回了错误消息,则会抛出 ACME_Exception。
要求
- PHP 5.6或更高版本(对于EC密钥PHP 7.1或更高版本)(对于ARI PHP 7.1.2或更高版本)
- OpenSSL扩展
- 启用 fopen包装器(allow_url_fopen=1)或 cURL扩展
需要ACMECert
手动下载: https://github.com/skoerfgen/ACMECert/archive/master.zip
使用方法
require 'ACMECert.php'; use skoerfgen\ACMECert\ACMECert;
或使用git下载
git clone https://github.com/skoerfgen/ACMECert
使用方法
require 'ACMECert/ACMECert.php'; use skoerfgen\ACMECert\ACMECert;
或使用composer下载
composer require skoerfgen/acmecert
使用方法
require 'vendor/autoload.php'; use skoerfgen\ACMECert\ACMECert;
用法/示例
选择证书颁发机构(CA)
Let's Encrypt
实时CA
$ac=new ACMECert('https://acme-v02.api.letsencrypt.org/directory');
预发布CA
$ac=new ACMECert('https://acme-staging-v02.api.letsencrypt.org/directory');
Buypass
实时CA
$ac=new ACMECert('https://api.buypass.com/acme/directory');
预发布CA
$ac=new ACMECert('https://api.test4.buypass.no/acme/directory');
Google Trust Services
实时CA
$ac=new ACMECert('https://dv.acme-v02.api.pki.goog/directory');
预发布CA
$ac=new ACMECert('https://dv.acme-v02.test-api.pki.goog/directory');
SSL.com
实时CA
$ac=new ACMECert('https://acme.ssl.com/sslcom-dv-rsa');
ZeroSSL
实时CA
$ac=new ACMECert('https://acme.zerossl.com/v2/DV90');
或任何其他(ACME v2 - RFC 8555)兼容的CA
$ac=new ACMECert('INSERT_URL_TO_AMCE_CA_DIRECTORY_HERE');
生成RSA私钥
$key=$ac->generateRSAKey(2048); file_put_contents('account_key.pem',$key);
等同于:
openssl genrsa -out account_key.pem 2048
生成EC私钥
$key=$ac->generateECKey('P-384'); file_put_contents('account_key.pem',$key);
等同于:
openssl ecparam -name secp384r1 -genkey -noout -out account_key.pem
在CA中注册账户密钥
$ac->loadAccountKey('file://'.'account_key.pem'); $ret=$ac->register(true,'info@example.com'); print_r($ret);
使用外部账户绑定在CA中注册账户密钥
$ac->loadAccountKey('file://'.'account_key.pem'); $ret=$ac->registerEAB(true,'INSERT_EAB_KEY_ID_HERE','INSERT_EAB_HMAC_HERE','info@example.com'); print_r($ret);
使用http-01
挑战获取证书
$ac->loadAccountKey('file://'.'account_key.pem'); $domain_config=array( 'test1.example.com'=>array('challenge'=>'http-01','docroot'=>'/var/www/vhosts/test1.example.com'), 'test2.example.com'=>array('challenge'=>'http-01','docroot'=>'/var/www/vhosts/test2.example.com') ); $handler=function($opts){ $fn=$opts['config']['docroot'].$opts['key']; @mkdir(dirname($fn),0777,true); file_put_contents($fn,$opts['value']); return function($opts){ unlink($opts['config']['docroot'].$opts['key']); }; }; // Generate new certificate key $private_key=$ac->generateRSAKey(2048); $fullchain=$ac->getCertificateChain($private_key,$domain_config,$handler); file_put_contents('fullchain.pem',$fullchain); file_put_contents('private_key.pem',$private_key);
使用所有(http-01
,dns-01
和tls-alpn-01
)挑战类型一起获取证书
$ac->loadAccountKey('file://'.'account_key.pem'); $domain_config=array( 'example.com'=>array('challenge'=>'http-01','docroot'=>'/var/www/vhosts/example.com'), '*.example.com'=>array('challenge'=>'dns-01'), 'test.example.org'=>array('challenge'=>'tls-alpn-01') ); $handler=function($opts) use ($ac){ switch($opts['config']['challenge']){ case 'http-01': // automatic example: challenge directory/file is created.. $fn=$opts['config']['docroot'].$opts['key']; @mkdir(dirname($fn),0777,true); file_put_contents($fn,$opts['value']); return function($opts) use ($fn){ // ..and removed after validation completed unlink($fn); }; break; case 'dns-01': // manual example: echo 'Create DNS-TXT-Record '.$opts['key'].' with value '.$opts['value']."\n"; readline('Ready?'); return function($opts){ echo 'Remove DNS-TXT-Record '.$opts['key'].' with value '.$opts['value']."\n"; }; break; case 'tls-alpn-01': $cert=$ac->generateALPNCertificate('file://'.'some_private_key.pem',$opts['domain'],$opts['value']); // Use $cert and some_private_key.pem(<- does not have to be a specific key, // just make sure you generated one) to serve the certificate for $opts['domain'] // This example uses an included ALPN Responder - a standalone https-server // written in a few lines of node.js - which is able to complete this challenge. // store the generated verification certificate to be used by the ALPN Responder. file_put_contents('alpn_cert.pem',$cert); // To keep this example simple, the included Example ALPN Responder listens on port 443, // so - for the sake of this example - you have to stop the webserver here, like: shell_exec('/etc/init.d/apache2 stop'); // Start ALPN Responder (requires node.js) $resource=proc_open( 'node alpn_responder.js some_private_key.pem alpn_cert.pem', array( 0=>array('pipe','r'), 1=>array('pipe','w') ), $pipes ); // wait until alpn responder is listening fgets($pipes[1]); return function($opts) use ($resource,$pipes){ // Stop ALPN Responder fclose($pipes[0]); fclose($pipes[1]); proc_close($resource); shell_exec('/etc/init.d/apache2 start'); }; break; } }; // Example for using a pre-generated CSR as input to getCertificateChain instead of a private key: // $csr=$ac->generateCSR('file://'.'cert_private_key.pem',array_keys($domain_config)); // $fullchain=$ac->getCertificateChain($csr,$domain_config,$handler); $fullchain=$ac->getCertificateChain('file://'.'cert_private_key.pem',$domain_config,$handler); file_put_contents('fullchain.pem',$fullchain);
获取备用链
$chains=$ac->getCertificateChains('file://'.'cert_private_key.pem',$domain_config,$handler); if (isset($chains['ISRG Root X1'])){ // use alternate chain 'ISRG Root X1' $fullchain=$chains['ISRG Root X1']; }else{ // use default chain if 'ISRG Root X1' is not present $fullchain=reset($chains); } file_put_contents('fullchain.pem',$fullchain);
撤销证书
$ac->loadAccountKey('file://'.'account_key.pem'); $ac->revoke('file://'.'fullchain.pem');
获取账户信息
$ac->loadAccountKey('file://'.'account_key.pem'); $ret=$ac->getAccount(); print_r($ret);
账户密钥滚动
$ac->loadAccountKey('file://'.'account_key.pem'); $ret=$ac->keyChange('file://'.'new_account_key.pem'); print_r($ret);
停用账户
$ac->loadAccountKey('file://'.'account_key.pem'); $ret=$ac->deactivateAccount(); print_r($ret);
获取/使用ACME续订信息
$ret=$ac->getARI('file://'.'fullchain.pem',$ari_cert_id); if ($ret['suggestedWindow']['start']-time()>0) { die('Certificate still good, exiting..'); } $settings=array( 'replaces'=>$ari_cert_id ); $ac->getCertificateChain(..., ..., ..., $settings);
获取剩余百分比
$percent=$ac->getRemainingPercent('file://'.'fullchain.pem'); // certificate or certificate-chain if ($precent>33.333) { // certificate has still more than 1/3 (33.333%) of its lifetime left die('Certificate still good, exiting..'); } // get new certificate here..
这允许您在不精确计时的情况下运行续订脚本,只需经常运行即可。(cronjob)
获取剩余天数
$days=$ac->getRemainingDays('file://'.'fullchain.pem'); // certificate or certificate-chain if ($days>30) { // renew 30 days before expiry die('Certificate still good, exiting..'); } // get new certificate here..
日志记录
默认情况下,ACMECert使用error_log
记录其操作,将消息记录到PHP CLI的stderr,因此它很容易记录到文件中
error_reporting(E_ALL); ini_set('log_errors',1); ini_set('error_log',dirname(__FILE__).'/ACMECert.log');
要禁用默认日志记录,您可以使用
setLogger
,异常仍然会被抛出
$ac->setLogger(false);
或者您可以将它设置为自定义回调函数
$ac->setLogger(function($txt){ echo 'Log Message: '.$txt."\n"; });
ACME_Exception
如果ACME-Server响应了一个错误消息,则抛出\skoerfgen\ACMECert\ACME_Exception
。(ACME_Exception扩展Exception)
ACME_Exception
有两个额外的函数
getType()
获取ACME错误代码
use skoerfgen\ACMECert\ACME_Exception; try { echo $ac->getAccountID().PHP_EOL; }catch(ACME_Exception $e){ if ($e->getType()=='urn:ietf:params:acme:error:accountDoesNotExist'){ echo 'Account does not exist'.PHP_EOL; }else{ throw $e; // another error occured } }
getSubproblems()
获取一个数组,其中包含ACME_Exception
,如果ACME-Server返回多个错误
try { $cert=$ac->getCertificateChain('file://'.'cert_private_key.pem',$domain_config,$handler); } catch (\skoerfgen\ACMECert\ACME_Exception $e){ $ac->log($e->getMessage()); // log original error foreach($e->getSubproblems() as $subproblem){ $ac->log($subproblem->getMessage()); // log sub errors } }
函数参考
ACMECert::__construct
创建一个新的ACMECert实例。
public ACMECert::__construct ( string $ca_url = 'https://acme-v02.api.letsencrypt.org/directory' )
参数
ca_url
包含ACME CA目录端点URL的字符串。
返回值
返回一个新的ACMECert实例。
ACMECert::generateRSAKey
生成RSA私钥(用作账户密钥或证书的私钥)。
public string ACMECert::generateRSAKey ( int $bits = 2048 )
参数
bits
RSA密钥大小(以位为单位)。
返回值
返回生成的RSA私钥为PEM编码字符串。
错误/异常
如果无法生成RSA密钥,则抛出
Exception
。
ACMECert::generateECKey
生成椭圆曲线(EC)私钥(用作账户密钥或证书的私钥)。
public string ACMECert::generateECKey ( string $curve_name = 'P-384' )
参数
curve_name
Let’s Encrypt支持曲线
P-256
(prime256v1)P-384
(secp384r1)P-521
(secp521r1)
返回值
返回生成的EC私钥为PEM编码字符串。
错误/异常
如果无法生成EC密钥,则抛出
Exception
。
ACMECert::loadAccountKey
加载账户密钥。
public void ACMECert::loadAccountKey ( mixed $account_key_pem )
参数
account_key_pem
可以是以下之一
- 包含PEM格式私钥的字符串。
- 以
file://
开头的字符串,包含读取PEM格式私钥的文件名。
返回值
无返回值。
错误/异常
如果无法加载账户密钥,则抛出
Exception
。
ACMECert::register
将加载的账户密钥与CA账户关联,并可选择指定联系人。
public array ACMECert::register ( bool $termsOfServiceAgreed = FALSE [, mixed $contacts = array() ] )
参数
termsOfServiceAgreed
通过传递
TRUE
,您同意所选CA的服务条款。(必须设置为TRUE
才能成功注册账户。)提示:使用 getTermsURL() 获取当前服务条款的链接。
contacts
可以是以下之一
- 包含电子邮件地址的字符串
- 电子邮件地址数组
返回值
返回包含账户信息的数组。
错误/异常
如果服务器响应错误消息或发生其他注册错误,则抛出
ACME_Exception
。
ACMECert::registerEAB
使用外部账户绑定(EAB)凭据将加载的账户密钥与CA账户关联,并可选择指定联系人。
public array ACMECert::registerEAB ( bool $termsOfServiceAgreed, string $eab_kid, string $eab_hmac [, mixed $contacts = array() ] )
参数
termsOfServiceAgreed
通过传递
TRUE
,您同意所选CA的服务条款。(必须设置为TRUE
才能成功注册账户。)提示:使用 getTermsURL() 获取当前服务条款的链接。
eab_kid
指定
EAB Key Identifier
的字符串
eab_hmac
指定
EAB HMAC Key
的字符串
contacts
可以是以下之一
- 包含电子邮件地址的字符串
- 电子邮件地址数组
返回值
返回包含账户信息的数组。
错误/异常
如果服务器响应错误消息或发生其他注册错误,则抛出
ACME_Exception
。
ACMECert::update
更新账户联系人。
public array ACMECert::update ( mixed $contacts = array() )
参数
contacts
可以是以下之一
- 包含电子邮件地址的字符串
- 电子邮件地址数组
返回值
返回包含账户信息的数组。
错误/异常
如果服务器响应错误消息或更新账户时发生其他错误,则抛出
ACME_Exception
。
ACMECert::getAccount
获取账户信息。
public array ACMECert::getAccount()
返回值
返回包含账户信息的数组。
错误/异常
如果服务器响应错误消息或获取账户信息时发生其他错误,则抛出
ACME_Exception
。
ACMECert::getAccountID
获取账户ID。
public string ACMECert::getAccountID()
返回值
返回账户ID
错误/异常
如果服务器响应错误消息或获取账户ID时发生其他错误,则抛出
ACME_Exception
。
ACMECert::keyChange
账户密钥轮换(交换当前账户密钥与另一个密钥)。
如果账户密钥轮换成功,则通过
loadAccountKey
自动加载新的账户密钥。
public array ACMECert::keyChange ( mixed $new_account_key_pem )
参数
new_account_key_pem
可以是以下之一
- 包含PEM格式私钥的字符串。
- 以
file://
开头的字符串,包含读取PEM格式私钥的文件名。
返回值
返回包含账户信息的数组。
错误/异常
如果服务器响应错误消息或在密钥更改过程中发生其他错误,则抛出
ACME_Exception
。
ACMECert::deactivateAccount
停用账户。
public array ACMECert::deactivateAccount()
返回值
返回包含账户信息的数组。
错误/异常
如果服务器响应错误消息或在账户停用过程中发生其他错误,则抛出
ACME_Exception
。
ACMECert::getCertificateChain
获取证书链(证书+中间证书)。
这是Apache >= 2.4.8需要的 SSLCertificateFile
,以及Nginx需要的 ssl_certificate
。
public string ACMECert::getCertificateChain ( mixed $pem, array $domain_config, callable $callback, array $settings = array() )
参数
pem
用于证书的私钥(在这种情况下,使用给定的密钥自动生成所需的CSR)或以下格式之一的现有CSR:
- 包含PEM格式私钥的字符串。
- 以
file://
开头的字符串,包含从PEM编码的私钥中读取的文件名。
或- 以
file://
开头的字符串,包含从PEM编码的CSR中读取的文件名。- 包含CSR内容的字符串,PEM编码,可能以
-----BEGIN CERTIFICATE REQUEST-----
开头
domain_config
定义获取证书的域名及其对应挑战类型的数组。
如果数组中的第一个域名不超过64个字符,则将其用作证书的
Common Name
;否则,Common Name
字段将为空。以下是一个示例结构
$domain_config=array( '*.example.com'=>array('challenge'=>'dns-01'), 'test.example.org'=>array('challenge'=>'tls-alpn-01') 'test.example.net'=>array('challenge'=>'http-01','docroot'=>'/var/www/vhosts/test1.example.com'), );提示:通配符证书(如
*.example.com
)仅支持dns-01
挑战类型。
challenge
是必填项,并且必须是以下之一:http-01
、dns-01
或tls-alpn-01
。所有其他键都是可选的,由您决定是否使用,并且在后续的回调函数中作为$opts['config']
可用(请参见 http-01 示例,其中以这种方式使用docroot
)。
回调函数
每次需要满足挑战时都会调用的回调函数。
callable callback ( array $opts )在回调函数内部,您可以返回另一个回调函数,该回调函数在验证完成且可以再次删除挑战令牌后调用。
提示:要在回调函数内部访问父作用域的变量,请使用
use
语言结构$handler=function($opts) use ($variable_from_parent_scope){}; ^^^传递给回调函数的
$opts
数组包含以下键
$opts['domain']
待验证的域名。
$opts['config']
与
domain_config
数组对应的元素。
$opts['key']
和$opts['value']
包含以下内容,具体取决于所选择的挑战类型
settings
(可选)此数组可以有以下键
authz_reuse
(布尔值 / 默认:TRUE
)如果为
FALSE
,则回调函数将始终为每个域名调用,而不会因可能已重用的有效授权(authz)而跳过。这是通过在获取新授权之前停用已有效授权来实现的。提示:在正常情况下,这仅在测试回调函数时需要,在生产环境中不需要!
notBefore
/notAfter
(混合类型)可以是以下之一
- 包含一个使用 RFC 3339 格式的日期的字符串
- 时间戳(整数)
示例:证书有效期为 3 天
array( 'notAfter' => time() + (60*60*24) * 3 )或
array( 'notAfter' => '1970-01-01T01:22:17+01:00' )
replaces
(字符串)用于唯一标识之前已颁发证书的 ARI CertID,该订单旨在替换此证书。
使用:getARI 获取证书的 ARI CertID。
返回值
返回一个 PEM 编码的证书链。
错误/异常
如果服务器响应了错误消息,则抛出
ACME_Exception
,如果获取证书时发生其他错误,则抛出Exception
。
ACMECert::getCertificateChains
获取所有(默认和备用)证书链。此函数与上面的 getCertificateChain 函数具有相同的参数,但它返回一个证书链数组,而不是单个链。
public string ACMECert::getCertificateChains ( mixed $pem, array $domain_config, callable $callback, array $settings = array() )
返回值
返回一个 PEM 编码的证书链数组。
返回数组的键对应于最顶部的(最接近根证书的)中间证书的颁发者
Common Name
(CN)。返回数组的第一个元素是默认链。
错误/异常
如果服务器响应了错误消息,则抛出
ACME_Exception
,如果获取证书链时发生其他错误,则抛出Exception
。
ACMECert::revoke
吊销证书。
public void ACMECert::revoke ( mixed $pem )
参数
pem
可以是以下之一
- 以
file://
开头的字符串,包含读取 PEM 编码证书或证书链的文件名。- 包含证书或证书链内容的字符串,PEM 编码,可能以
-----BEGIN CERTIFICATE-----
开头
返回值
无返回值。
如果没有抛出异常,则证书已被成功吊销。
错误/异常
如果服务器响应了错误消息,则抛出
ACME_Exception
,如果吊销证书时发生其他错误,则抛出Exception
。
ACMECert::generateCSR
为一系列域名生成 CSR。
public string ACMECert::generateCSR ( mixed $private_key, array $domains )
参数
private_key
可以是以下之一
- 包含PEM格式私钥的字符串。
- 以
file://
开头的字符串,包含读取PEM格式私钥的文件名。
domains
域名数组
返回值
作为字符串返回生成的 CSR。
错误/异常
如果无法生成CSR,则抛出异常。
ACMECert::generateALPNCertificate
生成一个包含用于 tls-alpn-01
挑战中的acmeIdentifier扩展的自签名验证证书。
public string ACMECert::generateALPNCertificate ( mixed $private_key, string $domain, string $token )
参数
private_key
用于证书的私钥。
可以是以下之一
- 包含PEM格式私钥的字符串。
- 以
file://
开头的字符串,包含读取PEM格式私钥的文件名。
域名
待验证的域名。
令牌
验证令牌。
返回值
返回一个PEM编码的验证证书。
错误/异常
如果无法生成证书,则抛出异常。
ACMECert::parseCertificate
获取证书信息。
public array ACMECert::parseCertificate ( mixed $pem )
参数
pem
可以是以下之一
- 以
file://
开头的字符串,包含读取 PEM 编码证书或证书链的文件名。- 包含证书或证书链内容的字符串,PEM 编码,可能以
-----BEGIN CERTIFICATE-----
开头
返回值
返回一个包含证书信息的数组。
错误/异常
如果无法解析证书,则抛出异常。
ACMECert::getRemainingPercent
获取证书仍然有效的百分比。
public float ACMECert::getRemainingPercent( mixed $pem )
参数
pem
可以是以下之一
- 以
file://
开头的字符串,包含读取 PEM 编码证书或证书链的文件名。- 包含证书或证书链内容的字符串,PEM 编码,可能以
-----BEGIN CERTIFICATE-----
开头
返回值
包含证书仍然有效的百分比的浮点数。
错误/异常
如果无法解析证书,则抛出异常。
ACMECert::getRemainingDays
获取证书仍然有效的天数。
public float ACMECert::getRemainingDays ( mixed $pem )
参数
pem
可以是以下之一
- 以
file://
开头的字符串,包含读取 PEM 编码证书或证书链的文件名。- 包含证书或证书链内容的字符串,PEM 编码,可能以
-----BEGIN CERTIFICATE-----
开头
返回值
返回证书仍然有效的天数。
错误/异常
如果无法解析证书,则抛出异常。
ACMECert::splitChain
将包含PEM编码证书链的字符串拆分为单个证书的数组。
public array ACMECert::splitChain ( string $pem )
参数
pem
- 一个证书链字符串,PEM编码。
返回值
返回一个包含PEM编码单个证书的数组。
错误/异常
None
ACMECert::getCAAIdentities
获取所选CA的所有CAA标识符。(用于设置CAA DNS记录)
public array ACMECert::getCAAIdentities()
返回值
返回一个包含所选CA的所有CAA标识符的数组。
错误/异常
如果服务器返回了错误消息,则抛出
ACME_Exception
,如果获取CAA标识符时发生其他错误,则抛出异常。
ACMECert::getSAN
获取给定证书的所有主题替代名称。
public array ACMECert::getSAN( mixed $pem )
参数
pem
可以是以下之一
- 以
file://
开头的字符串,包含读取 PEM 编码证书或证书链的文件名。- 包含证书或证书链内容的字符串,PEM 编码,可能以
-----BEGIN CERTIFICATE-----
开头
返回值
返回一个包含给定证书的所有主题替代名称的数组。
错误/异常
如果获取主题替代名称时发生错误,则抛出异常。
ACMECert::getTermsURL
获取所选CA的服务条款的URL。
public array ACMECert::getTermsURL()
返回值
返回包含所选CA的服务条款URL的字符串。
错误/异常
如果服务器返回了错误消息,则抛出
ACME_Exception
,如果获取服务条款时发生其他错误,则抛出异常。
ACMECert::setLogger
使用 error_log
启用/禁用向stderr的日志记录,或提供自定义回调函数。
public void ACMECert::setLogger( bool|callable $value = TRUE )
参数
value
- 如果
TRUE
,则启用使用error_log
向stderr的日志记录。(默认值)- 如果
FALSE
,则禁用日志记录。- 如果提供了回调函数,则函数将使用日志消息作为第一个参数调用
void callback( string $txt )参见 日志记录
返回值
无返回值。
错误/异常
如果提供的值不是布尔值或可调用的函数,则抛出异常。
ACMECert::getARI
获取给定证书的ACME续订信息(ARI)。
public array ACMECert::getARI( mixed $pem, string &$ari_cert_id = null )
参数
pem
可以是以下之一
- 以
file://
开头的字符串,包含读取 PEM 编码证书或证书链的文件名。- 包含证书或证书链内容的字符串,PEM 编码,可能以
-----BEGIN CERTIFICATE-----
开头
ari_cert_id
如果此参数存在,则将其设置为给定证书的ARI CertID。
请参阅 getCertificateChain 的文档,其中可以使用ARI CertID替换现有证书。
返回值
返回以下键的数组
suggestedWindow
(数组)包含两个键的数组,即
start
和end
,其值是Unix时间戳,它们界定CA建议续订证书的时间窗口。
explanationURL
(字符串,可选)指向一个页面的URL,该页面可能解释了建议的续订窗口为何如此。例如,这可能是一个解释CA的动态负载均衡策略的页面,或者是一个记录哪些证书受大规模吊销事件影响的页面。
错误/异常
如果服务器返回了错误消息,则抛出
ACME_Exception
,如果获取ACME续订信息时发生其他错误,则抛出异常。
MIT许可
版权所有(c)2018 Stefan Körfgen
本软件及相关的文档文件(统称为“软件”)的副本,任何获得副本的个人均可免费使用,不受限制地处理软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,并允许软件提供者进行此类操作,但需遵守以下条件:
上述版权声明和本许可声明应包含在软件的所有副本或实质部分中。
软件按“原样”提供,不提供任何形式的保证,无论是明示的还是隐含的,包括但不限于适销性、适用于特定目的和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任承担责任,无论其产生于合同、侵权或其他任何原因,与软件或其使用或其他操作有关。