skoerfgen/acmecert

用于 Let's Encrypt 和其他 ACME v2 - RFC 8555 兼容的证书授权机构的 PHP 客户端库

3.4.0 2024-07-17 20:34 UTC

This package is auto-updated.

Last update: 2024-09-13 17:46:10 UTC


README

用于 Let's Encrypt 和其他 ACME v2 - RFC 8555 兼容的证书授权机构的 PHP 客户端库。
版本:3.4.0

描述

ACMECert 是一款设计用于帮助您通过几行 PHP 代码自动设置 SSL/TLS 证书/续订过程的工具。

它独立运行,并包含一系列函数,允许您

查看 函数参考 获取完整列表

它将获取证书的复杂性抽象为 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

要求

需要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-01dns-01tls-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

可以是以下之一

  1. 包含电子邮件地址的字符串
  2. 电子邮件地址数组
返回值

返回包含账户信息的数组。

错误/异常

如果服务器响应错误消息或发生其他注册错误,则抛出 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

可以是以下之一

  1. 包含电子邮件地址的字符串
  2. 电子邮件地址数组
返回值

返回包含账户信息的数组。

错误/异常

如果服务器响应错误消息或发生其他注册错误,则抛出 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-01dns-01tls-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。

示例:获取/使用 ACME 续订信息

返回值

返回一个 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替换现有证书。

示例:获取/使用 ACME 续订信息

返回值

返回以下键的数组

suggestedWindow(数组)

包含两个键的数组,即 startend,其值是Unix时间戳,它们界定CA建议续订证书的时间窗口。

explanationURL(字符串,可选)

指向一个页面的URL,该页面可能解释了建议的续订窗口为何如此。例如,这可能是一个解释CA的动态负载均衡策略的页面,或者是一个记录哪些证书受大规模吊销事件影响的页面。

错误/异常

如果服务器返回了错误消息,则抛出 ACME_Exception,如果获取ACME续订信息时发生其他错误,则抛出异常。

MIT许可

版权所有(c)2018 Stefan Körfgen

本软件及相关的文档文件(统称为“软件”)的副本,任何获得副本的个人均可免费使用,不受限制地处理软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,并允许软件提供者进行此类操作,但需遵守以下条件:

上述版权声明和本许可声明应包含在软件的所有副本或实质部分中。

软件按“原样”提供,不提供任何形式的保证,无论是明示的还是隐含的,包括但不限于适销性、适用于特定目的和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任承担责任,无论其产生于合同、侵权或其他任何原因,与软件或其使用或其他操作有关。