diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 16d00a9..0000000 --- a/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2016 Titouan Galopin - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/README.md b/README.md deleted file mode 100644 index fd7546b..0000000 --- a/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Acme PHP Documentation - -This repository is the documentation for the Acme PHP project. - -The documentation is rendered online at [http://acmephp.github.io/documentation](http://acmephp.github.io/documentation). diff --git a/cli/install-usage.md b/cli/install-usage.md deleted file mode 100644 index d1e27ea..0000000 --- a/cli/install-usage.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -currentMenu: cli-install-usage ---- - -# Installation and usage - -TODO diff --git a/cli/monitoring.md b/cli/monitoring.md deleted file mode 100644 index c9e2b65..0000000 --- a/cli/monitoring.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -currentMenu: cli-monitoring ---- - -# Monitoring - -TODO diff --git a/cli/post-generate.md b/cli/post-generate.md deleted file mode 100644 index 8873e3e..0000000 --- a/cli/post-generate.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -currentMenu: cli-post-generate ---- - -# Post-generate actions - -TODO diff --git a/core/get-started.html b/core/get-started.html new file mode 100644 index 0000000..7ebe9bb --- /dev/null +++ b/core/get-started.html @@ -0,0 +1,349 @@ + + + + + + + + Acme PHP | Documentation + + + + + + + + + + +
+
+

+ Acme PHP +

+ + +
+
+ +
+
+
+ +
+ +
+ + +

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());
+
+ +
+
+
+ + + + + + + + + diff --git a/core/get-started.md b/core/get-started.md deleted file mode 100644 index 991e642..0000000 --- a/core/get-started.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -currentMenu: core-get-started ---- - -# 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 - -TODO diff --git a/core/install-usage.md b/core/install-usage.md deleted file mode 100644 index 7637662..0000000 --- a/core/install-usage.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -currentMenu: core-install-usage ---- - -# Installation and usage - -TODO diff --git a/core/introduction.html b/core/introduction.html new file mode 100644 index 0000000..0c79f3f --- /dev/null +++ b/core/introduction.html @@ -0,0 +1,258 @@ + + + + + + + + Acme PHP | Documentation + + + + + + + + + + +
+
+

+ Acme PHP +

+ + +
+
+ +
+
+
+ +
+ +
+ + +

Acme PHP Core

+

Acme PHP Core is the ACME protocol implementation in PHP used by othere Acme PHP repositories +to interact with Let's Encrypt.

+

When use Acme PHP Core?

+

You usually will want to use either the Acme PHP CLI client or an implementation for your +favorite framework.

+

However, in some cases, you may want to manage your SSL certificates from the application itself. +In these cases, this library will be useful to you.

+

Acme PHP Core does nothing more than implementing the +Let's Encrypt/ACME protocol : the generated SSL keys +and certificates are stored in memory and then given to your script. You are the one in charge +of storing them somewhere.

+
+ +
+
+
+ + + + + + + + + diff --git a/core/introduction.md b/core/introduction.md deleted file mode 100644 index 71c5462..0000000 --- a/core/introduction.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -currentMenu: core-introduction ---- - -# Acme PHP Core - -> This library is a part of the [Acme PHP initiative](https://github.com/acmephp), -> aiming to intregrate [Let's Encrypt](https://github.com/acmephp) -> in the PHP world at the application level. - -Acme PHP Core is the core of the Acme PHP project : it is a basis for the others more -high-level repositories. - -## When use Acme PHP Core? - -You usually will want to use either [the Acme PHP CLI client](https://github.com/acmephp/cli) -or [an implementation for your application framework](https://github.com/acmephp). - -However, in some cases, you may want to manage from the application itself your SSL certificates. -In these cases, this library will be useful to you. - -Acme PHP Core does nothing more than implementing the -[Let's Encrypt/ACME protocol](https://github.com/letsencrypt/acme-spec) : the generated SSL keys -and certificates are stored in memory and then given to your script. You are the one in charge -of storing them somewhere. You can use -[the Acme PHP Persistence](https://github.com/acmephp/persistence) library to help you do so. diff --git a/couscous.yml b/couscous.yml deleted file mode 100644 index 2bebe79..0000000 --- a/couscous.yml +++ /dev/null @@ -1,43 +0,0 @@ -title: Acme PHP -subTitle: Let's Encrypt client written in PHP -github: - user: acmephp - repo: documentation -baseUrl: https://acmephp.github.io/documentation/ -template: - directory: theme - index: index.md -menu: - sections: - cli: - name: Command line tool - items: - cli-introduction: - text: Introduction - cli-install-usage: - text: Installation and usage - relativeUrl: cli/install-usage.html - cli-post-generate: - text: Post-generate actions - relativeUrl: cli/post-generate.html - cli-monitoring: - text: Monitoring - relativeUrl: cli/monitoring.html - symfony: - name: Symfony bundle (not ready) - items: - symfony-install-usage: - text: Installation and usage - relativeUrl: symfony/install-usage.html - core: - name: Acme PHP library - items: - core-install-usage: - text: Installation and usage - relativeUrl: core/install-usage.html - ssl: - name: SSL library - items: - ssl-introduction: - text: Installation and usage - relativeUrl: ssl/install-usage.html diff --git a/fonts/avenir-next-lt-pro/AvenirNextLTPro-Bold.woff b/fonts/avenir-next-lt-pro/AvenirNextLTPro-Bold.woff new file mode 100644 index 0000000..1c4d9aa Binary files /dev/null and b/fonts/avenir-next-lt-pro/AvenirNextLTPro-Bold.woff differ diff --git a/fonts/avenir-next-lt-pro/AvenirNextLTPro-BoldCn.woff b/fonts/avenir-next-lt-pro/AvenirNextLTPro-BoldCn.woff new file mode 100644 index 0000000..f721bae Binary files /dev/null and b/fonts/avenir-next-lt-pro/AvenirNextLTPro-BoldCn.woff differ diff --git a/fonts/avenir-next-lt-pro/AvenirNextLTPro-BoldCnIt.woff b/fonts/avenir-next-lt-pro/AvenirNextLTPro-BoldCnIt.woff new file mode 100644 index 0000000..0e626d8 Binary files /dev/null and b/fonts/avenir-next-lt-pro/AvenirNextLTPro-BoldCnIt.woff differ diff --git a/fonts/avenir-next-lt-pro/AvenirNextLTPro-Cn.woff b/fonts/avenir-next-lt-pro/AvenirNextLTPro-Cn.woff new file mode 100644 index 0000000..7629837 Binary files /dev/null and b/fonts/avenir-next-lt-pro/AvenirNextLTPro-Cn.woff differ diff --git a/fonts/avenir-next-lt-pro/AvenirNextLTPro-CnIt.woff b/fonts/avenir-next-lt-pro/AvenirNextLTPro-CnIt.woff new file mode 100644 index 0000000..60ec20d Binary files /dev/null and b/fonts/avenir-next-lt-pro/AvenirNextLTPro-CnIt.woff differ diff --git a/fonts/avenir-next-lt-pro/AvenirNextLTPro-Demi.woff b/fonts/avenir-next-lt-pro/AvenirNextLTPro-Demi.woff new file mode 100644 index 0000000..9d070c1 Binary files /dev/null and b/fonts/avenir-next-lt-pro/AvenirNextLTPro-Demi.woff differ diff --git a/fonts/avenir-next-lt-pro/AvenirNextLTPro-DemiCn.woff b/fonts/avenir-next-lt-pro/AvenirNextLTPro-DemiCn.woff new file mode 100644 index 0000000..bdd0cc9 Binary files /dev/null and b/fonts/avenir-next-lt-pro/AvenirNextLTPro-DemiCn.woff differ diff --git a/fonts/avenir-next-lt-pro/AvenirNextLTPro-DemiCnIt.woff b/fonts/avenir-next-lt-pro/AvenirNextLTPro-DemiCnIt.woff new file mode 100644 index 0000000..68d281c Binary files /dev/null and b/fonts/avenir-next-lt-pro/AvenirNextLTPro-DemiCnIt.woff differ diff --git a/fonts/avenir-next-lt-pro/AvenirNextLTPro-DemiIt.woff b/fonts/avenir-next-lt-pro/AvenirNextLTPro-DemiIt.woff new file mode 100644 index 0000000..28c93a8 Binary files /dev/null and b/fonts/avenir-next-lt-pro/AvenirNextLTPro-DemiIt.woff differ diff --git a/fonts/avenir-next-lt-pro/AvenirNextLTPro-HeavyCn.woff b/fonts/avenir-next-lt-pro/AvenirNextLTPro-HeavyCn.woff new file mode 100644 index 0000000..e04a5a1 Binary files /dev/null and b/fonts/avenir-next-lt-pro/AvenirNextLTPro-HeavyCn.woff differ diff --git a/fonts/avenir-next-lt-pro/AvenirNextLTPro-HeavyCnIt.woff b/fonts/avenir-next-lt-pro/AvenirNextLTPro-HeavyCnIt.woff new file mode 100644 index 0000000..a385ee3 Binary files /dev/null and b/fonts/avenir-next-lt-pro/AvenirNextLTPro-HeavyCnIt.woff differ diff --git a/fonts/avenir-next-lt-pro/AvenirNextLTPro-It.woff b/fonts/avenir-next-lt-pro/AvenirNextLTPro-It.woff new file mode 100644 index 0000000..bebc47b Binary files /dev/null and b/fonts/avenir-next-lt-pro/AvenirNextLTPro-It.woff differ diff --git a/fonts/avenir-next-lt-pro/AvenirNextLTPro-MediumCn.woff b/fonts/avenir-next-lt-pro/AvenirNextLTPro-MediumCn.woff new file mode 100644 index 0000000..5c84d72 Binary files /dev/null and b/fonts/avenir-next-lt-pro/AvenirNextLTPro-MediumCn.woff differ diff --git a/fonts/avenir-next-lt-pro/AvenirNextLTPro-MediumCnIt.woff b/fonts/avenir-next-lt-pro/AvenirNextLTPro-MediumCnIt.woff new file mode 100644 index 0000000..ffc1b3a Binary files /dev/null and b/fonts/avenir-next-lt-pro/AvenirNextLTPro-MediumCnIt.woff differ diff --git a/fonts/avenir-next-lt-pro/AvenirNextLTPro-Regular.woff b/fonts/avenir-next-lt-pro/AvenirNextLTPro-Regular.woff new file mode 100644 index 0000000..f9c687b Binary files /dev/null and b/fonts/avenir-next-lt-pro/AvenirNextLTPro-Regular.woff differ diff --git a/fonts/avenir-next-lt-pro/AvenirNextLTPro-UltLtCn.woff b/fonts/avenir-next-lt-pro/AvenirNextLTPro-UltLtCn.woff new file mode 100644 index 0000000..a059492 Binary files /dev/null and b/fonts/avenir-next-lt-pro/AvenirNextLTPro-UltLtCn.woff differ diff --git a/fonts/avenir-next-lt-pro/AvenirNextLTPro-UltLtCnIt.woff b/fonts/avenir-next-lt-pro/AvenirNextLTPro-UltLtCnIt.woff new file mode 100644 index 0000000..52db7bb Binary files /dev/null and b/fonts/avenir-next-lt-pro/AvenirNextLTPro-UltLtCnIt.woff differ diff --git a/fonts/fonts.css b/fonts/fonts.css new file mode 100644 index 0000000..85c4739 --- /dev/null +++ b/fonts/fonts.css @@ -0,0 +1,202 @@ +@font-face { + font-family: 'Avenir Next LT Pro Condensed'; + font-style: normal; + font-weight: normal; + src: local('Avenir Next LT Pro Condensed'), url('avenir-next-lt-pro/AvenirNextLTPro-Cn.woff') format('woff'); +} + +@font-face { + font-family: 'Avenir Next LT Pro Demi'; + font-style: normal; + font-weight: normal; + src: local('Avenir Next LT Pro Demi'), url('avenir-next-lt-pro/AvenirNextLTPro-Demi.woff') format('woff'); +} + +@font-face { + font-family: 'Avenir Next LT Pro Demi Condensed'; + font-style: normal; + font-weight: normal; + src: local('Avenir Next LT Pro Demi Condensed'), url('avenir-next-lt-pro/AvenirNextLTPro-DemiCn.woff') format('woff'); +} + +@font-face { + font-family: 'Avenir Next LT Pro Heavy Condensed'; + font-style: normal; + font-weight: normal; + src: local('Avenir Next LT Pro Heavy Condensed'), url('avenir-next-lt-pro/AvenirNextLTPro-HeavyCn.woff') format('woff'); +} + +@font-face { + font-family: 'Avenir Next LT Pro Medium Condensed'; + font-style: normal; + font-weight: normal; + src: local('Avenir Next LT Pro Medium Condensed'), url('avenir-next-lt-pro/AvenirNextLTPro-MediumCn.woff') format('woff'); +} + +@font-face { + font-family: 'Avenir Next LT Pro Regular'; + font-style: normal; + font-weight: normal; + src: local('Avenir Next LT Pro Regular'), url('avenir-next-lt-pro/AvenirNextLTPro-Regular.woff') format('woff'); +} + +@font-face { + font-family: 'Avenir Next LT Pro Ultra Light Condensed'; + font-style: normal; + font-weight: normal; + src: local('Avenir Next LT Pro Ultra Light Condensed'), url('avenir-next-lt-pro/AvenirNextLTPro-UltLtCn.woff') format('woff'); +} + +@font-face { + font-family: 'Avenir Next LT Pro Bold'; + font-style: normal; + font-weight: normal; + src: local('Avenir Next LT Pro Bold'), url('avenir-next-lt-pro/AvenirNextLTPro-Bold.woff') format('woff'); +} + +@font-face { + font-family: 'Avenir Next LT Pro Bold Condensed'; + font-style: normal; + font-weight: normal; + src: local('Avenir Next LT Pro Bold Condensed'), url('avenir-next-lt-pro/AvenirNextLTPro-BoldCn.woff') format('woff'); +} + +@font-face { + font-family: 'Avenir Next LT Pro Bold Condensed Italic'; + font-style: normal; + font-weight: normal; + src: local('Avenir Next LT Pro Bold Condensed Italic'), url('avenir-next-lt-pro/AvenirNextLTPro-BoldCnIt.woff') format('woff'); +} + +@font-face { + font-family: 'Avenir Next LT Pro Condensed Italic'; + font-style: normal; + font-weight: normal; + src: local('Avenir Next LT Pro Condensed Italic'), url('avenir-next-lt-pro/AvenirNextLTPro-CnIt.woff') format('woff'); +} + +@font-face { + font-family: 'Avenir Next LT Pro Demi Condensed Italic'; + font-style: normal; + font-weight: normal; + src: local('Avenir Next LT Pro Demi Condensed Italic'), url('avenir-next-lt-pro/AvenirNextLTPro-DemiCnIt.woff') format('woff'); +} + +@font-face { + font-family: 'Avenir Next LT Pro Demi Italic'; + font-style: normal; + font-weight: normal; + src: local('Avenir Next LT Pro Demi Italic'), url('avenir-next-lt-pro/AvenirNextLTPro-DemiIt.woff') format('woff'); +} + +@font-face { + font-family: 'Avenir Next LT Pro Heavy Condensed Italic'; + font-style: normal; + font-weight: normal; + src: local('Avenir Next LT Pro Heavy Condensed Italic'), url('avenir-next-lt-pro/AvenirNextLTPro-HeavyCnIt.woff') format('woff'); +} + +@font-face { + font-family: 'Avenir Next LT Pro Italic'; + font-style: normal; + font-weight: normal; + src: local('Avenir Next LT Pro Italic'), url('avenir-next-lt-pro/AvenirNextLTPro-It.woff') format('woff'); +} + +@font-face { + font-family: 'Avenir Next LT Pro Medium Condensed Italic'; + font-style: normal; + font-weight: normal; + src: local('Avenir Next LT Pro Medium Condensed Italic'), url('avenir-next-lt-pro/AvenirNextLTPro-MediumCnIt.woff') format('woff'); +} + +@font-face { + font-family: 'Avenir Next LT Pro Ultra Light Condensed Italic'; + font-style: normal; + font-weight: normal; + src: local('Avenir Next LT Pro Ultra Light Condensed Italic'), url('avenir-next-lt-pro/AvenirNextLTPro-UltLtCnIt.woff') format('woff'); +} + +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: normal; + src: local('Source Sans Pro'), url('source-sans-pro/SourceSansPro-Regular.woff') format('woff'); +} + +@font-face { + font-family: 'Source Sans Pro ExtraLight'; + font-style: normal; + font-weight: normal; + src: local('Source Sans Pro ExtraLight'), url('source-sans-pro/SourceSansPro-ExtraLight.woff') format('woff'); +} + +@font-face { + font-family: 'Source Sans Pro Light'; + font-style: normal; + font-weight: normal; + src: local('Source Sans Pro Light'), url('source-sans-pro/SourceSansPro-Light.woff') format('woff'); +} + +@font-face { + font-family: 'Source Sans Pro Black'; + font-style: normal; + font-weight: normal; + src: local('Source Sans Pro Black'), url('source-sans-pro/SourceSansPro-Black.woff') format('woff'); +} + +@font-face { + font-family: 'Source Sans Pro Semibold Italic'; + font-style: normal; + font-weight: normal; + src: local('Source Sans Pro Semibold Italic'), url('source-sans-pro/SourceSansPro-SemiboldIt.woff') format('woff'); +} + +@font-face { + font-family: 'Source Sans Pro Semibold'; + font-style: normal; + font-weight: normal; + src: local('Source Sans Pro Semibold'), url('source-sans-pro/SourceSansPro-Semibold.woff') format('woff'); +} + +@font-face { + font-family: 'Source Sans Pro Light Italic'; + font-style: normal; + font-weight: normal; + src: local('Source Sans Pro Light Italic'), url('source-sans-pro/SourceSansPro-LightIt.woff') format('woff'); +} + +@font-face { + font-family: 'Source Sans Pro Bold Italic'; + font-style: normal; + font-weight: normal; + src: local('Source Sans Pro Bold Italic'), url('source-sans-pro/SourceSansPro-BoldIt.woff') format('woff'); +} + +@font-face { + font-family: 'Source Sans Pro Bold'; + font-style: normal; + font-weight: normal; + src: local('Source Sans Pro Bold'), url('source-sans-pro/SourceSansPro-Bold.woff') format('woff'); +} + +@font-face { + font-family: 'Source Sans Pro Italic'; + font-style: normal; + font-weight: normal; + src: local('Source Sans Pro Italic'), url('source-sans-pro/SourceSansPro-It.woff') format('woff'); +} + +@font-face { + font-family: 'Source Sans Pro ExtraLight Italic'; + font-style: normal; + font-weight: normal; + src: local('Source Sans Pro ExtraLight Italic'), url('source-sans-pro/SourceSansPro-ExtraLightIt.woff') format('woff'); +} + +@font-face { + font-family: 'Source Sans Pro Black Italic'; + font-style: normal; + font-weight: normal; + src: local('Source Sans Pro Black Italic'), url('source-sans-pro/SourceSansPro-BlackIt.woff') format('woff'); +} diff --git a/fonts/source-sans-pro/SourceSansPro-Black.woff b/fonts/source-sans-pro/SourceSansPro-Black.woff new file mode 100644 index 0000000..9d490f3 Binary files /dev/null and b/fonts/source-sans-pro/SourceSansPro-Black.woff differ diff --git a/fonts/source-sans-pro/SourceSansPro-BlackIt.woff b/fonts/source-sans-pro/SourceSansPro-BlackIt.woff new file mode 100644 index 0000000..3c7a6f2 Binary files /dev/null and b/fonts/source-sans-pro/SourceSansPro-BlackIt.woff differ diff --git a/fonts/source-sans-pro/SourceSansPro-Bold.woff b/fonts/source-sans-pro/SourceSansPro-Bold.woff new file mode 100644 index 0000000..b0a72be Binary files /dev/null and b/fonts/source-sans-pro/SourceSansPro-Bold.woff differ diff --git a/fonts/source-sans-pro/SourceSansPro-BoldIt.woff b/fonts/source-sans-pro/SourceSansPro-BoldIt.woff new file mode 100644 index 0000000..72f547a Binary files /dev/null and b/fonts/source-sans-pro/SourceSansPro-BoldIt.woff differ diff --git a/fonts/source-sans-pro/SourceSansPro-ExtraLight.woff b/fonts/source-sans-pro/SourceSansPro-ExtraLight.woff new file mode 100644 index 0000000..eb709c3 Binary files /dev/null and b/fonts/source-sans-pro/SourceSansPro-ExtraLight.woff differ diff --git a/fonts/source-sans-pro/SourceSansPro-ExtraLightIt.woff b/fonts/source-sans-pro/SourceSansPro-ExtraLightIt.woff new file mode 100644 index 0000000..0e0ac8a Binary files /dev/null and b/fonts/source-sans-pro/SourceSansPro-ExtraLightIt.woff differ diff --git a/fonts/source-sans-pro/SourceSansPro-It.woff b/fonts/source-sans-pro/SourceSansPro-It.woff new file mode 100644 index 0000000..e7c1c45 Binary files /dev/null and b/fonts/source-sans-pro/SourceSansPro-It.woff differ diff --git a/fonts/source-sans-pro/SourceSansPro-Light.woff b/fonts/source-sans-pro/SourceSansPro-Light.woff new file mode 100644 index 0000000..546b604 Binary files /dev/null and b/fonts/source-sans-pro/SourceSansPro-Light.woff differ diff --git a/fonts/source-sans-pro/SourceSansPro-LightIt.woff b/fonts/source-sans-pro/SourceSansPro-LightIt.woff new file mode 100644 index 0000000..3da927c Binary files /dev/null and b/fonts/source-sans-pro/SourceSansPro-LightIt.woff differ diff --git a/fonts/source-sans-pro/SourceSansPro-Regular.woff b/fonts/source-sans-pro/SourceSansPro-Regular.woff new file mode 100644 index 0000000..d2fcb0b Binary files /dev/null and b/fonts/source-sans-pro/SourceSansPro-Regular.woff differ diff --git a/fonts/source-sans-pro/SourceSansPro-Semibold.woff b/fonts/source-sans-pro/SourceSansPro-Semibold.woff new file mode 100644 index 0000000..10a9385 Binary files /dev/null and b/fonts/source-sans-pro/SourceSansPro-Semibold.woff differ diff --git a/fonts/source-sans-pro/SourceSansPro-SemiboldIt.woff b/fonts/source-sans-pro/SourceSansPro-SemiboldIt.woff new file mode 100644 index 0000000..3231515 Binary files /dev/null and b/fonts/source-sans-pro/SourceSansPro-SemiboldIt.woff differ diff --git a/getting-started/1-installation.html b/getting-started/1-installation.html new file mode 100644 index 0000000..9c23662 --- /dev/null +++ b/getting-started/1-installation.html @@ -0,0 +1,265 @@ + + + + + + + + Acme PHP | Documentation + + + + + + + + + + +
+
+

+ Acme PHP +

+ + +
+
+ +
+
+
+ +
+ +
+ + +

Installation

+

Acme PHP is available as a single PHAR file to download on Github. For security purposes, +this PHAR file is signed using OpenSSL to ensure you are using a valid Acme PHP binary.

+

You can install it by running the following commands:

+
cd ~
+php -r "copy('https://github.com/acmephp/acmephp/releases/download/1.0.1/acmephp.phar', 'acmephp.phar');"
+php -r "copy('https://github.com/acmephp/acmephp/releases/download/1.0.1/acmephp.phar.pubkey', 'acmephp.phar.pubkey');"
+php acmephp.phar --version
+

If the last command display the Acme PHP version, you are ready to use Acme PHP.

+

Use the latest development version

+

While we strongly recommand you to use a stable (or at least pre-release) version, you can also use the latest +development build if you need the latest features.

+

You can install it by running the following commands:

+
cd ~
+php -r "copy('https://acmephp.github.io/downloads/acmephp.phar', 'acmephp.phar');"
+php -r "copy('https://acmephp.github.io/downloads/acmephp.phar.pubkey', 'acmephp.phar.pubkey');"
+php acmephp.phar --version
+
+

Next: Obtain a certificate

+
+ +
+
+
+ + + + + + + + + diff --git a/getting-started/2-obtain-certificate-easy.html b/getting-started/2-obtain-certificate-easy.html new file mode 100644 index 0000000..a9e8570 --- /dev/null +++ b/getting-started/2-obtain-certificate-easy.html @@ -0,0 +1,301 @@ + + + + + + + + Acme PHP | Documentation + + + + + + + + + + +
+
+

+ Acme PHP +

+ + +
+
+ +
+
+
+ +
+ +
+ + +

Obtain a certificate

+

Now Acme PHP is available on your system (php acmephp.phar --version should display its version), +you can start requesting certificates for your domains using it.

+

Note: This is the recommended way to request a certificate, but you can +achieve the same purpose by following the long way and running several +commands one by one

+

1. Create a configuration file

+
contact_email: contact@company
+
+defaults:
+  distinguished_name:
+      country: FR
+      locality: Paris
+      organization_name: MyCompany
+  solver: http
+
+certificates:
+  - domain: example.com
+    distinguished_name:
+      organization_name: MyCompany Internal
+    solver: route53
+    subject_alternative_names:
+      - '*.example.com'
+      - www.subdomain.example.com
+    install:
+      - action: install_aws_elb
+        region: eu-west-1
+        loadbalancer: my_elb
+        listener: 443
+  - domain: www.example.com
+    solver:
+      name: http-file
+      adapter: ftp       # ftp or sftp or local, see https://flysystem.thephpleague.com/
+      root: /var/www/
+      host: ftp.example.com
+      username: username
+      password: password
+      # port: 21
+      # passive: true
+      # ssl: true
+      # timeout: 30
+      # private_key: path/to/or/contents/of/privatekey
+

2. Get your certificate

+
php acmephp.phar run config.yml
+

This command will do many things:

+
    +
  • register your account key in the Let's Encrypt/ACME server, associating it with your e-mail address
  • +
  • for each certificate configured in the file
  • +
  • ask the ACME server for a token and ask to the configured solver to expose the token
  • +
  • locally check that the token is well exposed
  • +
  • ask the ACME server to validate the domain
  • +
  • ask the ACME server to generate a certificate
  • +
  • install the certificate by using the configured action
  • +
+

Next: Configure your webserver

+
+ +
+
+
+ + + + + + + + + diff --git a/getting-started/2-obtain-certificate-hard.html b/getting-started/2-obtain-certificate-hard.html new file mode 100644 index 0000000..893ce27 --- /dev/null +++ b/getting-started/2-obtain-certificate-hard.html @@ -0,0 +1,354 @@ + + + + + + + + Acme PHP | Documentation + + + + + + + + + + +
+
+

+ Acme PHP +

+ + +
+
+ +
+
+
+ +
+ +
+ + +

Obtain a certificate

+

Now Acme PHP is available on your system (php acmephp.phar --version should display its version), +you can start requesting certificates for your domains using it.

+

Note: This is the long way to abtain a certificate. The +recommended way describe here

+

Several steps are required to do so (note that only the 4th one will be necessary during renewal):

+
    +
  1. Register on the Let's Encrypt/ACME server
  2. +
  3. Prove you own the domain
  4. +
  5. Ask the server to check your proof
  6. +
  7. Get your certificate
  8. +
  9. Renew your certificate
  10. +
  11. List the certificates handled by Acme PHP
  12. +
+

1. Register on the Let's Encrypt/ACME server

+

The first thing we need to do is to generate a global private key (your "account key") that will be +used for future exchanges with Let's Encrypt to prove your identity.

+

To do so, run the following command:

+
php acmephp.phar register youremail@example.com
+

This command will do three main things:

+
    +
  • create a default configuration file ~/.acmephp/acmephp.conf that you may edit for advanced usages of Acme PHP
  • +
  • generate a key pair for your account and store it in ~/.acmephp/master/account
  • +
  • register your account key in the Let's Encrypt/ACME server, associating it with your e-mail address
  • +
+

2. Prove you own the domain

+

You can only request certificates for domains you own so you need to prove to the Let's Encrypt server that you own +the domain.

+

The principle is quite simple:

+
    +
  • You ask the server for a token and expose it on a specific URL given by the server
  • +
  • The server check that URL and verify the token is properly exposed there
  • +
+

Note: This technique is called HTTP checking as it uses a HTTP request to check your ownership. +You can also use DNS checking which uses a DNS TXT field to expose the token +(it may be easier in your specific context).

+

Using this technique, you proved your server is responding behind the concerned domain.

+

Note: You'll need to periodically prove that you own a domain (certificates renewals may require a new token).

+

The first step is to get and expose the token. Run the following:

+
# Get a token to expose
+php acmephp.phar authorize yourdomain.org
+
+# The command will display explainations to help you expose the token properly.
+# Usually, a simple text file is enough to expose the token.
+

3. Ask the server to check your proof

+

Once the token exposed (don't hesitate to check in your browser), run the following command to ask the server +to check your proof:

+
php acmephp.phar check yourdomain.org
+
+# The server will check the URL for the token to expose. If it succeeds, you will be able to request certificate
+# for this domain.
+

If there is an issue, you will usually have a message describing the problem. If you are stuck, don't hesitate to +ask on Github issues.

+

4. Get your certificate

+

Finally! You are the proved owner of your domain, you can now request and renew a certificate for this domain. +To do so, simply run the request command:

+
php acmephp.phar request yourdomain.org
+

This command will ask you required informations for the certificate, request it to the server and store it in +the ~/.acmephp storage directory.

+

6 files will be created in the storage directory:

+
    +
  • +

    The full-chain certificate at ~/.acmephp/master/certs/yourdomain.org/fullchain.pem. +This file is the certificate itself. You probably want to use this file in your webserver configuration as it +includes all the issuers chain for a better compatibility with old devices.

    +
  • +
  • +

    The certificate private key at ~/.acmephp/master/private/yourdomain.org/private.pem. +This file is usually required by the webserver.

    +
  • +
  • +

    The chain alone at ~/.acmephp/master/certs/yourdomain.org/chain.pem. +Some webservers requires a separated chain and certificate. This is the chain part, if you need it.

    +
  • +
  • +

    The certificate alone at ~/.acmephp/master/certs/yourdomain.org/cert.pem. +Some webservers requires a separated chain and certificate. This is the certificate part, if you need it.

    +
  • +
  • +

    The combined certificate at ~/.acmephp/master/certs/yourdomain.org/combined.pem. +Some webservers requires a single file combining the full-chain and the certificate private key. +This is it, if you need it.

    +
  • +
  • The certificate public key at ~/.acmephp/master/private/yourdomain.org/public.pem. +You probably won't need it, but it's still available here.
  • +
+

You can now configure your webserver!

+

5. Renew your certificate

+

If a certificate will expire soon, you will probably want to renew it. To do so, simply rerun the request command:

+
php acmephp.phar request yourdomain.org
+

This time, the command won't ask you anything (all the required informations were stored at the first request). +The certificate will be renewed.

+

Please note that there may be a limit of renewals per day or week depending on the configuration of the ACME server. +Let's Encrypt has this kind of limitation: renew only when required (one week before expiration for instance).

+

By default, the request command won't renew until one week before the expiration of the certificate. Therefore you +can put it as a CRON every day and it will renew only when required.

+

6. List the certificates handled by Acme PHP

+

Using the command ./acmephp.phar status, you can see what certificates are handled by the Acme PHP client +and when they will expire. It's a useful tool to avoid expired certificates:

+
php acmephp.phar status
+
++---------------+----------------------------+---------------------+---------------------+----------------+
+| Domain        | Issuer                     | Valid from          | Valid to            | Needs renewal? |
++---------------+----------------------------+---------------------+---------------------+----------------+
+| acmephp.com   | Let's Encrypt Authority X3 | 2016-06-17 13:08:00 | 2016-09-15 13:08:00 | No             |
++---------------+----------------------------+---------------------+---------------------+----------------+
+
+

Next: Configure your webserver

+
+ +
+
+
+ + + + + + + + + diff --git a/getting-started/3-configure-webserver.html b/getting-started/3-configure-webserver.html new file mode 100644 index 0000000..66782f4 --- /dev/null +++ b/getting-started/3-configure-webserver.html @@ -0,0 +1,294 @@ + + + + + + + + Acme PHP | Documentation + + + + + + + + + + +
+
+

+ Acme PHP +

+ + +
+
+ +
+
+
+ +
+ +
+ + +

Configure your webserver

+

You have your certificate, the next step is to configure your webserver to use it.

+

Mozilla SSL Configuration Generator

+

A wonderful tool to generate an SSL configuration suited to your needs is the +Mozilla SSL Configuration Generator.

+

We recommand you to use it as it will generate for you a secure and complete configuration and +you will be able to tweak the configuration for your audience.

+

The following configuration examples are based on this tool.

+

Apache 2.2.32

+
<VirtualHost *:443>
+    ...
+    SSLEngine on
+    SSLCertificateFile      /home/youruser/.acmephp/master/certs/yourdomain.org/public/cert.pem
+    SSLCertificateKeyFile   /home/youruser/.acmephp/master/certs/yourdomain.org/private/key.private.pem
+    SSLCertificateChainFile /home/youruser/.acmephp/master/certs/yourdomain.org/public/fullchain.pem
+    ...
+</VirtualHost>
+

Apache 2.4.18

+
<VirtualHost *:443>
+    ...
+    SSLEngine on
+    SSLCertificateFile      /home/youruser/.acmephp/master/certs/yourdomain.org/public/fullchain.pem
+    SSLCertificateKeyFile   /home/youruser/.acmephp/master/certs/yourdomain.org/private/key.private.pem
+    ...
+</VirtualHost>
+

nginx 1.9.5

+
server {
+    listen 443 ssl http2;
+    listen [::]:443 ssl http2;
+
+    ssl_certificate     /home/youruser/.acmephp/master/certs/yourdomain.org/public/fullchain.pem;
+    ssl_certificate_key /home/youruser/.acmephp/master/certs/yourdomain.org/private/key.private.pem;
+
+    ....
+}
+

lighttpd 1.4.37

+
$SERVER["socket"] == ":443" {
+    ...
+    ssl.pemfile = "/home/youruser/.acmephp/master/certs/yourdomain.org/private/combined.pem"
+    ...
+}
+

haproxy 1.5.14

+
frontend ft_test
+    ...
+    bind    :443 ssl crt /home/youruser/.acmephp/master/certs/yourdomain.org/private/combined.pem
+    ...
+
+

Next: Configure automatic renewal

+
+ +
+
+
+ + + + + + + + + diff --git a/getting-started/4-automatic-renewal.html b/getting-started/4-automatic-renewal.html new file mode 100644 index 0000000..e3269d2 --- /dev/null +++ b/getting-started/4-automatic-renewal.html @@ -0,0 +1,298 @@ + + + + + + + + Acme PHP | Documentation + + + + + + + + + + +
+
+

+ Acme PHP +

+ + +
+
+ +
+
+
+ +
+ +
+ + +

Setup automatic renewal with monitoring

+

An awesome feature coming with Let's Encrypt automation is the possibility of automatically renew your certificates. +Acme PHP was built from the beginning with the idea to be easy to put in a CRON.

+

Create the CRON

+

The easiest part is to create the CRON.

+

Acme PHP is smart enough to know when to renew a certificate: you don't need to think carefully when to schedule your +CRON task, simply run it every day and Acme PHP will check if the certificate needs renewal.

+

Note: a vast majority of webservers requires a restart or a reload after a certificate update, therefore you +should run your CRON as root. You can also create two separate CRON if you don't want to execute Acme PHP as root.

+

Here is an example:

+
0 0 * * * php /home/youruser/acmephp.phar request yourdomain.org >/dev/null 2>&1 && service nginx reload
+

You may also want to save the output to a log file (note that monitoring is much more powerful though):

+
0 0 * * * php /home/youruser/acmephp.phar request yourdomain.org >> /var/log/acmephp.log && service nginx reload
+

Configure monitoring

+

A very powerful feature of Acme PHP is monitoring: the CLI client will warn you when a renewal failed. Different +alerts are available, such as e-mail or Slack.

+

To enable monitoring, you need to edit the Acme PHP configuration file (~/.acmephp/acmephp.conf):

+
###################################################################
+# Monitoring
+#
+# This section let you configure a simple monitoring mechanism that
+# will warn you if an error occurs during a CRON job.
+#
+
+monitoring: ~   # Monitoring is disabled by default
+
+# You can enabled it by configuring at least one alert handler.
+# You can change the default handler level to decide when to be alerted
+# (only when an error occurs or every time the CRON is started).
+#monitoring:
+#    email:   # Only SMTP(S) support for now
+#        to: galopintitouan@gmail.com
+#        host: smtp.example.com
+#        # port: 25
+#        # username: ~
+#        # password: ~
+#        # encryption: ~
+#        # subject: An error occured during Acme PHP CRON renewal
+#        # level: error     # By default, only on error for email handler
+#
+#    slack:
+#        token: your_token
+#        channel: #general
+#        # username: Acme PHP
+#        # level: info      # By default, on every CRON for slack handler
+

This configuration is quite straight-forward: simply remove the monitoring: ~ line, uncomment the monitoring part +and edit it to your needs.

+

Note that there are two levels for monitoring alert handlers:

+
    +
  • info level means that the handler will be triggered at every renewal, even if it succeeded ;
  • +
  • error level means that the handler will be triggered only if an error occurs during renewal ;
  • +
+
+ +
+
+
+ + + + + + + + + diff --git a/guides/copy-network.html b/guides/copy-network.html new file mode 100644 index 0000000..c0460dd --- /dev/null +++ b/guides/copy-network.html @@ -0,0 +1,248 @@ + + + + + + + + Acme PHP | Documentation + + + + + + + + + + +
+
+

+ Acme PHP +

+ + +
+
+ +
+
+
+ +
+ +
+ + +

Copy your certificates over the network

+

TODO

+
+ +
+
+
+ + + + + + + + + diff --git a/guides/dns-challenge.html b/guides/dns-challenge.html new file mode 100644 index 0000000..8a9b4f0 --- /dev/null +++ b/guides/dns-challenge.html @@ -0,0 +1,278 @@ + + + + + + + + Acme PHP | Documentation + + + + + + + + + + +
+
+

+ Acme PHP +

+ + +
+
+ +
+
+
+ +
+ +
+ + +

Use the DNS challenge to prove you own a domain

+

By default, Acme PHP will use a HTTP challenge to prove you own a domain: you will create a file the ACME server +will access to verify the token you exposed.

+

However it is possible to use DNS to check your ownership over a domain: instead of exposing a file, you will expose +a TXT field.

+

Get the token to expose

+

To use DNS challenge, run the authorize command with the --solver dns argument:

+
$ php acmephp.phar authorize --solver dns yourdomain.org
+
+The authorization token was successfully fetched!
+    Add the following TXT record to your DNS zone
+        Domain: _acme-challenge.yourdomain.org.
+        TXT value: zExIQaKdxouvZ6rbpYApsawiwgINj3zbmXym-KhuNsA
+
+    Wait for the propagation before moving to the next step
+    Tips: Use the following command to check the propagation
+
+        host -t TXT _acme-challenge.yourdomain.org.
+
+Then, you can ask to the CA to check the challenge!
+    Call the check command to ask the server to check your URL:
+
+    php acmephp.phar check -s dns yourdomain.org
+

Add a DNS TXT field for the token

+

You have now to create a DNS TXT field for the token:

+
Add the following TXT record to your DNS zone
+    Domain: _acme-challenge.yourdomain.org.
+    TXT value: zExIQaKdxouvZ6rbpYApsawiwgINj3zbmXym-KhuNsA
+

Ask for the server to check your proof

+

Once done, wait a few minutes for DNS propagation. When the field is ready, run +the check command with the --solver dns argument:

+
php acmephp.phar check --solver dns yourdomain.org
+
+ +
+
+
+ + + + + + + + + diff --git a/guides/heroku.html b/guides/heroku.html new file mode 100644 index 0000000..0ce2742 --- /dev/null +++ b/guides/heroku.html @@ -0,0 +1,248 @@ + + + + + + + + Acme PHP | Documentation + + + + + + + + + + +
+
+

+ Acme PHP +

+ + +
+
+ +
+
+
+ +
+ +
+ + +

Update your Heroku certificate

+

TODO

+
+ +
+
+
+ + + + + + + + + diff --git a/guides/multidomain-certificates.html b/guides/multidomain-certificates.html new file mode 100644 index 0000000..544d3f3 --- /dev/null +++ b/guides/multidomain-certificates.html @@ -0,0 +1,287 @@ + + + + + + + + Acme PHP | Documentation + + + + + + + + + + +
+
+

+ Acme PHP +

+ + +
+
+ +
+
+
+ +
+ +
+ + +

Multi-domains certificates

+

Let's Encrypt and most ACME servers are able to provide multi-domain certificates. Such certificates +will be usable for multiple domains as a single file, which can be useful in many cases (for instance to +use the same certificate for yourdomain.org and www.yourdomain.org).

+

Obtain a multi-domain certificate

+

The process of obtaining a multi-domain certificate is almost the same as +getting one for a single domain.

+

The only difference is when you use the request command, to add the other domains you want to support:

+
php acmephp.phar request yourdomain.org -a www.yourdomain.org -a anotherdomain.org
+

Note: you need to be the authorized owner of all the domains you request this way. In this case, it means +you have to run the authorize and check commands for the domains yourdomain.org, www.yourdomain.org +and anotherdomain.org before being able to request the multi-domains certificate.

+

The process will be the same as with a simple certificate: the command will ask you some informations, request +the certificate to the ACME server and store it under the ~/.acmephp directory.

+

The first domain will be considered the main domain of the certificate and any additionnal domain (provided using -a) +will be considered an alternate domain. This means that Acme PHP will store all the certificate informations under the +main domain (even if the certificate is a multi-domain one). In our case, this means 6 files will be created in the +storage directory:

+
    +
  • The full-chain certificate at ~/.acmephp/master/certs/yourdomain.org/public/fullchain.pem
  • +
  • The chain alone at ~/.acmephp/master/certs/yourdomain.org/public/chain.pem
  • +
  • The certificate alone at ~/.acmephp/master/certs/yourdomain.org/public/cert.pem
  • +
  • The combined certificate at ~/.acmephp/master/certs/yourdomain.org/private/combined.pem
  • +
  • The certificate private key at ~/.acmephp/master/certs/yourdomain.org/private/key.private.pem
  • +
  • The certificate public key at ~/.acmephp/master/certs/yourdomain.org/private/key.public.pem
  • +
+

Check the single domain documentation +for more informations about these files.

+

Note: using the main domain as storage directory means that if you request another certificate with the same +main domain, the previous one will be erased.

+

Once requested, if you run the status command, you will see the following:

+
+-------------------------+----------------------------+---------------------+---------------------+----------------+
+| Domain                  | Issuer                     | Valid from          | Valid to            | Needs renewal? |
++-------------------------+----------------------------+---------------------+---------------------+----------------+
+| yourdomain.org          | Let's Encrypt Authority X3 | 2016-09-23 10:12:00 | 2016-12-22 10:12:00 | No             |
+|  ├── www.yourdomain.org |                            |                     |                     |                |
+|  └── anotherdomain.org  |                            |                     |                     |                |
++-------------------------+----------------------------+---------------------+---------------------+----------------+
+

Renew a multi-domain certificate

+

The process is the same as for a single domain certificate: re-run the request command:

+
php acmephp.phar request yourdomain.org -a www.yourdomain.org -a anotherdomain.org
+
+ +
+
+
+ + + + + + + + + diff --git a/guides/platformsh.html b/guides/platformsh.html new file mode 100644 index 0000000..b146854 --- /dev/null +++ b/guides/platformsh.html @@ -0,0 +1,248 @@ + + + + + + + + Acme PHP | Documentation + + + + + + + + + + +
+
+

+ Acme PHP +

+ + +
+
+ +
+
+
+ +
+ +
+ + +

Update your platform.sh certificate

+

TODO

+
+ +
+
+
+ + + + + + + + + diff --git a/icons/css/font-awesome.min.css b/icons/css/font-awesome.min.css new file mode 100644 index 0000000..9b27f8e --- /dev/null +++ b/icons/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.6.3');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.6.3') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.6.3') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.6.3') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.6.3') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/icons/fonts/FontAwesome.otf b/icons/fonts/FontAwesome.otf new file mode 100644 index 0000000..d4de13e Binary files /dev/null and b/icons/fonts/FontAwesome.otf differ diff --git a/icons/fonts/fontawesome-webfont.eot b/icons/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000..c7b00d2 Binary files /dev/null and b/icons/fonts/fontawesome-webfont.eot differ diff --git a/icons/fonts/fontawesome-webfont.svg b/icons/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..8b66187 --- /dev/null +++ b/icons/fonts/fontawesome-webfont.svg @@ -0,0 +1,685 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/icons/fonts/fontawesome-webfont.ttf b/icons/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..f221e50 Binary files /dev/null and b/icons/fonts/fontawesome-webfont.ttf differ diff --git a/icons/fonts/fontawesome-webfont.woff b/icons/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000..6e7483c Binary files /dev/null and b/icons/fonts/fontawesome-webfont.woff differ diff --git a/icons/fonts/fontawesome-webfont.woff2 b/icons/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000..7eb74fd Binary files /dev/null and b/icons/fonts/fontawesome-webfont.woff2 differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..7252c6e --- /dev/null +++ b/index.html @@ -0,0 +1,253 @@ + + + + + + + + Acme PHP | Documentation + + + + + + + + + + +
+
+

+ Acme PHP +

+ + +
+
+ +
+
+
+ +
+ +
+ + +

Acme PHP

+

Acme PHP is a simple yet very extensible command line tool that will let you get +and renew free HTTPS certificates.

+

It works with the Let's Encrypt certificate authority, +using the ACME protocol. In a few steps, +you will be able to get a trusted certificate for any domain, freely and easily.

+

Start by installing Acme PHP and getting your first certificate!

+
+ +
+
+
+ + + + + + + + + diff --git a/index.md b/index.md deleted file mode 100644 index f186ad9..0000000 --- a/index.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -currentMenu: cli-index ---- - -# Acme PHP - -Acme PHP is a simple yet very extensible CLI client for Let's Encrypt that will help -you get and renew free HTTPS certificates. - -Acme PHP is also an initiative to bring a robust, stable and powerful implementation -of the ACME protocol in PHP. Using the Acme PHP library and core components, you will be -able to deeply integrate the management of your certificates directly in your application -(for instance, renew your certificates from your web interface). diff --git a/min/app.css b/min/app.css new file mode 100644 index 0000000..dee1a81 --- /dev/null +++ b/min/app.css @@ -0,0 +1,2 @@ +/*! Acme PHP | (c) Titouan Galopin | Build 20160817 */ +html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}body,html{padding:0;margin:0;font-size:14px;font-family:'Source Code Pro', 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;background:#F5F8FA}h1,h2,h3,h4,h5,h6{font-family:'Avenir Next LT Pro Regular', 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;font-weight:normal}code{overflow-x:auto;padding:0.3em;background:#F0F0F0;font-size:90%}pre code{display:block;overflow-x:auto;padding:0.5em;background:#F0F0F0}a{color:#4F8EF7;text-decoration:none}a:hover{color:#4F8EF7;text-decoration:underline}.container{max-width:1180px;min-width:945px;margin:0 auto;padding:0 20px}@media (max-width: 1200px){.container{max-width:95%}}.clearfix{clear:both}.header{background:#292F33;width:100%;height:60px;min-width:945px}.header a,.header a:hover{color:#ECECEC}.header .header-title{margin:0;padding:16px 0 0 0;float:left;font-weight:bold}.header .header-menu{float:right;padding-top:16px}.header .header-menu ul,.header .header-menu li{list-style-type:none;margin:0;padding:0}.header .header-menu li{display:inline-block;margin-left:10px}.header .header-menu li a{display:block;padding:10px 15px 9px 15px;font-weight:600;text-decoration:none}.header .header-menu li.current a,.header .header-menu li a:hover{background:#394147}.banner{padding:50px 0 40px 0;margin:0;background:#4b97d0;color:#ECECEC;min-width:985px}.banner a{color:#ECECEC;text-decoration:underline}.banner a:hover{text-decoration:none}.banner .banner-title{padding:10px 0 0 0;margin:0;font-size:36px;font-weight:bold;letter-spacing:-0.02em;-webkit-font-smoothing:antialiased;text-shadow:0 1px 2px rgba(0,0,0,0.1);cursor:default}.banner .banner-left{float:left;width:50%}.banner .banner-left li{margin:0 0 20px 0;font-size:18px;line-height:1.4;color:#CCD6DD}.banner .banner-left li strong{color:#fff}.banner .banner-left .banner-button{display:inline-block;padding:15px 25px;background:#292F33;color:#fff;font-size:18px;font-weight:bold;text-align:center;margin-top:10px;text-decoration:none}.banner .banner-left .banner-button:hover{text-decoration:underline}.banner .banner-right{float:right;width:45%}.banner .banner-right pre{background:#002b36;color:#93a1a1;padding:10px}.banner .banner-right pre .comment{color:#586e75}.banner .banner-right pre .dollar{color:#586e75}.banner .banner-right pre .command{color:#859900}.banner .banner-right pre .arguments{color:#b58900}.socials-left{float:left;padding:17px 0}.socials-right{float:right}.socials-right a{display:inline-block;margin:10px 0 10px 30px}.socials-right a i{color:#292F33;font-size:30px;float:left}.socials-right a span{display:inline-block;padding:7px}.socials-right a:hover span{text-decoration:underline}.features{padding:20px 0;background:#E1E8ED;min-width:985px}.features .features-title{text-align:center;font-size:22px;margin-bottom:30px}.feature{display:block;width:33%;float:left;text-align:center;margin:30px 0 50px 0}.feature .feature-icon{display:inline-block;font-size:30px;padding:15px 14px 0 14px;background:#292F33;color:#fff;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:64px;height:64px;text-align:center}.feature .feature-text{padding:0 40px}.feature .feature-text h4{font-size:18px}.feature .feature-text p{font-style:italic;color:#292F33}.doc-page{padding:20px 0;background:#E1E8ED;min-width:985px}.doc-page .doc-menu{float:left;width:220px}.doc-page .doc-menu ul,.doc-page .doc-menu li{margin:0;padding:0;list-style-type:none}.doc-page .doc-menu .doc-menu-header{font-weight:bold;margin-top:30px}.doc-page .doc-menu .doc-menu-sub{padding:0 0 0 20px}.doc-page .doc-menu .doc-menu-sub li{padding-bottom:15px}.doc-page .doc-menu .doc-menu-sub li.current{font-weight:bold}.doc-page .doc-edit{float:right}.doc-page .doc-edit a{display:inline-block}.doc-page .doc-edit a i{color:#292F33;font-size:24px;float:left}.doc-page .doc-edit a span{display:inline-block;padding:2px 0 0 10px}.doc-page .doc-edit a:hover span{text-decoration:underline}.doc-page .doc-content{margin-left:240px;background:#f5f5f5;padding:20px;line-height:1.6}.doc-page .doc-content h1{margin-top:0;border-bottom:1px solid #e5e5e5}.doc-page .doc-content h2{margin:30px 0 10px 0;border-bottom:1px solid #e5e5e5}.doc-page .doc-content h3{margin:30px 0 10px 0}.doc-page .doc-content blockquote{margin:0;padding:0 15px;color:#777;border-left:4px solid #ddd}.footer{background:#292F33;color:#CCD6DD;padding:20px 0 100px 0;min-width:985px}.footer ul,.footer li{list-style-type:none;padding:0;margin:0}.footer a{color:#CCD6DD}.footer .footer-column{display:block;width:25%;float:left}.footer .footer-column h5{text-transform:uppercase;font-size:14px;margin:0;padding:20px 0}.footer .footer-column li{padding:0 0 15px 0} diff --git a/readme.html b/readme.html new file mode 100644 index 0000000..59af6be --- /dev/null +++ b/readme.html @@ -0,0 +1,253 @@ + + + + + + + + Acme PHP | Documentation + + + + + + + + + + +
+
+

+ Acme PHP +

+ + +
+
+ +
+
+
+ +
+ +
+ + +

Acme PHP Documentation

+

This repository is the documentation for the Acme PHP project.

+

The documentation is rendered online at https://acmephp.github.io/documentation.

+

Development

+

The documentation is built using Couscous, a static site generator.

+

To preview changes locally, install Couscous +and run couscous preview from this directory. The site will be viewable at http://127.0.0.1:8000

+
+ +
+
+
+ + + + + + + + + diff --git a/ssl/get-started.html b/ssl/get-started.html new file mode 100644 index 0000000..974f168 --- /dev/null +++ b/ssl/get-started.html @@ -0,0 +1,325 @@ + + + + + + + + Acme PHP | Documentation + + + + + + + + + + +
+
+

+ Acme PHP +

+ + +
+
+ +
+
+
+ +
+ +
+ + +

Get started

+

Installation

+

You will need the PHP OpenSSL extension to use Acme PHP SSL.

+

Install this library using Composer:

+
composer require acmephp/ssl
+

Usage examples

+

Sign data with a private key

+
<?php
+$signer = new AcmePhp\Ssl\Signer\DataSigner();
+$privateKey = new AcmePhp\Ssl\PrivateKey($pemString);
+
+var_dump($signer->signData($customData, $privateKey));
+

Parse a SSL certificate to extract its metadata

+
<?php
+$parser = new AcmePhp\Ssl\Parser\CertificateParser();
+
+$rawCertificate = new AcmePhp\Ssl\Certificate($pemString);
+$parsedCertificate = $parser->parse($rawCertificate);
+
+var_dump($parsedKey->getSource());
+var_dump($parsedKey->getSubject());
+var_dump($parsedKey->getIssuer());
+var_dump($parsedKey->isSelfSigned());
+var_dump($parsedKey->getValidFrom());
+var_dump($parsedKey->getValidTo());
+var_dump($parsedKey->getSerialNumber());
+var_dump($parsedKey->getSubjectAlternativeNames());
+

Generate a key pair (a private key and its associated public key)

+
<?php
+$generator = new AcmePhp\Ssl\Generator\KeyPairGenerator();
+
+$keyPair = $generator->generateKeyPair();
+
+var_dump($keyPair->getPublicKey()->getPEM());
+var_dump($keyPair->getPrivateKey()->getPEM());
+

Parse a key to extract its metadata

+
<?php
+$parser = new AcmePhp\Ssl\Parser\KeyParser();
+
+$rawKey = new AcmePhp\Ssl\PrivateKey($pemString);
+$parsedKey = $parser->parse($rawKey);
+
+var_dump($parsedKey->getSource());
+var_dump($parsedKey->getKey());
+var_dump($parsedKey->getBits());
+var_dump($parsedKey->getType());
+var_dump($parsedKey->getDetails());
+

API documentation

+

SSL entities

+

This library provides the following SSL entities:

+
    +
  • PrivateKey: a private key
  • +
  • PublicKey: a public key
  • +
  • ParsedKey: data resulting of the decoding of a key (public or private)
  • +
  • KeyPair: a couple of public and private key
  • +
  • Certificate: a PEM certificate string (an encoded certificate)
  • +
  • ParsedCertificate: data resulting of the decoding of a parsed certificate
  • +
  • DistinguishedName: required data used to generate a Certificate Request Signing
  • +
  • CertificateRequest: required data used to request a certificate
  • +
  • CertificateResponse: the result of a certificate request
  • +
+

These entities are the objects you will receive from the services provided by this library.

+

Generators

+

Generators are under AcmePhp\Ssl\Generator namespace.

+
    +
  • KeyPairGenerator generates a KeyPair entity (using OpenSSL functions)
  • +
+

Parsers

+

Parsers are under AcmePhp\Ssl\Parser namespace.

+
    +
  • CertificateParser parses certificates (Certificate entities) and return ParsedCertificate entities
  • +
  • KeyParser parses keys (PrivateKey or PublicKey entities) and return ParsedKey entities
  • +
+

Signers

+

Signers are under AcmePhp\Ssl\Signer namespace.

+
    +
  • CertificateRequestSigner signs Certificate requests (CSR)
  • +
  • DataSigner signs custom data using a private key
  • +
+
+ +
+
+
+ + + + + + + + + diff --git a/ssl/get-started.md b/ssl/get-started.md deleted file mode 100644 index 8fbae0b..0000000 --- a/ssl/get-started.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -currentMenu: ssl-get-started ---- - -# Get started - -## Installation - -You will need the PHP OpenSSL extension to use Acme PHP SSL. - -Install this library using Composer: - -``` bash -composer require acmephp/ssl -``` - -## Usage - -### SSL entities - -This library provides the following SSL entities: - -- **PrivateKey**: a private key -- **PublicKey**: a public key -- **ParsedKey**: data resulting of the decoding of a key (public or private) -- **KeyPair**: a couple of public and private key -- **Certificate**: a PEM certificate string (an encoded certificate) -- **ParsedCertificate**: data resulting of the decoding of a parsed certificate -- **DistinguishedName**: required data used to generate a Certificate Request Signing -- **CertificateRequest**: required data used to request a certificate -- **CertificateResponse**: the result of a certificate request - -These entities are the objects you will receive from the services provided by this library. - -### Generators - -Generators are under `AcmePhp\Ssl\Generator` namespace. - -- **KeyPairGenerator** generates a **KeyPair** entity (using OpenSSL functions) - -### Parsers - -Parsers are under `AcmePhp\Ssl\Parser` namespace. - -- **CertificateParser** parses certificates (**Certificate** entities) and return **ParsedCertificate** entities -- **KeyParser** parses keys (**PrivateKey or PublicKey** entities) and return **ParsedKey** entities - -### Signers - -Signers are under `AcmePhp\Ssl\Signer` namespace. - -- **CertificateRequestSigner** signs Certificate requests (CSR) -- **DataSigner** signs custom data using a private key - diff --git a/ssl/install-usage.md b/ssl/install-usage.md deleted file mode 100644 index af01781..0000000 --- a/ssl/install-usage.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -currentMenu: ssl-install-usage ---- - -# Installation and usage - -TODO diff --git a/ssl/introduction.html b/ssl/introduction.html new file mode 100644 index 0000000..eb08f88 --- /dev/null +++ b/ssl/introduction.html @@ -0,0 +1,260 @@ + + + + + + + + Acme PHP | Documentation + + + + + + + + + + +
+
+

+ Acme PHP +

+ + +
+
+ +
+
+
+ +
+ +
+ + +

Acme PHP SSL

+

Acme PHP SSL is a PHP wrapper around OpenSSL extension providing SSL encoding, +decoding, parsing and signing features.

+

It uses the recommended security settings and let you interact in a OOP +manner with SSL entities (public/private keys, certificates, ...).

+

Why use Acme PHP SSL?

+

Acme PHP SSL provides various useful tools solving different use-cases:

+
    +
  • generate public and private keys (see the Generator\KeyPairGenerator) ;
  • +
  • sign data using a private key (see Signer\DataSigner) ;
  • +
  • parse certificates to extract informations about them (see Parser\CertificateParser) ;
  • +
+

There are many more possible use-cases, don't hesitate to dig a bit deeper in the +documentation to find out if this library can solve your problem!

+
+ +
+
+
+ + + + + + + + + diff --git a/ssl/introduction.md b/ssl/introduction.md deleted file mode 100644 index 4d18ed6..0000000 --- a/ssl/introduction.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -currentMenu: ssl-introduction ---- - -# Acme PHP SSL - -> This library is a part of the [Acme PHP initiative](https://github.com/acmephp), -> aiming to intregrate [Let's Encrypt](https://github.com/acmephp) -> in the PHP world at the application level. - -Acme PHP SSL is a PHP wrapper around OpenSSL extension providing SSL encoding, -decoding, parsing and signing features. - -It uses the recommended security settings and let you interact in a OOP -manner with SSL entities (public/private keys, certificates, ...). - -## Why use Acme PHP SSL? - -Acme PHP SSL provides various useful tools solving different use-cases: -- generate public and private keys (see the `Generator\KeyPairGenerator`) ; -- sign data using a private key (see `Signer\DataSigner`) ; -- parse certificates to extract informations about them (see `Parser\CertificateParser`) ; - -There are many more possible use-cases, don't hesitate to dig a bit deeper in the -documentation to find out if this library can solve your problem! diff --git a/symfony/install-usage.html b/symfony/install-usage.html new file mode 100644 index 0000000..f05c29b --- /dev/null +++ b/symfony/install-usage.html @@ -0,0 +1,248 @@ + + + + + + + + Acme PHP | Documentation + + + + + + + + + + +
+
+

+ Acme PHP +

+ + +
+
+ +
+
+
+ +
+ +
+ + +

Installation and usage

+

TODO

+
+ +
+
+
+ + + + + + + + + diff --git a/symfony/install-usage.md b/symfony/install-usage.md deleted file mode 100644 index 16f4ef8..0000000 --- a/symfony/install-usage.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -currentMenu: symfony-install-usage ---- - -# Installation and usage - -TODO diff --git a/theme/default.twig b/theme/default.twig deleted file mode 100644 index 0c3d309..0000000 --- a/theme/default.twig +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - - - Acme PHP | Documentation - - - - - - - - - - -
-
-

- Acme PHP -

- - -
-
- -
-
-
- -
- -
- - - {{ content|raw }} -
- -
-
-
- - - - - - -