These are steps to easily install TLS certs to a Kubernetes cluster with Istio service mesh as ingress controller, provided by Let’s Encrypt‘s awesome certbot.
Installation of the certbot (on Ubuntu Linux 20.04LTS)
The certbot can be install via snap on Ubuntu Linux
sudo snap install --classic certbot sudo ln -s /snap/bin/certbot /usr/local/bin/certbot certbot --version certbot 1.15.0
By default certbot needs to write to system directories which I thought unnecessary. I use this alias to run certbot as a normal user
mkdir ~/.certbot alias certbot="certbot --config-dir ~/.certbot/ --work-dir ~/.certbot/ --logs-dir ~/.certbot"
Generate a new cert
Here’s an example to use certbot’s plugin to create certificate for domains hosted at CloudFlare. Here for more info on the plugin.
# install the plugin first sudo snap set certbot trust-plugin-with-root=ok sudo snap install certbot-dns-cloudflare # save a cloudflare API token echo "dns_cloudflare_api_token = xxxx" > ~/.cloudflare.ini # generate the cert # cert and key will be in ~/.certbot/live/raynix.info certbot certonly --dns-cloudflare -d raynix.info -d '*.raynix.info' --dns-cloudflare-credentials ~/.cloudflare.ini ls ~/.certbot/live/raynix.info/ -lht total 4.0K -rw-rw-r-- 1 ray ray 692 May 10 11:52 README lrwxrwxrwx 1 ray ray 35 May 10 11:52 cert.pem -> ../../archive/raynix.info/cert1.pem lrwxrwxrwx 1 ray ray 36 May 10 11:52 chain.pem -> ../../archive/raynix.info/chain1.pem lrwxrwxrwx 1 ray ray 40 May 10 11:52 fullchain.pem -> ../../archive/raynix.info/fullchain1.pem lrwxrwxrwx 1 ray ray 38 May 10 11:52 privkey.pem -> ../../archive/raynix.info/privkey1.pem
Install the cert to an Istio gateway
The cert and the key will be put into a Kubernetes secret in istio-system namespace
# assuming kubectl is installed and configured kubectl create secret -n istio-system tls wild-cert --key ~/.certbot/live/raynix.info/privkey.pem --cert ~/.certbot/live/raynix.info/fullchain.pem
Now the Istio gateway object needs to use this secret as TLS credential
cat <<EOF >gw.yaml apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: wordpress-gateway namespace: wordpress spec: selector: # default istio ingress gateway istio: ingressgateway servers: - hosts: - raynix.info port: name: https number: 443 protocol: HTTPS tls: credentialName: wild-cert mode: SIMPLE - hosts: - raynix.info port: name: http number: 80 protocol: HTTP tls: httpsRedirect: true
Then this can be locally tested with curl
curl -v -HHost:raynix.info --resolve "raynix.info:<TLS node port>:<node IP>" "https://raynix.info:<TLS node port>"
🙂
One response to “TLS Full Site Encryption with Istio and Let’s Encrypt”
[…] encryption with an ACME issuer such as the popular non-profit Let’s Encrypt which I’ve started using it a few months […]