Last active
February 19, 2022 02:48
-
-
Save jtfogarty/173d46037d7d69b46cbf457cb9d41cc8 to your computer and use it in GitHub Desktop.
CertificateSigningRequest
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@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 myvault.crt
is empty in the secret.I found this from a similar script which will fail the script since the
certificate
isn't populated: