Skip to content

Instantly share code, notes, and snippets.

@jtfogarty
Last active February 19, 2022 02:48
Show Gist options
  • Save jtfogarty/173d46037d7d69b46cbf457cb9d41cc8 to your computer and use it in GitHub Desktop.
Save jtfogarty/173d46037d7d69b46cbf457cb9d41cc8 to your computer and use it in GitHub Desktop.
CertificateSigningRequest
#!/bin/bash
# SERVICE=vault-server-tls
SERVICE=vault-svc
# NAMESPACE where the Vault service is running.
NAMESPACE=vault
# SECRET_NAME to create in the Kubernetes secrets store.
SECRET_NAME=vault-server-tls
# TMPDIR is a temporary working directory.
TMPDIR=/vault/userconfig/vault-server-tls
# CSR_NAME
CSR_NAME=vault-csr
#clean up previous runs
rm ${TMPDIR}/*
sleep 5
kubectl delete csr ${CSR_NAME}
kubectl delete secret -n ${NAMESPACE} ${SECRET_NAME}
openssl genrsa -out ${TMPDIR}/vault.key 2048
cat <<EOF >${TMPDIR}/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
DNS.4 = ${SERVICE}.${NAMESPACE}.svc.cluster.local
IP.1 = 127.0.0.1
EOF
# The below command does not work as detailed here https://github.com/kubernetes/kubernetes/issues/99504.
#openssl req -new -key ${TMPDIR}/vault.key -subj "/CN=${SERVICE}.${NAMESPACE}.svc" -out ${TMPDIR}/server.csr -config ${TMPDIR}/csr.conf
# Here is the command that works
openssl req -new -key ${TMPDIR}/vault.key -subj "/CN=system:node:${SERVICE};/O=system:nodes" -out ${TMPDIR}/server.csr -config ${TMPDIR}/csr.conf
cat <<EOF >${TMPDIR}/csr.yaml
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: ${CSR_NAME}
spec:
groups:
- system:authenticated
request: $(cat ${TMPDIR}/server.csr | base64 | tr -d '\n')
signerName: kubernetes.io/kubelet-serving
usages:
- digital signature
- key encipherment
- server auth
EOF
kubectl create -f ${TMPDIR}/csr.yaml
kubectl certificate approve ${CSR_NAME}
serverCert=$(kubectl get csr ${CSR_NAME} -o jsonpath='{.status.certificate}')
echo "${serverCert}" | openssl base64 -d -A -out ${TMPDIR}/vault.crt
kubectl config view --raw --minify --flatten -o jsonpath='{.clusters[].cluster.certificate-authority-data}' | base64 -d > ${TMPDIR}/vault.ca
kubectl create secret generic ${SECRET_NAME} \
--namespace ${NAMESPACE} \
--from-file=vault.key=${TMPDIR}/vault.key \
--from-file=vault.crt=${TMPDIR}/vault.crt \
--from-file=vault.ca=${TMPDIR}/vault.ca
#!/bin/bash
# SERVICE=vault-server-tls
SERVICE=vault-svc
# NAMESPACE where the Vault service is running.
NAMESPACE=vault
# SECRET_NAME to create in the Kubernetes secrets store.
SECRET_NAME=vault-server-tls
# TMPDIR is a temporary working directory.
TMPDIR=/vault/userconfig/vault-server-tls
# CSR_NAME
CSR_NAME=vault-csr
#clean up previous runs
rm ${TMPDIR}/*
sleep 5
kubectl delete csr ${CSR_NAME}
kubectl delete secret -n ${NAMESPACE} ${SECRET_NAME}
openssl genrsa -out ${TMPDIR}/vault.key 2048
cat <<EOF >${TMPDIR}/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
DNS.4 = ${SERVICE}.${NAMESPACE}.svc.cluster.local
IP.1 = 127.0.0.1
EOF
openssl req -new -key ${TMPDIR}/vault.key -subj "/CN=${SERVICE}.${NAMESPACE}.svc" -out ${TMPDIR}/server.csr -config ${TMPDIR}/csr.conf
cat <<EOF >${TMPDIR}/csr.yaml
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
name: ${CSR_NAME}
spec:
groups:
- system:authenticated
request: $(cat ${TMPDIR}/server.csr | base64 | tr -d '\n')
usages:
- digital signature
- key encipherment
- server auth
EOF
kubectl create -f ${TMPDIR}/csr.yaml
kubectl certificate approve ${CSR_NAME}
serverCert=$(kubectl get csr ${CSR_NAME} -o jsonpath='{.status.certificate}')
echo "${serverCert}" | openssl base64 -d -A -out ${TMPDIR}/vault.crt
kubectl config view --raw --minify --flatten -o jsonpath='{.clusters[].cluster.certificate-authority-data}' | base64 -d > ${TMPDIR}/vault.ca
kubectl create secret generic ${SECRET_NAME} \
--namespace ${NAMESPACE} \
--from-file=vault.key=${TMPDIR}/vault.key \
--from-file=vault.crt=${TMPDIR}/vault.crt \
--from-file=vault.ca=${TMPDIR}/vault.ca
@cdenneen
Copy link

@jtfogarty do I need to be a special user? Reason I ask is I've done the v1 but I never get a status.certificate back. So my vault.crt is empty in the secret.

I found this from a similar script which will fail the script since the certificate isn't populated:

# verify certificate has been signed
for x in $(seq 10); do
    serverCert=$(kubectl get csr ${csrName} -o jsonpath='{.status.certificate}')
    if [[ ${serverCert} != '' ]]; then
        break
    fi
    sleep 1
done

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment