2323while [[ $# -gt 0 ]]; do
2424 case ${1} in
2525 --service)
26- service =" $2 "
26+ SERVICE =" $2 "
2727 shift
2828 ;;
2929 --secret)
30- secret =" $2 "
30+ SECRET =" $2 "
3131 shift
3232 ;;
3333 --namespace)
34- namespace =" $2 "
34+ NAMESPACE =" $2 "
3535 shift
3636 ;;
3737 * )
@@ -41,28 +41,29 @@ while [[ $# -gt 0 ]]; do
4141 shift
4242done
4343
44- if [[ -z ${service } ]]; then
44+ if [[ -z ${SERVICE } ]]; then
4545 echo " '--service' must be specified"
4646 exit 1
4747fi
4848
49- if [[ -z ${secret } ]]; then
49+ if [[ -z ${SECRET } ]]; then
5050 echo " '--secret' must be specified"
5151 exit 1
5252fi
5353
54- [[ -z ${namespace } ]] && namespace =default
54+ [[ -z ${NAMESPACE } ]] && NAMESPACE =default
5555
5656if [[ ! -x " $( command -v openssl) " ]]; then
5757 echo " openssl not found"
5858 exit 1
5959fi
6060
61- csrName=${service} .${namespace}
62- tmpdir=$( mktemp -d)
63- echo " creating certs in tmpdir ${tmpdir} "
61+ CERTDIR=/tmp
6462
65- cat << EOF >> ${tmpdir} /csr.conf
63+ function createCerts() {
64+ echo " creating certs in dir ${CERTDIR} "
65+
66+ cat << EOF > ${CERTDIR} /csr.conf
6667[req]
6768req_extensions = v3_req
6869distinguished_name = req_distinguished_name
@@ -73,64 +74,31 @@ keyUsage = nonRepudiation, digitalSignature, keyEncipherment
7374extendedKeyUsage = serverAuth
7475subjectAltName = @alt_names
7576[alt_names]
76- DNS.1 = ${service }
77- DNS.2 = ${service } .${namespace }
78- DNS.3 = ${service } .${namespace } .svc
77+ DNS.1 = ${SERVICE }
78+ DNS.2 = ${SERVICE } .${NAMESPACE }
79+ DNS.3 = ${SERVICE } .${NAMESPACE } .svc
7980EOF
8081
81- openssl genrsa -out ${tmpdir} /server-key.pem 2048
82- openssl req -new -key ${tmpdir} /server-key.pem -subj " /CN=${service} .${namespace} .svc" -out ${tmpdir} /server.csr -config ${tmpdir} /csr.conf
83-
84- # clean-up any previously created CSR for our service. Ignore errors if not present.
85- kubectl delete csr ${csrName} 2> /dev/null || true
82+ openssl genrsa -out ${CERTDIR} /ca.key 2048
83+ openssl req -x509 -new -nodes -key ${CERTDIR} /ca.key -subj " /CN=${SERVICE} .${NAMESPACE} .svc" -out ${CERTDIR} /ca.crt
8684
87- # create server cert/key CSR and send to k8s API
88- cat << EOF | kubectl create -f -
89- apiVersion: certificates.k8s.io/v1beta1
90- kind: CertificateSigningRequest
91- metadata:
92- name: ${csrName}
93- spec:
94- groups:
95- - system:authenticated
96- request: $( cat ${tmpdir} /server.csr | base64 | tr -d ' \n' )
97- usages:
98- - digital signature
99- - key encipherment
100- - server auth
101- EOF
85+ openssl genrsa -out ${CERTDIR} /server.key 2048
86+ openssl req -new -key ${CERTDIR} /server.key -subj " /CN=${SERVICE} .${NAMESPACE} .svc" -out ${CERTDIR} /server.csr -config ${CERTDIR} /csr.conf
10287
103- # verify CSR has been created
104- while true ; do
105- kubectl get csr ${csrName}
106- if [ " $? " -eq 0 ]; then
107- break
108- fi
109- done
88+ openssl x509 -req -in ${CERTDIR} /server.csr -CA ${CERTDIR} /ca.crt -CAkey ${CERTDIR} /ca.key \
89+ -CAcreateserial -out ${CERTDIR} /server.crt \
90+ -extensions v3_req -extfile ${CERTDIR} /csr.conf
91+ }
11092
111- # approve and fetch the signed certificate
112- kubectl certificate approve ${csrName}
113- # verify certificate has been signed
114- for x in $( seq 20) ; do
115- serverCert=$( kubectl get csr ${csrName} -o jsonpath=' {.status.certificate}' )
116- if [[ ${serverCert} != ' ' ]]; then
117- break
118- fi
119- sleep 1
120- done
121- if [[ ${serverCert} == ' ' ]]; then
122- echo " ERROR: After approving csr ${csrName} , the signed certificate did not appear on the resource. Giving up after 20 attempts." >&2
123- exit 1
124- fi
125- echo ${serverCert} | openssl base64 -d -A -out ${tmpdir} /server-cert.pem
93+ function createSecret() {
94+ # create the secret with CA cert and server cert/key
95+ kubectl create secret generic ${SECRET} \
96+ --from-file=tls.key=${CERTDIR} /server.key \
97+ --from-file=tls.crt=${CERTDIR} /server.crt \
98+ --from-file=ca.crt=${CERTDIR} /ca.crt \
99+ -n ${NAMESPACE}
100+ }
126101
127- # ca cert
128- kubectl get configmap -n kube-system extension-apiserver-authentication -o=jsonpath=' {.data.client-ca-file}' >> ${tmpdir} /ca-cert.pem
102+ createCerts
129103
130- # create the secret with CA cert and server cert/key
131- kubectl create secret generic ${secret} \
132- --from-file=tls.key=${tmpdir} /server-key.pem \
133- --from-file=tls.crt=${tmpdir} /server-cert.pem \
134- --from-file=ca.crt=${tmpdir} /ca-cert.pem \
135- --dry-run -o yaml |
136- kubectl -n ${namespace} apply -f -
104+ createSecret
0 commit comments