aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Lange <code@nerdmind.de>2016-12-24 07:46:19 +0100
committerThomas Lange <code@nerdmind.de>2016-12-24 07:46:19 +0100
commit1830626b92d860012a56641b7a6c6f525a4ebdd7 (patch)
tree559ff8c2673c783e635d245531003327112584cf
parent641a9eaf784dbc10e8aa62d2b82ae1342d6dfa84 (diff)
downloadpainlessle-1830626b92d860012a56641b7a6c6f525a4ebdd7.tar.gz
painlessle-1830626b92d860012a56641b7a6c6f525a4ebdd7.tar.xz
painlessle-1830626b92d860012a56641b7a6c6f525a4ebdd7.zip
Additional command-line options to customize the certificate target filenames were added.
-rwxr-xr-xpainless-le.sh22
-rw-r--r--readme.md18
2 files changed, 28 insertions, 12 deletions
diff --git a/painless-le.sh b/painless-le.sh
index 3a15cd5..b729017 100755
--- a/painless-le.sh
+++ b/painless-le.sh
@@ -8,19 +8,27 @@
# assumes that you have an existing RSA private key stored within your desired #
# install directory (with the filename which is defined in "${CONFIDENTIAL}"). #
# #
-# ARGUMENT [-i]: Full path to the install directory for the certificates. #
-# ARGUMENT [-h]: List of hostnames for the certificate: example.org[:...] #
+# OPTION [-i]: Full path to the install directory for the certificates. #
+# OPTION [-h]: List of hostnames for the certificate: example.org[:...] #
+# OPTION [-K]: Filename for the existing RSA private key relative to [-i] #
+# OPTION [-I]: Target filename for the intermediate cert relative to [-i] #
+# OPTION [-C]: Target filename for the certificate only file relative to [-i] #
+# OPTION [-F]: Target filename for the certificate full file relative to [-i] #
# #
#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
#===============================================================================
# Parsing command-line arguments with the getopts shell builtin
#===============================================================================
-while getopts :i:h: opt
+while getopts :i:h:K:I:C:F: opt
do
case $opt in
i) ARGUMENT_DIRECTORY="$OPTARG" ;;
h) ARGUMENT_HOSTNAMES="$OPTARG" ;;
+ K) ARGUMENT_CONFIDENTIAL="$OPTARG" ;;
+ I) ARGUMENT_INTERMEDIATE="$OPTARG" ;;
+ C) ARGUMENT_CERTIFICATE_ONLY="$OPTARG" ;;
+ F) ARGUMENT_CERTIFICATE_FULL="$OPTARG" ;;
esac
done
@@ -52,10 +60,10 @@ LETSENCRYPT_ENDPOINT="https://acme-v01.api.letsencrypt.org/directory"
#===============================================================================
OPENSSLCONF="/etc/ssl/openssl.cnf"
REQUESTFILE=`mktemp /tmp/painless-le.XXXXXXXXXX.csr`
- CONFIDENTIAL="${ARGUMENT_DIRECTORY%/}/confidential.pem"
- INTERMEDIATE="${ARGUMENT_DIRECTORY%/}/intermediate.pem"
-CERTIFICATE_ONLY="${ARGUMENT_DIRECTORY%/}/certificate_only.pem"
-CERTIFICATE_FULL="${ARGUMENT_DIRECTORY%/}/certificate_full.pem"
+ CONFIDENTIAL="${ARGUMENT_DIRECTORY%/}/${ARGUMENT_CONFIDENTIAL:-confidential.pem}"
+ INTERMEDIATE="${ARGUMENT_DIRECTORY%/}/${ARGUMENT_INTERMEDIATE:-intermediate.pem}"
+CERTIFICATE_ONLY="${ARGUMENT_DIRECTORY%/}/${ARGUMENT_CERTIFICATE_ONLY:-certificate_only.pem}"
+CERTIFICATE_FULL="${ARGUMENT_DIRECTORY%/}/${ARGUMENT_CERTIFICATE_FULL:-certificate_full.pem}"
#===============================================================================
# Delete Certificate-Signing-Request (CSR) file on exit
diff --git a/readme.md b/readme.md
index 422d363..49a01ff 100644
--- a/readme.md
+++ b/readme.md
@@ -2,15 +2,23 @@
Painless issuing a single [X.509 certificate](https://tools.ietf.org/html/rfc5280) for a bunch of hostnames from the **Let's Encrypt** Certification Authority (CA) without having an HTTP server installed (or for those people who do not want to touch their HTTP web directories and place a specific file to accomplish the ACME challenge). PainlessLE assumes that there is already a manually created RSA private key which is used for the Certificate-Signing-Request (CSR) by OpenSSL. The location for the RSA private key is defined within the `"CONFIDENTIAL"` variable and the path should exist with the correct UNIX file permissions.
## Requirements
-The [Certbot client](https://certbot.eff.org/) must be installed on your machine because PainlessLE uses this piece of software to communicate over the [ACME protocol](https://tools.ietf.org/html/draft-ietf-acme-acme-01) with the ACME endpoint of Let's Encrypt and runs the ACME challenge. There are no known further requirements for the usage of PainlessLE on Debian GNU/Linux at this time.
+The [Certbot client](https://certbot.eff.org/) must be installed on your machine because PainlessLE uses this piece of software to communicate over the [ACME protocol](https://tools.ietf.org/html/draft-ietf-acme-acme-01) with the ACME endpoint of Let's Encrypt and runs the ACME challenge. There are no known further requirements for using PainlessLE on Debian GNU/Linux at this time.
## Configuration
Change the `LETSENCRYPT_ENDPOINT` to the address of the ACME staging API for testing purposes. You also can define a command within `LETSENCRYPT_COMMAND_BEFORE` to shutting down a running webserver to release the HTTP(S) port for the standalone webserver before certbot runs the ACME challenge. You can restart your webserver after the ACME challenge is completed within `LETSENCRYPT_COMMAND_AFTER`.
## Arguments
-1. `ARGUMENT_DIRECTORY [-i]` contains a string with the directory path where the certificates should be installed. This directory should already contain a manually created RSA private key for the Certificate-Signing-Request (CSR). It's always a good idea to handle the RSA private keys manually because you may use [HTTP Public-Key-Pinning (HPKP)](https://tools.ietf.org/html/rfc7469) so that you must ensure, that the RSA private key does not change.
-2. `ARGUMENT_HOSTNAMES [-h]` contains a colon (`:`) separated string with the DNS hostnames to include within the certificate. The string must be formatted as follows, without containing colons anywhere except **between** the hostnames: `example.org:blog.example.org:shop.example.org`
+### Required command-line options:
+* `[-i]`: Contains a string with the directory path where the certificates should be installed. This directory should already contain a manually created RSA private key (filename can be overwritten by providing the `[-K]` option) for the Certificate-Signing-Request (CSR). It's always a good idea to handle the RSA private keys manually because you may use [HTTP Public-Key-Pinning (HPKP)](https://tools.ietf.org/html/rfc7469) so that you must ensure, that the RSA private key does not change.
+
+* `[-h]`: Contains a colon (`:`) separated string with the DNS hostnames to include within the certificate. The string must be formatted as follows, without containing colons anywhere except **between** the hostnames: `example.org:blog.example.org:shop.example.org`
+
+### Additional command-line options:
+* `[-K]`: Filename for the existing RSA private key relative to `[-i]`
+* `[-I]`: Target filename for the intermediate certificate relative to `[-i]`
+* `[-C]`: Target filename for the certificate only file relative to `[-i]`
+* `[-F]`: Target filename for the certificate full fiĺe relative to `[-i]`
## Example
Lets assume that you want to get a single X.509 certificate from the Let's Encrypt CA which includes three hostnames of your domain `example.org` (main domain, blog subdomain and shop subdomain). You already have an RSA private key with the correct UNIX file permissions stored within the following example directory with the name `confidential.pem`:
@@ -18,9 +26,9 @@ Lets assume that you want to get a single X.509 certificate from the Let's Encry
/etc/painless-le/example.org/
└── [-rw-r----- user group ] confidential.pem
-The next step is to execute `painless-le.sh` and providing the `-i` and `-h` arguments which are described above. In this example, the complete command-line string with the desired install directory `/etc/painless-le/example.org` and the desired hostnames `example.org`, `blog.example.org` and `shop.example.org` looks as follows:
+The next step is to execute `painless-le.sh` and providing the `-i` and `-h` options which are described above. In this example, the complete command-line string with the desired install directory `/etc/painless-le/example.org` and the desired hostnames `example.org`, `blog.example.org` and `shop.example.org` looks as follows:
- painless-le.sh -i /etc/painless-le/example.org/ -h "example.org:blog.example.org:shop.example.org"
+ painless-le.sh -i /etc/painless-le/example.org/ -h example.org:blog.example.org:shop.example.org
The certbot client will now contacting the ACME challenge servers and runs a temporary standalone webserver on your machine to accomplish the ACME challenge. If all works fine, you have nothing to intervene. After the command was successfully executed, you will see your certificates within your desired install directory (the certificates inherit the permissions of the `confidential.pem` file) and you're done: