From 925a116a380784eff4e154c13ed32fb3d9041dec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Richard=20K=C3=B6rber?= Date: Sat, 7 Dec 2019 14:21:12 +0100 Subject: [PATCH] Migrate docs to mkdocs --- .gitlab-ci.yml | 2 +- acme4j-client/src/site/markdown/index.md.vm | 26 ------- acme4j-client/src/site/site.xml | 47 ------------ acme4j-example/src/site/markdown/index.md.vm | 19 ----- acme4j-example/src/site/site.xml | 46 ------------ acme4j-it/src/site/markdown/index.md.vm | 17 ----- acme4j-it/src/site/site.xml | 46 ------------ acme4j-utils/src/site/markdown/index.md.vm | 28 ------- acme4j-utils/src/site/site.xml | 47 ------------ pom.xml | 61 +++------------ src/doc/docs/ca/index.md | 17 +++++ .../markdown => doc/docs}/ca/letsencrypt.md | 0 src/{site/markdown => doc/docs}/ca/pebble.md | 0 .../markdown => doc/docs}/challenge/dns-01.md | 4 +- .../docs}/challenge/http-01.md | 9 +-- .../markdown => doc/docs}/challenge/index.md | 6 +- .../docs}/challenge/tls-alpn-01.md | 21 +++--- .../docs}/development/index.md | 6 +- .../docs}/development/provider.md | 0 .../docs}/development/testing.md | 8 +- src/doc/docs/index.md | 71 ++++++++++++++++++ src/{site/markdown => doc/docs}/migration.md | 0 .../markdown => doc/docs}/usage/account.md | 24 +++--- .../docs}/usage/certificate.md | 19 ++--- src/doc/docs/usage/index.md | 11 +++ .../markdown => doc/docs}/usage/login.md | 21 ++---- .../markdown => doc/docs}/usage/order.md | 59 ++++++--------- .../markdown => doc/docs}/usage/session.md | 0 src/doc/mkdocs.yml | 44 +++++++++++ src/doc/theme/breadcrumbs.html | 0 src/doc/theme/css/font.css | 35 +++++++++ src/doc/theme/css/theme_custom.css | 14 ++++ .../fonts/inconsolata-v17-latin-regular.woff | Bin 0 -> 21764 bytes .../theme/fonts/lato-v15-latin-regular.woff | Bin 0 -> 28660 bytes .../fonts/roboto-slab-v8-latin-regular.woff | Bin 0 -> 22152 bytes src/doc/theme/footer.html | 10 +++ src/doc/theme/main.html | 15 ++++ src/doc/theme/toc.html | 9 +++ src/site/markdown/ca/index.md | 19 ----- src/site/markdown/index.md.vm | 58 -------------- src/site/markdown/usage/index.md | 11 --- src/site/resources/css/site.css | 20 ----- src/site/site.xml | 67 ----------------- 43 files changed, 309 insertions(+), 608 deletions(-) delete mode 100644 acme4j-client/src/site/markdown/index.md.vm delete mode 100644 acme4j-client/src/site/site.xml delete mode 100644 acme4j-example/src/site/markdown/index.md.vm delete mode 100644 acme4j-example/src/site/site.xml delete mode 100644 acme4j-it/src/site/markdown/index.md.vm delete mode 100644 acme4j-it/src/site/site.xml delete mode 100644 acme4j-utils/src/site/markdown/index.md.vm delete mode 100644 acme4j-utils/src/site/site.xml create mode 100644 src/doc/docs/ca/index.md rename src/{site/markdown => doc/docs}/ca/letsencrypt.md (100%) rename src/{site/markdown => doc/docs}/ca/pebble.md (100%) rename src/{site/markdown => doc/docs}/challenge/dns-01.md (88%) rename src/{site/markdown => doc/docs}/challenge/http-01.md (75%) rename src/{site/markdown => doc/docs}/challenge/index.md (83%) rename src/{site/markdown => doc/docs}/challenge/tls-alpn-01.md (61%) rename src/{site/markdown => doc/docs}/development/index.md (55%) rename src/{site/markdown => doc/docs}/development/provider.md (100%) rename src/{site/markdown => doc/docs}/development/testing.md (90%) create mode 100644 src/doc/docs/index.md rename src/{site/markdown => doc/docs}/migration.md (100%) rename src/{site/markdown => doc/docs}/usage/account.md (84%) rename src/{site/markdown => doc/docs}/usage/certificate.md (86%) create mode 100644 src/doc/docs/usage/index.md rename src/{site/markdown => doc/docs}/usage/login.md (79%) rename src/{site/markdown => doc/docs}/usage/order.md (83%) rename src/{site/markdown => doc/docs}/usage/session.md (100%) create mode 100644 src/doc/mkdocs.yml create mode 100644 src/doc/theme/breadcrumbs.html create mode 100644 src/doc/theme/css/font.css create mode 100644 src/doc/theme/css/theme_custom.css create mode 100644 src/doc/theme/fonts/inconsolata-v17-latin-regular.woff create mode 100644 src/doc/theme/fonts/lato-v15-latin-regular.woff create mode 100644 src/doc/theme/fonts/roboto-slab-v8-latin-regular.woff create mode 100644 src/doc/theme/footer.html create mode 100644 src/doc/theme/main.html create mode 100644 src/doc/theme/toc.html delete mode 100644 src/site/markdown/ca/index.md delete mode 100644 src/site/markdown/index.md.vm delete mode 100644 src/site/markdown/usage/index.md delete mode 100644 src/site/resources/css/site.css delete mode 100644 src/site/site.xml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5214f818..3f912605 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -19,4 +19,4 @@ deploy: - maven - docker script: - - mvn -B install site:site + - mvn -B install javadoc:javadoc mkdocs:build diff --git a/acme4j-client/src/site/markdown/index.md.vm b/acme4j-client/src/site/markdown/index.md.vm deleted file mode 100644 index 4cb36c75..00000000 --- a/acme4j-client/src/site/markdown/index.md.vm +++ /dev/null @@ -1,26 +0,0 @@ -acme4j Client -============= - -This is the main part of _acme4j_. - -How to Use ----------- - -_acme4j_ is availabe at Maven Central. Just add this snippet to your `pom.xml`: - -```xml - - ${project.groupId} - ${project.artifactId} - ${project.version} - -``` - -Java Module ------------ - -Add this line to your module descriptor: - -```java -requires org.shredzone.acme4j; -``` diff --git a/acme4j-client/src/site/site.xml b/acme4j-client/src/site/site.xml deleted file mode 100644 index 588e0ac6..00000000 --- a/acme4j-client/src/site/site.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - $(document).ready(function(){$(".source").addClass("prettyprint");prettyPrint();});]]> - - - - - - - - - - - - - - - - - - - org.apache.maven.skins - maven-fluido-skin - 1.7 - - diff --git a/acme4j-example/src/site/markdown/index.md.vm b/acme4j-example/src/site/markdown/index.md.vm deleted file mode 100644 index 9efe97bf..00000000 --- a/acme4j-example/src/site/markdown/index.md.vm +++ /dev/null @@ -1,19 +0,0 @@ -acme4j Example -============== - -An example tool that uses _acme4j_, and a good starting point to find out how _acme4j_ is used. - -This tool registers a new account with the _Let's Encrypt_ staging server, and fetches a certificate for a set of domains. - -How to Use ----------- - -Run the `org.shredzone.acme4j.ClientTest` class with the domains to be registered as parameters. - -You can also invoke the example tool via maven: - -``` -mvn exec:java -Dexec.args="example.com example.org" -``` - -Or just have a look at [the source code](./apidocs/src-html/org/shredzone/acme4j/ClientTest.html). diff --git a/acme4j-example/src/site/site.xml b/acme4j-example/src/site/site.xml deleted file mode 100644 index 2df4403b..00000000 --- a/acme4j-example/src/site/site.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - $(document).ready(function(){$(".source").addClass("prettyprint");prettyPrint();});]]> - - - - - - - - - - - - - - - - - - org.apache.maven.skins - maven-fluido-skin - 1.7 - - diff --git a/acme4j-it/src/site/markdown/index.md.vm b/acme4j-it/src/site/markdown/index.md.vm deleted file mode 100644 index 94ed7572..00000000 --- a/acme4j-it/src/site/markdown/index.md.vm +++ /dev/null @@ -1,17 +0,0 @@ -acme4j Integration Tests -======================== - -This module contains an Integration Test of _acme4j_. - -It builds a [Pebble](https://github.com/letsencrypt/pebble) docker image and runs it. After that, a number of integration tests are performed. - -See the [Documentation](../development/testing.html) for how to run it - -GitLab CI ---------- - -_acme4j_ contains a GitLab CI configuration file. - -The CI runner should be set up with a `shell` executor. Maven and Docker should be installed on the CI runner, and the shell executor user should be able to use both. - -The tags `maven` and `docker` are used to select the executor. diff --git a/acme4j-it/src/site/site.xml b/acme4j-it/src/site/site.xml deleted file mode 100644 index bea0997c..00000000 --- a/acme4j-it/src/site/site.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - $(document).ready(function(){$(".source").addClass("prettyprint");prettyPrint();});]]> - - - - - - - - - - - - - - - - - - org.apache.maven.skins - maven-fluido-skin - 1.7 - - diff --git a/acme4j-utils/src/site/markdown/index.md.vm b/acme4j-utils/src/site/markdown/index.md.vm deleted file mode 100644 index 91a8c478..00000000 --- a/acme4j-utils/src/site/markdown/index.md.vm +++ /dev/null @@ -1,28 +0,0 @@ -acme4j Utils -============ - -Some utility classes to be used with _acme4j_. They will help generating and processing keys and signatures. - -Note that (unlike `acme4j-client`) this module requires [Bouncy Castle](https://www.bouncycastle.org/java.html). - -How to Use ----------- - -Just add this snippet to your `pom.xml`: - -```xml - - ${project.groupId} - ${project.artifactId} - ${project.version} - -``` - -Java Module ------------ - -Add this line to your module descriptor: - -```java -requires org.shredzone.acme4j.utils; -``` diff --git a/acme4j-utils/src/site/site.xml b/acme4j-utils/src/site/site.xml deleted file mode 100644 index 4761b54d..00000000 --- a/acme4j-utils/src/site/site.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - $(document).ready(function(){$(".source").addClass("prettyprint");prettyPrint();});]]> - - - - - - - - - - - - - - - - - - - org.apache.maven.skins - maven-fluido-skin - 1.7 - - diff --git a/pom.xml b/pom.xml index 8153a6a8..14acd5b3 100644 --- a/pom.xml +++ b/pom.xml @@ -125,21 +125,6 @@ - - org.apache.maven.plugins - maven-site-plugin - 3.8.2 - - UTF-8 - - - - org.apache.maven.doxia - doxia-module-markdown - 1.8 - - - org.apache.maven.plugins maven-release-plugin @@ -164,33 +149,6 @@ - - - - - - org.apache.maven.plugins - maven-project-info-reports-plugin - 3.0.0 - - - - summary - dependency-info - scm - issue-management - dependencies - team - licenses - - - - - - org.apache.maven.plugins - maven-surefire-report-plugin - 2.22.1 - org.apache.maven.plugins maven-javadoc-plugin @@ -202,12 +160,15 @@ - com.github.spotbugs - spotbugs-maven-plugin - 3.1.12.2 + org.shredzone.maven + mkdocs-maven-plugin + 1.0 + + ${project.build.directory}/site + - + com.google.code.findbugs @@ -261,7 +222,7 @@ [9,10] - + org.apache.maven.plugins @@ -271,14 +232,14 @@ - + java-11 [11,) - + org.apache.maven.plugins @@ -288,7 +249,7 @@ - + diff --git a/src/doc/docs/ca/index.md b/src/doc/docs/ca/index.md new file mode 100644 index 00000000..991f96ec --- /dev/null +++ b/src/doc/docs/ca/index.md @@ -0,0 +1,17 @@ +# Certificate Authorities + +_acme4j_ should support any CA that is providing an ACME server. + +## Available Providers + +The _acme4j_ package contains these providers: + +* [Let's Encrypt](letsencrypt.md) +* [Pebble](pebble.md) + +More CAs may be supported in future releases of _acme4j_. + +Also, CAs can publish provider jar files that plug into _acme4j_ and offer extended support. + +!!! note + You can always connect to any ACMEv2 compliant server, by passing the `URL` of its directory service to the `Session`. diff --git a/src/site/markdown/ca/letsencrypt.md b/src/doc/docs/ca/letsencrypt.md similarity index 100% rename from src/site/markdown/ca/letsencrypt.md rename to src/doc/docs/ca/letsencrypt.md diff --git a/src/site/markdown/ca/pebble.md b/src/doc/docs/ca/pebble.md similarity index 100% rename from src/site/markdown/ca/pebble.md rename to src/doc/docs/ca/pebble.md diff --git a/src/site/markdown/challenge/dns-01.md b/src/doc/docs/challenge/dns-01.md similarity index 88% rename from src/site/markdown/challenge/dns-01.md rename to src/doc/docs/challenge/dns-01.md index 12426040..b47ddd58 100644 --- a/src/site/markdown/challenge/dns-01.md +++ b/src/doc/docs/challenge/dns-01.md @@ -5,10 +5,10 @@ With the `dns-01` challenge, you prove to the CA that you are able to control th `Dns01Challenge` provides a digest string: ```java -Dns01Challenge challenge = auth.findChallenge(Dns01Challenge.TYPE); +Dns01Challenge challenge = auth.findChallenge(Dns01Challenge.class); +String domain = auth.getIdentifier().getDomain(); String digest = challenge.getDigest(); -String domain = auth.getIdentifier().getDomain(); ``` The CA expects a TXT record at `_acme-challenge.${domain}` with the `digest` string as value. diff --git a/src/site/markdown/challenge/http-01.md b/src/doc/docs/challenge/http-01.md similarity index 75% rename from src/site/markdown/challenge/http-01.md rename to src/doc/docs/challenge/http-01.md index 8f48801e..d52bfcbe 100644 --- a/src/site/markdown/challenge/http-01.md +++ b/src/doc/docs/challenge/http-01.md @@ -5,11 +5,11 @@ With the `http-01` challenge, you prove to the CA that you are able to control t `Http01Challenge` provides two strings: ```java -Http01Challenge challenge = auth.findChallenge(Http01Challenge.TYPE); +Http01Challenge challenge = auth.findChallenge(Http01Challenge.class); +String domain = auth.getIdentifier().getDomain(); String token = challenge.getToken(); String content = challenge.getAuthorization(); -String domain = auth.getIdentifier().getDomain(); ``` `token` is the name of the file that will be requested by the CA server. It must contain the `content` string, without any leading or trailing white spaces or line breaks. The `Content-Type` header must be either `text/plain` or absent. @@ -22,6 +22,5 @@ http://${domain}/.well-known/acme-challenge/${token} The challenge is completed when the CA was able to download that file and found `content` in it. - +!!! note + The request is sent to port 80 only, but redirects are followed. If your domain has multiple IP addresses, the CA randomly selects one of them. There is no way to choose a different port or a fixed IP address. diff --git a/src/site/markdown/challenge/index.md b/src/doc/docs/challenge/index.md similarity index 83% rename from src/site/markdown/challenge/index.md rename to src/doc/docs/challenge/index.md index 001859a6..ebf367c3 100644 --- a/src/site/markdown/challenge/index.md +++ b/src/doc/docs/challenge/index.md @@ -6,9 +6,9 @@ There are different kind of challenges. The most simple is maybe the HTTP challe The ACME specifications define these standard challenges: -* [http-01](./http-01.html) -* [dns-01](./dns-01.html) +* [http-01](http-01.md) +* [dns-01](dns-01.md) _acme4j_ also supports these non-standard challenges: -* [tls-alpn-01](./tls-alpn-01.html) +* [tls-alpn-01](tls-alpn-01.md) diff --git a/src/site/markdown/challenge/tls-alpn-01.md b/src/doc/docs/challenge/tls-alpn-01.md similarity index 61% rename from src/site/markdown/challenge/tls-alpn-01.md rename to src/doc/docs/challenge/tls-alpn-01.md index fa5cd29f..6a6100c8 100644 --- a/src/site/markdown/challenge/tls-alpn-01.md +++ b/src/doc/docs/challenge/tls-alpn-01.md @@ -2,35 +2,32 @@ With the `tls-alpn-01` challenge, you prove to the CA that you are able to control the web server of the domain to be authorized, by letting it respond to a request with a specific self-signed cert utilizing the ALPN extension. - +!!! note + This challenge is not part of the ACME specifications. It is specified [in a separate IETF document](https://tools.ietf.org/html/draft-ietf-acme-tls-alpn) and is still work in progress. `TlsAlpn01Challenge` provides a byte array called `acmeValidation`: ```java -TlsAlpn01Challenge challenge = auth.findChallenge(TlsAlpn01Challenge.TYPE); +TlsAlpn01Challenge challenge = auth.findChallenge(TlsAlpn01Challenge.class); +Identifier identifier = auth.getIdentifier(); byte[] acmeValidation = challenge.getAcmeValidation(); ``` You need to create a self-signed certificate with the domain to be validated set as the only _Subject Alternative Name_. The `acmeValidation` must be set as DER encoded `OCTET STRING` extension with the object id `1.3.6.1.5.5.7.1.31`. It is required to set this extension as critical. -After that, configure your web server so it will use this certificate on an incoming TLS request having the SNI `subject` and the ALPN protocol `acme-tls/1`. +After that, configure your web server so it will use this certificate on an incoming TLS request having the SNI `identifier` and the ALPN protocol `acme-tls/1`. -The `TlsAlpn01Challenge` class does not generate a self-signed certificate, as it would require _Bouncy Castle_. However, there is a utility method in the _acme4j-utils_ module for this use case: +The `TlsAlpn01Challenge` class does not generate a self-signed certificate for you, as it would require _Bouncy Castle_. However, there is a utility method in the _acme4j-utils_ module for this use case: ```java -Identifier identifier = auth.getIdentifier(); KeyPair certKeyPair = KeyPairUtils.createKeyPair(2048); X509Certificate cert = CertificateUtils. createTlsAlpn01Certificate(certKeyPair, identifier, acmeValidation); ``` -Now use `cert` and `certKeyPair` to let your web server respond to TLS requests containing an ALPN extension with the value `acme-tls/1` and a SNI extension containing your subject. +Now use `cert` and `certKeyPair` to let your web server respond to TLS requests containing an ALPN extension with the value `acme-tls/1` and a SNI extension containing your subject (`identifier`). - +!!! note + The request is sent to port 443 only. If your domain has multiple IP addresses, the CA randomly selects one of them. There is no way to choose a different port or a fixed IP address. diff --git a/src/site/markdown/development/index.md b/src/doc/docs/development/index.md similarity index 55% rename from src/site/markdown/development/index.md rename to src/doc/docs/development/index.md index 6c65ec8b..cc3f4a43 100644 --- a/src/site/markdown/development/index.md +++ b/src/doc/docs/development/index.md @@ -1,6 +1,6 @@ -# _acme4j_ Development +# acme4j Development This part of the documentation is addressed to developers who want to extend _acme4j_, or who want to use _acme4j_ for integration tests. -* [Write an own Provider extension](./provider.html) -* [Integration Tests](./testing.html) +* [Write an own Provider extension](provider.md) +* [Integration Tests](testing.md) diff --git a/src/site/markdown/development/provider.md b/src/doc/docs/development/provider.md similarity index 100% rename from src/site/markdown/development/provider.md rename to src/doc/docs/development/provider.md diff --git a/src/site/markdown/development/testing.md b/src/doc/docs/development/testing.md similarity index 90% rename from src/site/markdown/development/testing.md rename to src/doc/docs/development/testing.md index 4fdb5a13..e31630b5 100644 --- a/src/site/markdown/development/testing.md +++ b/src/doc/docs/development/testing.md @@ -1,4 +1,4 @@ -# Testing _acme4j_ +# Testing acme4j ## Integration Tests @@ -16,10 +16,8 @@ If you like to change the default configuration of the integration tests (e.g. b * `pebblePort`: Port the pebble server is listening on. Default: 14000 * `bammbammUrl`: URI of the _pebble-challtestsrv_ to connect to. Default: `http://localhost:8055` - +!!! warning + _pebble-challtestsrv_ is meant for testing purposes only. Only use it in secured testing environments. The server is neither hardened, nor does it offer any kind of authentication. ## Boulder diff --git a/src/doc/docs/index.md b/src/doc/docs/index.md new file mode 100644 index 00000000..587829fa --- /dev/null +++ b/src/doc/docs/index.md @@ -0,0 +1,71 @@ +# acme4j + +A Java client for the _Automatic Certificate Management Environment_ (ACME) protocol as specified in [RFC 8555](https://tools.ietf.org/html/rfc8555). + +ACME is a protocol that a certificate authority (CA) and an applicant can use to automate the process of verification and certificate issuance. + +This Java client helps connecting to an ACME server, and performing all necessary steps to manage certificates. + +It is an independent open source implementation that is not affiliated with or endorsed by _Let's Encrypt_. + +The source code can be found at [GitHub](https://github.com/shred/acme4j) and is distributed under the terms of [Apache License 2.0](http://www.apache.org/licenses/LICENSE-2.0). + +Latest version: ![maven central](https://shredzone.org/maven-central/org.shredzone.acme4j/acme4j/badge.svg) + +!!! danger + **Make sure to use _acme4j_ 2.5 or higher, before November 1st 2019.** Due to a change in the ACME protocol, _acme4j_ < 2.5 will fail to connect to servers after that date. See [here](https://community.letsencrypt.org/t/acme-v2-scheduled-deprecation-of-unauthenticated-resource-gets/74380) for details. + +## Features + +* Fully [RFC 8555](https://tools.ietf.org/html/rfc8555) compliant +* Supports the `http-01`, `dns-01` and `tls-alpn-01` challenges +* Supports the [acme-ip draft](https://tools.ietf.org/html/draft-ietf-acme-ip) +* Supports the [acme-star draft](https://tools.ietf.org/html/draft-ietf-acme-star) for short-term automatic certificate renewal (experimental) +* Easy to use Java API +* Requires JRE 8 (update 101) or higher +* Built with maven, packages available at [Maven Central](http://search.maven.org/#search|ga|1|g%3A%22org.shredzone.acme4j%22) +* Small, only requires [jose4j](https://bitbucket.org/b_c/jose4j/wiki/Home) and [slf4j](http://www.slf4j.org/) as dependencies +* Extensive unit and integration tests + +## Quick Start + +[This source code](acme4j-example/apidocs/src-html/org/shredzone/acme4j/ClientTest.html) gives an example of how to get a TLS certificate with _acme4j_. + +You can run the `org.shredzone.acme4j.ClientTest` class in your IDE, with the domains to be registered as parameters. The test client can also be invoked via maven in a command line: + +```sh +mvn exec:java -Dexec.args="example.com example.org" +``` + +By default, the test client registers the domains with the Let's Encrypt staging server via HTTP challenge. + +## Modules + +_acme4j_ consists of five modules. All modules are [available at Maven Central](https://mvnrepository.com/artifact/org.shredzone.acme4j) and can easily be added to the dependency list of your project. You can also download the jar files [at GitHub](https://github.com/shred/acme4j/releases/latest). + +acme4j-client +: [`acme4j-client`](https://mvnrepository.com/artifact/org.shredzone.acme4j/acme4j-client/latest) is the main module. It contains everything that is required to get certificates for domains. It only requires [jose4j](https://bitbucket.org/b_c/jose4j) and [slf4j](https://www.slf4j.org/). + + The Java module name is `org.shredzone.acme4j`. + +acme4j-utils +: [`acme4j-utils`](https://mvnrepository.com/artifact/org.shredzone.acme4j/acme4j-utils/latest) contains utility classes for creating key pairs, CSRs, and certificates. It requires [Bouncy Castle](https://www.bouncycastle.org/java.html) though. + + The Java module name is `org.shredzone.acme4j.utils`. + +acme4j-example +: This module only contains [an example code](https://shredzone.org/maven/acme4j/acme4j-example/apidocs/src-html/org/shredzone/acme4j/ClientTest.html) that demonstrates how to get a certificate with _acme4j_. It is not useful as a dependency in other projects. + +acme4j-it +: [`acme4j-it`](https://mvnrepository.com/artifact/org.shredzone.acme4j/acme4j-it/latest) mainly serves as integration test suite for _acme4j_ itself. It is not really useful as a dependency in other projects. However if you write own integration tests using [pebble](https://github.com/letsencrypt/pebble) and [pebble-challtestsrv](https://hub.docker.com/r/letsencrypt/pebble-challtestsrv), you may find the [`challtestsrv` configuration client](https://shredzone.org/maven/acme4j/acme4j-it/apidocs/org/shredzone/acme4j/it/BammBammClient.html) useful in your project. + + The Java module name is `org.shredzone.acme4j.it`. + +## Contribute + +* Fork the [Source code at GitHub](https://github.com/shred/acme4j). Feel free to send pull requests. +* Found a bug? [File a bug report!](https://github.com/shred/acme4j/issues) + +## License + +_acme4j_ is open source software. The source code is distributed under the terms of [Apache License 2.0](http://www.apache.org/licenses/LICENSE-2.0). diff --git a/src/site/markdown/migration.md b/src/doc/docs/migration.md similarity index 100% rename from src/site/markdown/migration.md rename to src/doc/docs/migration.md diff --git a/src/site/markdown/usage/account.md b/src/doc/docs/usage/account.md similarity index 84% rename from src/site/markdown/usage/account.md rename to src/doc/docs/usage/account.md index 296f1423..3edd214b 100644 --- a/src/site/markdown/usage/account.md +++ b/src/doc/docs/usage/account.md @@ -4,9 +4,8 @@ The first step is to register an account with the CA. Your account needs a key pair. The public key is used to identify your account, while the private key is used to sign the requests to the ACME server. - +!!! note + Your private key is never transmitted to the ACME server. After the CA has created your account, it returns an account URL. You will need both the key pair and the account URL for logging into the account later. @@ -26,9 +25,8 @@ You can also create an elliptic curve key pair: KeyPair accountKeyPair = KeyPairUtils.createECKeyPair("secp256r1"); ``` - +!!! danger + Your key pair is the only way to access your account. If you should lose it, you will be locked out from your account and certificates. The API does not offer a way to recover access after a key loss. The only way is to contact the CA and hope for assistance. For this reason, it is strongly recommended to keep the key pair in a safe place! To save a `KeyPair` (actually, the private key of the key pair) to a pem file, you can use this snippet: @@ -62,12 +60,10 @@ URL accountLocationUrl = account.getLocation(); If the account was successfully created, you will get an `Account` object in return. Invoking its `getLocation()` method will return the location URL of your account. Unlike your key pair, the location is a public information that does not need security precautions. -Now you have a key pair and the account's location URL. This is all you need for [logging in](./login.html). +Now you have a key pair and the account's location URL. This is all you need for [logging in](login.md). - +!!! note + Even if it is tempting to do so, you should not invoke `agreeToTermsOfService()` automatically, but let the user confirm the terms of service first. To get a link to the current terms of service, you can invoke `session.getMetadata().getTermsOfService()`. If the CA changes the terms of service and requires an explicit agreement to the new terms, an `AcmeUserActionRequiredException` is thrown. Its `getInstance()` method returns the URL of a document that gives instructions about how to agree to the new terms of service. There is no way to automatize this process. @@ -128,10 +124,8 @@ account.deactivate(); Depending on the CA, the related authorizations may be automatically deactivated as well. The certificates may still be valid until expiration or explicit revocation. If you want to make sure the certificates are invalidated as well, revoke them prior to deactivation of your account. - +!!! danger + There is no way to reactivate the account once it is deactivated! ## Custom Key Identifier diff --git a/src/site/markdown/usage/certificate.md b/src/doc/docs/usage/certificate.md similarity index 86% rename from src/site/markdown/usage/certificate.md rename to src/doc/docs/usage/certificate.md index 4f5dc33a..565efd97 100644 --- a/src/site/markdown/usage/certificate.md +++ b/src/doc/docs/usage/certificate.md @@ -17,10 +17,8 @@ This is a very simple example. You should limit the number of loop iterations, a `update()` may throw an `AcmeRetryAfterException`, giving an estimated instant in `getRetryAfter()` when the certificate is available. You should then wait until that moment has been reached, before trying again. The state of your `Order` instance is still updated when this exception is thrown. - +!!! tip + If the status is `PENDING`, you have not completed all authorizations yet. As soon as the status is `VALID`, you can retrieve a `Certificate` object: @@ -53,12 +51,10 @@ try (FileWriter fw = new FileWriter("cert-chain.crt")) { Certificates are only valid for a limited time, and need to be renewed before expiry. - - -A certificate can be renewed a few days before its expiry. There is no explicit method for certificate renewal. To renew it, just [order](./order.html) the certificate again. +A certificate can be renewed a few days before its expiry. There is no explicit method for certificate renewal. To renew it, just [order](order.md) the certificate again. ## Revocation @@ -94,6 +90,5 @@ X509Certificate cert = ... // certificate to revoke Certificate.revoke(session, domainKeyPair, cert, RevocationReason.KEY_COMPROMISE); ``` - +!!! warning + There is no way to revoke a certificate if you have lost both your account's key pair and your domain's key pair. diff --git a/src/doc/docs/usage/index.md b/src/doc/docs/usage/index.md new file mode 100644 index 00000000..e1e32aab --- /dev/null +++ b/src/doc/docs/usage/index.md @@ -0,0 +1,11 @@ +# How to Use acme4j + +_acme4j_ is a client library that helps connecting to ACME servers without worrying about specification details. + +To get a certificate from your ACME CA, these steps need to be performed: + +* [Start a Session](session.md) +* [Register a new Account](account.md) +* [Login into an Account](login.md) +* [Order a Certificate](order.md) +* [Download a Certificate](certificate.md) diff --git a/src/site/markdown/usage/login.md b/src/doc/docs/usage/login.md similarity index 79% rename from src/site/markdown/usage/login.md rename to src/doc/docs/usage/login.md index be6c5d63..f2ae13eb 100644 --- a/src/site/markdown/usage/login.md +++ b/src/doc/docs/usage/login.md @@ -21,10 +21,8 @@ Now you can simply get your `Account` instance from the `Login`: Account account = login.getAccount(); ``` - +!!! tip + It is possible to have multiple `Login`s to different accounts per session. This is useful if your software handles the certificates of more than one account. ## Login on Creation @@ -63,14 +61,9 @@ However the `Login` the object is bound with is _not_ serialized! The reason is This means that a deserialized object is not bound to a `Login` yet. It is required to rebind it to a `Login`, by invoking the `rebind()` method of the resource object. - - - +!!! warning + Do not share serialized data between different versions of _acme4j_. diff --git a/src/site/markdown/usage/order.md b/src/doc/docs/usage/order.md similarity index 83% rename from src/site/markdown/usage/order.md rename to src/doc/docs/usage/order.md index 1ea8bcfe..10c0c225 100644 --- a/src/site/markdown/usage/order.md +++ b/src/doc/docs/usage/order.md @@ -13,9 +13,8 @@ Order order = account.newOrder() .create(); ``` - +!!! note + The number of domains per certificate may be limited. See your CA's documentation for the limits. The `Order` resource contains a collection of `Authorization`s that can be read from the `getAuthorizations()` method. You must process _all of them_ in order to get the certificate, except those with a `VALID` status. @@ -29,7 +28,7 @@ for (Authorization auth : order.getAuthorizations()) { ## Process an Authorization -The `Authorization` instance contains further details about how you can prove ownership of your domain. An ACME server offers combinations of different authorization methods, called `Challenge`s. +The `Authorization` instance contains further details about how you can prove ownership of your domain. An ACME server offers one or more authorization methods, called `Challenge`s. `getChallenges()` returns a collection of all `Challenge`s offered by the CA for domain ownership validation. You only need to complete _one_ of them to successfully authorize your domain. @@ -40,9 +39,12 @@ Http01Challenge challenge = auth.findChallenge(Http01Challenge.TYPE); // by name Http01Challenge challenge = auth.findChallenge(Http01Challenge.class); // by type ``` -It returns a properly casted `Challenge` object, or `null` if your challenge type was not acceptable. In this example, your system is able to respond to a [http-01](../challenge/http-01.html) challenge. +It returns a properly casted `Challenge` object, or `null` if your challenge type was not acceptable. In this example, your system is able to respond to a [http-01](../challenge/http-01.md) challenge. -The returned `Challenge` resource provides all the data that is necessary for a successful verification of your domain ownership. Your response depends on the challenge type (see the [documentation of challenges](../challenge/index.html)). +!!! tip + Passing the challenge class is preferred over the challenge name, as type checks are performed at compile time here. Passing in the challenge name might result in a `ClassCastException` at runtime. + +The returned `Challenge` resource provides all the data that is necessary for a successful verification of your domain ownership. Your response depends on the challenge type (see the [documentation of challenges](../challenge/index.md)). After you have performed the necessary steps to set up the response to the challenge (e.g. configuring your web server or modifying your DNS records), the ACME server is told to test your response: @@ -75,9 +77,8 @@ After successfully completing all authorizations, the order needs to be finalize CSR files can be generated with command line tools like `openssl`. Unfortunately the standard Java does not offer classes for that, so you'd have to resort to [Bouncy Castle](http://www.bouncycastle.org/java.html) if you want to create a CSR programmatically. In the `acme4j-utils` module, there is a [`CSRBuilder`](../apidocs/org/shredzone/acme4j/util/CSRBuilder.html) for your convenience. You can also use [`KeyPairUtils`](../apidocs/org/shredzone/acme4j/util/KeyPairUtils.html) for generating a new key pair for your domain. - +!!! tip + Never use your account key pair as domain key pair, but always generate separate key pairs! ```java KeyPair domainKeyPair = ... // KeyPair to be used for HTTPS encryption @@ -107,10 +108,8 @@ order.execute(csr); You can also generate a wildcard certificate that is valid for all subdomains of a domain, by prefixing the domain name with `*.` (e.g. `*.example.org`). The domain itself is not covered by the wildcard certificate, and also needs to be added to the order if necessary. - +!!! note + _acme4j_ accepts all kind of wildcard notations (e.g. `www.*.example.org`, `*.*.example.org`). However, those notations are not specified and may be rejected by your CA. You must be able to prove ownership of the domain that you want to order a wildcard certificate for. The corresponding `Authorization` resource only refers to that domain, and does not contain the wildcard notation. @@ -134,10 +133,8 @@ order.execute(csr); In the subsequent authorization process, you would have to prove ownership of the `example.org` domain. - +!!! note + Some CAs may reject wildcard certificate orders, may only offer a limited set of `Challenge`s, or may involve `Challenge`s that are not documented here. Refer to your CA's documentation to find out about the wildcard certificate policy. ## Pre-Authorize a Domain @@ -150,15 +147,11 @@ String domain = ... // Domain name to authorize Authorization auth = account.preAuthorizeDomain(domain); ``` - - - +!!! note + Some CAs may not offer wildcard domain pre-authorization, but only wildcard domain orders. ## Deactivate an Authorization @@ -168,9 +161,8 @@ It is possible to deactivate an `Authorization`, for example if you sell the ass auth.deactivate(); ``` - +!!! tip + It is not documented if the deactivation of an authorization also revokes the related certificate. If the certificate should be revoked, revoke it manually before deactivation. ## Use IP Identifiers @@ -200,10 +192,8 @@ byte[] csr = csrb.getEncoded(); _acme4j_ supports the [ACME STAR](https://tools.ietf.org/html/draft-ietf-acme-star) extension for short-term automatic renewal of certificates. - +!!! warning + The _ACME STAR_ support is experimental. There is currently no known ACME server implementing this extension. To find out if the CA supports the STAR extension, check the metadata: @@ -230,9 +220,8 @@ After the validation process is completed and the order is finalized, the STAR c Use `Certificate.getLocation()` to retrieve the URL of your certificate. It is renewed automatically, so you will always be able to download the latest issue of the certificate from this URL. - +!!! note + STAR based certificates cannot be revoked. However, as it is the nature of these certs to be short-lived, this does not pose an actual security issue. To download the latest certificate issue, you can bind the certificate URL to your `Login` and then use the `Certificate` object. diff --git a/src/site/markdown/usage/session.md b/src/doc/docs/usage/session.md similarity index 100% rename from src/site/markdown/usage/session.md rename to src/doc/docs/usage/session.md diff --git a/src/doc/mkdocs.yml b/src/doc/mkdocs.yml new file mode 100644 index 00000000..0e328e43 --- /dev/null +++ b/src/doc/mkdocs.yml @@ -0,0 +1,44 @@ +site_name: acme4j +site_author: Richard Körber +site_url: https://acme4j.shredzone.org +site_dir: target/site/ +repo_url: https://github.com/shred/acme4j +edit_uri: '' +use_directory_urls: false +theme: + name: readthedocs + custom_dir: theme/ + highlightjs: false +markdown_extensions: + - admonition + - codehilite + - def_list + - toc: + permalink: true +nav: + - 'index.md' + - JavaDocs: + - 'acme4j-client': acme4j-client/apidocs/index.html + - 'acme4j-utils': acme4j-utils/apidocs/index.html + - 'acme4j-it': acme4j-it/apidocs/index.html + - Usage: + - 'usage/index.md' + - 'usage/session.md' + - 'usage/account.md' + - 'usage/login.md' + - 'usage/order.md' + - 'usage/certificate.md' + - Challenges: + - 'challenge/index.md' + - 'challenge/http-01.md' + - 'challenge/dns-01.md' + - 'challenge/tls-alpn-01.md' + - CA: + - 'ca/index.md' + - 'ca/letsencrypt.md' + - 'ca/pebble.md' + - Development: + - 'development/index.md' + - 'development/provider.md' + - 'development/testing.md' + - 'migration.md' diff --git a/src/doc/theme/breadcrumbs.html b/src/doc/theme/breadcrumbs.html new file mode 100644 index 00000000..e69de29b diff --git a/src/doc/theme/css/font.css b/src/doc/theme/css/font.css new file mode 100644 index 00000000..5f4f376a --- /dev/null +++ b/src/doc/theme/css/font.css @@ -0,0 +1,35 @@ +/* + * Lato + * Copyright 2010-2011 tyPoland Lukasz Dziedzic + * SIL Open Font License, 1.1 + */ +@font-face { + font-family: 'Lato'; + font-style: normal; + font-weight: 400; + src: local('Lato Regular'), local('Lato-Regular'), url('../fonts/lato-v15-latin-regular.woff') format('woff'); +} + +/* + * Roboto Slab + * Copyright 2013 Google + * Apache License, version 2.0 + */ +@font-face { + font-family: 'Roboto Slab'; + font-style: normal; + font-weight: 400; + src: local('Roboto Slab Regular'), local('RobotoSlab-Regular'), url('../fonts/roboto-slab-v8-latin-regular.woff') format('woff'); +} + +/* + * Inconsolata + * Copyright 2006 The Inconsolata Project Authors + * SIL Open Font License, 1.1 + */ +@font-face { + font-family: 'Inconsolata'; + font-style: normal; + font-weight: 400; + src: local('Inconsolata Regular'), local('Inconsolata-Regular'), url('../fonts/inconsolata-v17-latin-regular.woff') format('woff'); +} diff --git a/src/doc/theme/css/theme_custom.css b/src/doc/theme/css/theme_custom.css new file mode 100644 index 00000000..4b0ff5cd --- /dev/null +++ b/src/doc/theme/css/theme_custom.css @@ -0,0 +1,14 @@ + +.wy-nav-content { + max-width: none; +} + +pre { + background-color: #f6f6f6; + padding: .4rem; + overflow-x: auto; +} + +footer { + margin-top: 2rem; +} diff --git a/src/doc/theme/fonts/inconsolata-v17-latin-regular.woff b/src/doc/theme/fonts/inconsolata-v17-latin-regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..9771531d13dd6ea24f9bac976573d14d7880f6e4 GIT binary patch literal 21764 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

P)GKALp;r>c_14rVh$KFE_<5vTQ)C= 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 literal 0 HcmV?d00001 diff --git a/src/doc/theme/fonts/lato-v15-latin-regular.woff b/src/doc/theme/fonts/lato-v15-latin-regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..189a0feb590a6a6b77b54c8edb09cb1512c3ca60 GIT binary patch literal 28660 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 c4i*LoHxdYTF#d1dz|y;smB9r7@>nYt02| +

+ diff --git a/src/doc/theme/main.html b/src/doc/theme/main.html new file mode 100644 index 00000000..00bb903e --- /dev/null +++ b/src/doc/theme/main.html @@ -0,0 +1,15 @@ +{% extends "base.html" %} + +{% block styles %} + + + + +{%- for path in config['extra_css'] %} + +{%- endfor %} +{% endblock %} + +{% block repo %} +API javadocs +{% endblock %} diff --git a/src/doc/theme/toc.html b/src/doc/theme/toc.html new file mode 100644 index 00000000..f7a6c9e9 --- /dev/null +++ b/src/doc/theme/toc.html @@ -0,0 +1,9 @@ +{% for toc_item in page.toc %} + {% if toc_item.children %} + + {% endif %} +{% endfor %} diff --git a/src/site/markdown/ca/index.md b/src/site/markdown/ca/index.md deleted file mode 100644 index 7fd624bb..00000000 --- a/src/site/markdown/ca/index.md +++ /dev/null @@ -1,19 +0,0 @@ -# Certificate Authorities - -_acme4j_ should support any CA providing an ACME server. - -## Available Providers - -The _acme4j_ package contains these providers: - -* [Let's Encrypt](./letsencrypt.html) -* [Pebble](./pebble.html) - -More CAs may be supported in future releases of _acme4j_. - -Also, CAs can publish provider jar files that plug into _acme4j_ and offer extended support. - - diff --git a/src/site/markdown/index.md.vm b/src/site/markdown/index.md.vm deleted file mode 100644 index d838646b..00000000 --- a/src/site/markdown/index.md.vm +++ /dev/null @@ -1,58 +0,0 @@ -acme4j -====== - -A Java client for the _Automatic Certificate Management Environment_ (ACME) protocol as specified in [RFC 8555](https://tools.ietf.org/html/rfc8555). - -ACME is a protocol that a certificate authority (CA) and an applicant can use to automate the process of verification and certificate issuance. - -This Java client helps connecting to an ACME server, and performing all necessary steps to manage certificates. - -It is an independent open source implementation that is not affiliated with or endorsed by _Let's Encrypt_. - -The source code can be found at [GitHub](https://github.com/shred/acme4j) and is distributed under the terms of [Apache License 2.0](http://www.apache.org/licenses/LICENSE-2.0). - - - -Quick Start ------------ - -_acme4j_ is available at Maven Central. Just add this snippet to your `pom.xml`: - -```xml - - ${project.groupId} - ${project.artifactId}-client - ${project.version} - -``` - -For Gradle: - -```groovy -dependencies { - compile '${project.groupId}:${project.artifactId}-client:${project.version}' -} -``` - -There is also an optional utility module that will help you handling key pairs and certificates (but requires [Bouncy Castle](https://www.bouncycastle.org/java.html)): - -```xml - - ${project.groupId} - ${project.artifactId}-utils - ${project.version} - -``` - -For Gradle: - -```groovy -dependencies { - compile '${project.groupId}:${project.artifactId}-utils:${project.version}' -} -``` - -Now just have a look at [this source code](./acme4j-example/apidocs/src-html/org/shredzone/acme4j/ClientTest.html) to see an example usage. diff --git a/src/site/markdown/usage/index.md b/src/site/markdown/usage/index.md deleted file mode 100644 index bbc8f922..00000000 --- a/src/site/markdown/usage/index.md +++ /dev/null @@ -1,11 +0,0 @@ -# How to Use _acme4j_ - -_acme4j_ is a client library that helps connecting to ACME servers without worrying about specification details. - -To get a certificate from your ACME CA, these steps need to be performed: - -* [Start a Session](./session.html) -* [Register a new Account](./account.html) -* [Login into an Account](./login.html) -* [Order a Certificate](./order.html) -* [Download a Certificate](./certificate.html) diff --git a/src/site/resources/css/site.css b/src/site/resources/css/site.css deleted file mode 100644 index 9ba040f3..00000000 --- a/src/site/resources/css/site.css +++ /dev/null @@ -1,20 +0,0 @@ -.alert { - border: none; - padding: 5px 10px; -} - -.alert-info { - border-left: 10px solid #3a87ad; -} - -.alert-warning { - border-left: 10px solid #c09853; -} - -.alert-danger { - border-left: 10px solid #b94a48; -} - -.alert p { - margin: 0; -} diff --git a/src/site/site.xml b/src/site/site.xml deleted file mode 100644 index ac23b22e..00000000 --- a/src/site/site.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - $(document).ready(function(){$(".source").addClass("prettyprint");prettyPrint();});]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - org.apache.maven.skins - maven-fluido-skin - 1.7 - -