Skip to content

Instantly share code, notes, and snippets.

@jessesanford
Forked from alex-leonhardt/ssl.sh
Last active February 23, 2021 20:35
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jessesanford/ba930e10d455fbd80e74b3b5ec4e8eed to your computer and use it in GitHub Desktop.
Save jessesanford/ba930e10d455fbd80e74b3b5ec4e8eed to your computer and use it in GitHub Desktop.
Create signed SSL cert with K8S CA
#! /bin/bash
set -o errexit
export APP="${1:-mutateme}"
export NAMESPACE="${2:-default}"
export CSR_NAME="${APP}.${NAMESPACE}.svc"
echo "... creating ${app}.key"
openssl genrsa -out ${APP}.key 2048
echo "... creating ${app}.csr"
cat >csr.conf<<EOF
[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 = ${APP}
DNS.2 = ${APP}.${NAMESPACE}
DNS.3 = ${CSR_NAME}
DNS.4 = ${CSR_NAME}.cluster.local
EOF
echo "openssl req -new -key ${APP}.key -subj \"/CN=${CSR_NAME}\" -out ${APP}.csr -config csr.conf"
openssl req -new -key ${APP}.key -subj "/CN=${CSR_NAME}" -out ${APP}.csr -config csr.conf
echo "... deleting existing csr, if any"
echo "kubectl delete csr ${CSR_NAME} || :"
kubectl delete csr ${CSR_NAME} || :
echo "... creating kubernetes CSR object"
echo "kubectl create -f -"
kubectl create -f - <<EOF
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
name: ${CSR_NAME}
spec:
groups:
- system:authenticated
request: $(cat ${APP}.csr | base64 | tr -d '\n')
usages:
- digital signature
- key encipherment
- server auth
EOF
SECONDS=0
while true; do
echo "... waiting for csr to be present in kubernetes"
echo "kubectl get csr ${CSR_NAME}"
kubectl get csr ${CSR_NAME} > /dev/null 2>&1
if [ "$?" -eq 0 ]; then
break
fi
if [[ $SECONDS -ge 60 ]]; then
echo "[!] timed out waiting for csr"
exit 1
fi
sleep 2
done
kubectl certificate approve ${CSR_NAME}
SECONDS=0
while true; do
echo "... waiting for serverCert to be present in kubernetes"
echo "kubectl get csr ${CSR_NAME} -o jsonpath='{.status.certificate}'"
serverCert=$(kubectl get csr ${CSR_NAME} -o jsonpath='{.status.certificate}')
if [[ $serverCert != "" ]]; then
break
fi
if [[ $SECONDS -ge 60 ]]; then
echo "[!] timed out waiting for serverCert"
exit 1
fi
sleep 2
done
echo "... creating ${app}.pem cert file"
echo "\$serverCert | openssl base64 -d -A -out ${APP}.pem"
echo ${serverCert} | openssl base64 -d -A -out ${APP}.pem
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment