OpenSSL en de certificate chain
Een SSL certificaat (het slotje in de browser) bestaat eigenlijk uit een hele reeks certificaten die aan elkaar gerelateerd zijn. Er is het certificaat voor de site, dan 1 of meer intermediate certificaten en uiteindelijk aan het einde van de keten het Trusted Root of certificate authority certificaat. Deze laatste staan ook vaak al standaard geinstalleerd in besturingssystemen om certificaten te kunnen valideren.
Verificatie van de keten
In een van de projecten hadden we de sites en api's die we via Kubernetes hosten voorzien van een SSL certificaat welke binnen een NGinx instantie werd gebruikt om Transport Level Security (TLS) toe te voegen aan de sites en api's.
SSL zonder intermediate certificaat
De NGinx installatie was alleen voorzien van het laatste certificaat in de keten. Dit was voor de meeste browsers geen probleem en was de verbinding voldoende beveiligd voor een (groen) slotje. Sommige afnemers en ook openSSL vertrouwden het certificaat echter niet en gaven een foutmelding bij het controleren. De controle via openSSL is als volgt:
openssl s_client -connect www.sitetocheck.com:443
Dit leide tot een error 21 unable to trust the first certificate dat een van de certificaten niet werd vertrouwd.
installeren van de volledige chain
In eerste instantie was de volledige chain niet in de juiste vorm beschikbaar. Verschillende pakketten gaan op verschillende manieren met de certificaten om. Er zijn applicaties die het laatste certificaat en de chain los zien van elkaar, maar NGinx wil de chain aan certificaten gecombineerd hebben tot 1 bestand waarbij het eind certificaat als eerste in de keten moet staan. Deze certificaten zijn gemakkelijk in 1 bestand te zetten middels cat eindcertificaat.crt chaincertificaat.crt > compleet.crt
Voor het aanmaken van de certificaten zijn ook export opties beschikbaar die in 1 keer de juiste gegevens opleveren.
controleren of de set bij elkaar hoort.
Om te controleren of een certificaat, private key en certificate request bij elkaar horen kan ook openssl gebruikt worden om te controleren of alle bestanden dezelde hash hebben. Dit kan middels de commando's:
For your SSL certificate: openssl x509 -noout -modulus -in <file>.crt | openssl md5
For your RSA private key: openssl rsa -noout -modulus -in <file>.key | openssl md5
For your CSR: openssl req -noout -modulus -in <file>.csr | openssl md5
Gevonden op: www.SSL247.com
certificaten toevoegen aan Kubernetes
Om een certificaat in Kubernetes beschikbaar te maken kan hij als secret toegevoegd worden en vervolgens gebruikt worden in de deployment en ingress van applicaties. Het toevoegen van een certificaat als secret gaat als volgt:
kubectl create secret tls geheimnaam \
--cert=path/to/cert/file \
--key=path/to/key/file \
-n namespace