#!/usr/bin/env bash ## Generates cluster-valid SSL certs for the webhook service ## Inspired from ## https://raw.githubusercontent.com/istio/istio/release-0.7/install/kubernetes/webhook-create-signed-cert.sh ## whose license is also Apache 2.0 set -e usage() { cat <> "$CSR_CONF" [req] req_extensions = v3_req distinguished_name = req_distinguished_name [req_distinguished_name] [ v3_req ] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] DNS.1 = $SERVICE DNS.2 = $SERVICE.$NAMESPACE DNS.3 = $SERVICE.$NAMESPACE.svc EOF } gen_file gen_csr_conf "$CSR_CONF" SERVER_CSR="$CERTS_DIR/server.csr" gen_server_scr() { openssl req -new -key "$SERVER_KEY" -subj "/O=system:nodes/CN=system:node:$SERVICE.$NAMESPACE.svc" -out "$SERVER_CSR" -config "$CSR_CONF"; } gen_file gen_server_scr "$SERVER_CSR" CSR_NAME="$SERVICE.$NAMESPACE" # clean-up any previously created CSR for our service if ! $DRY_RUN && $KUBECTL get csr "$CSR_NAME" &> /dev/null; then $KUBECTL delete csr "$CSR_NAME" fi # create server cert/key CSR and send to k8s API CSR_CONTENTS=$(cat <&1 ; } wait_for verify_csr_created "CSR $CSR_NAME not properly created" fi # approve and fetch the signed certificate echo_or_run "$KUBECTL certificate approve $CSR_NAME" if ! $DRY_RUN; then verify_cert_signed() { local CERT_CONTENTS CERT_CONTENTS=$($KUBECTL get csr $CSR_NAME -o jsonpath='{.status.certificate}') echo "$CERT_CONTENTS" [[ "$CERT_CONTENTS" != "" ]] } SERVER_CERT_CONTENTS=$(wait_for verify_cert_signed "after approving CSR $CSR_NAME, the signed certificate did not appear on the resource") gen_server_cert() { echo "$SERVER_CERT_CONTENTS" | openssl base64 -d -A -out "$SERVER_CERT"; } gen_file gen_server_cert "$SERVER_CERT" fi