Get started
Installation
You will need the PHP OpenSSL extension to use Acme PHP Core.
Install this library using Composer:
composer require acmephp/core
Usage
1. Create a secure HTTP client
A SecureHttpClient is a Guzzle HTTP client wrapper to send requests signed with the account KeyPair.
<?php
use AcmePhp\Core\Http\Base64SafeEncoder;
use AcmePhp\Core\Http\SecureHttpClientFactory;
use AcmePhp\Core\Http\ServerErrorHandler;
use AcmePhp\Ssl\KeyPair;
use AcmePhp\Ssl\PrivateKey;
use AcmePhp\Ssl\PublicKey;
use AcmePhp\Ssl\Parser\KeyParser;
use AcmePhp\Ssl\Signer\DataSigner;
use GuzzleHttp\Client as GuzzleHttpClient;
$secureHttpClientFactory = new SecureHttpClientFactory(
new GuzzleHttpClient(),
new Base64SafeEncoder(),
new KeyParser(),
new DataSigner(),
new ServerErrorHandler()
);
// $accountKeyPair instance of KeyPair
$secureHttpClient = $secureHttpClientFactory->createSecureHttpClient($accountKeyPair);
// See AcmePhp\Core\Http\SecureHttpClient for all available methods.
Generate a key pair if needed
If you don't already have a KeyPair, you can generate one:
<?php
use AcmePhp\Ssl\Generator\KeyPairGenerator;
$publicKeyPath = '/custom/path/to/keys/account.pub.pem';
$privateKeyPath = '/custom/path/to/keys/account.pem';
if (!file_exists($privateKeyPath)) {
$keyPairGenerator = new KeyPairGenerator();
$keyPair = $keyPairGenerator->generateKeyPair();
file_put_contents($publicKeyPath, $keyPair->getPublicKey()->getPEM());
file_put_contents($privateKeyPath, $keyPair->getPrivateKey()->getPEM());
} else {
$publicKey = new PublicKey(file_get_contents($publicKeyPath));
$privateKey = new PrivateKey(file_get_contents($privateKeyPath));
$keyPair = new KeyPair($publicKey, $privateKey);
}
Set up the ACME client
<?php
use AcmePhp\Core\AcmeClient;
$secureHttpClient = $secureHttpClientFactory->createSecureHttpClient($keyPair);
// Important, change to production LE directory for real certs!
$acmeClient = new AcmeClient($secureHttpClient, 'https://acme-staging-v02.api.letsencrypt.org/directory');
See AcmePhp\Core\AcmeClientInterface
and AcmePhp\Core\AcmeClientV2Interface
for detailed
explainations of each methods of the client.
Create new account
<?php
// registerAccount($agreement = null, $email = null)
$acmeClient->registerAccount(null, 'testing@tester.com');
Request authorization
<?php
// This will return a list of challenges that you can use to prove you own the domain.
$authorizationChallenges = $acmeClient->requestAuthorization('mydomain.com');
var_dump($authorizationChallenges);
// You need to stage your challenge response via DNS or HTTP before making the next call:
// $acmeClient->challengeAuthorization($authorizationChallenges[0])
Generate CSR and private key
<?php
$dn = new DistinguishedName('mydomain.com');
$keyPairGenerator = new KeyPairGenerator();
// Make a new key pair. We'll keep the private key as our cert key
$domainKeyPair = $keyPairGenerator->generateKeyPair();
// This is the private key
var_dump($domainKeyPair->getPrivateKey()->getPem());
// Generate CSR
$csr = new CertificateRequest($dn, $domainKeyPair);
Request certificate
<?php
$certificateResponse = $acmeClient->requestCertificate('mydomain.com', $csr);
// This is the certificate (public key)
var_dump($certificateResponse->getCertificate()->getPem());
// For Let's Encrypt, you will need the intermediate too
var_dump($certificateResponse->getCertificate()->getIssuerCertificate()->getPEM());