Skip to content

Commit 3ed82a4

Browse files
committed
Use openssl to sign certificate instead of using k8s
1 parent a4f51ee commit 3ed82a4

1 file changed

Lines changed: 32 additions & 64 deletions

File tree

installer/dockerfile/webhook-manager/gen-admission-secret.sh

Lines changed: 32 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,15 @@ EOF
2323
while [[ $# -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
4242
done
4343

44-
if [[ -z ${service} ]]; then
44+
if [[ -z ${SERVICE} ]]; then
4545
echo "'--service' must be specified"
4646
exit 1
4747
fi
4848

49-
if [[ -z ${secret} ]]; then
49+
if [[ -z ${SECRET} ]]; then
5050
echo "'--secret' must be specified"
5151
exit 1
5252
fi
5353

54-
[[ -z ${namespace} ]] && namespace=default
54+
[[ -z ${NAMESPACE} ]] && NAMESPACE=default
5555

5656
if [[ ! -x "$(command -v openssl)" ]]; then
5757
echo "openssl not found"
5858
exit 1
5959
fi
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]
6768
req_extensions = v3_req
6869
distinguished_name = req_distinguished_name
@@ -73,64 +74,31 @@ keyUsage = nonRepudiation, digitalSignature, keyEncipherment
7374
extendedKeyUsage = serverAuth
7475
subjectAltName = @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
7980
EOF
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

Comments
 (0)