SSL certificaten op CentOS

Op productie-servers of long-term deployment servers met privacy gevoelige data, dient de uitwisseling van data op een veilige manier te gebeuren. Voor webservers is dat HTTPS en daarvoor dient er een certificaat ingericht te worden. In dit artikel laat ik zien hoe je SSL Certificaten configureert op een Linux (CentOS) omgeving doet via de command prompt.

Een ‘self-signed’ certificate aanmaken

Een self-signed certificate kan gebruikt worden om je lokale servers te testen met een SSL-certificaat. Standaard zullen de meeste browsers deze self-signed certificaten niet herkennen als komend van een ge-authoriseerde instantie maar voor test-doeleinden kan het gebruikt worden. Het type certificaat, de common-name en de geldigheid geven we mee, het commando is dan:

openssl req -subj '/CN=*.digitalinfo.local/' -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/myserver.key -out certs/myserver.crt

De .key vind je in de directory private en het certificaat in certs.

Een ‘certificate signing request’ aanmaken

Een ‘certificate signing request‘ (CSR) is een bestand dat gebruikt wordt om een certificaat aan te vragen bij een Certified Authority. Samen met een .key-bestand kan hiermee later het certificaat geïnstalleerd worden. We gebruiken hiervoor het openssl commando en aanbevolen is om de server-naam als bestandsnaam te gebruiken:

openssl req -nodes -newkey rsa:2048 -keyout private/myserver.key -out myserver.csr

Vul de gevraagde gegevens in en het belangrijkst hierbij is de ‘common name‘. Deze dient de servernaam + domeinnaam te zijn, of een zogenaamd wildcard-domain in de vorm ‘*.domeinnaam‘, bijvoorbeeld ‘*.digitalinfo.nl

Generating a 2048 bit RSA private key
.....................................................................................+++
..................+++
writing new private key to 'myserver.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:NL
State or Province Name (full name) []:Utrecht
Locality Name (eg, city) [Default City]:Maarssen
Organization Name (eg, company) [Default Company Ltd]:Digital Info
Organizational Unit Name (eg, section) []:IT
Common Name (eg, your name or your server's hostname) []:*.digitalinfo.nl
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Bekijk de inhoud van het csr-bestand:

-----BEGIN CERTIFICATE REQUEST-----
MIICtjCCAZ4CAQAwcTELMAkGA1UEBhMCTkwxEDAOBgNVBAgMB1V0cmVjaHQxETAP
BgNVBAcMCE1hYXJzc2VuMRUwEwYDVQQKDAxEaWdpdGFsIEluZm8xCzAJBgNVBAsM
.
.
.
wJnA/NQKue9AYjdIRSRDlf4LIttLX6LCDj1MuSVUm9fUDN7e1amHr63ztFo1eBUQ
8LAnnDGqdY5qHCscaNWAnqQX3SxEMD1qrV0=
-----END CERTIFICATE REQUEST-----

Gebruik nu dit bestand om bij een vertrouwde CA een certificaat aan te vragen, bijvoorbeeld bij Comodo of bij Let’s Encrypt.  Volg de instructies op de website van de CA. Het certificaat kun je vervolgens kopieren of je krijgt het per e-mail toegestuurd. Noem dit bestand dan bv. myserver.crt (in de certs directory) Zorg er tevens voor dat je van jouw CA ook het root-certificaat en het intermediate certificaat hebt (in PEM-formaat). Sla deze ook op, bijvoorbeeld:

  • root -> certprovider.ca.pem
  • intermediate -> certprovider.sub.class1.server.ca.pem

Maak een chain-file aan

Vaak is het noodzakelijk om een chain-file aan te maken. Met een chain-file kan een SSL client het pad volgen om de CA  Dit is een tekstbestand met hierin

  • CA root certificaat
  • CA intermediate certificaat

Noem het bestand myserver.chain en zorg ervoor dat alle regels, inclusief de BEGIN en END regels, in dit bestand staan. Bijvoorbeeld:

-----BEGIN CERTIFICATE-----
MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290
IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB
IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA
.
.
.
GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk
zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW
omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIHWTCCBUGgAwIBAgIDCkGKMA0GCSqGSIb3DQEBCwUAMHkxEDAOBgNVBAoTB1Jv
b3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEiMCAGA1UEAxMZ
Q0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYSc3VwcG9y
.
.
.
ebJSoMbxhbQljPI/lrMQ2Y1sVzufb4Y6GIIiNsiwkTjbKqGTqoQ/9SdlrnPVyNXT
d+pLncdBu8fA46A/5H2kjXPmEkvfoXNzczqA6NXLji/L6hOn1kGLrPo8idck9U60
4GGSt/M3mMS+lqO3ig==
-----END CERTIFICATE-----

Tot zover heb je de volgende bestanden:

  • certprovider.ca.pem
  • certprovider.sub.class1.server.ca.pem
  • myserver.chain
  • certs/myserver.crt
  • myserver.csr
  • private/myserver.key

Deze bestanden heb je nodig voor de SSL-configuratie van je webserver. Afhankelijk welke je gebruikt, Apache, NGINX, etc… kopieer je deze in de juiste directory en maak je de verwijzingen in de configuratie-file van je webserver, bijvoorbeeld ssl.conf.

Aanmaken keystore

Mocht je een java-server gebruiken en daarvoor een keystore-bestand nodig hebben, gebruik dan het volgende commando om een .PKCS12 bestand aan te maken:

openssl pkcs12 -export -out myserver.p12 -inkey private/myserver.key -in certs/myserver.crt -certfile certprovider.ca.pem -certfile myserver.chain

Type een wachtwoord in als dat gevraagd wordt. Hierna gaan we het .p12 bestand omzetten naar een keystore bestand met:

/usr/bin/keytool -importkeystore -v -srckeystore myserver.p12 -srcstoretype PKCS12 -destkeystore myserver.jks

Gebruik hiervoor het wachtwoord dat in de vorige stap gebruikt is voor het ‘source keystore’ wachtwoord.

Ook nu weer geldt dat dit bestand naar de juiste directory gekopieerd moet worden, afhankelijk van de gebruikte java-server (Tomcat, Payara, etc…)

Tenslotte de aanbeveling om de beide .key en .csr bestanden van de server te verwijderen en op een veilige plaats op te slaan. En wellicht is het verstandig om je wachtwoord voor de .key en de keystore in je wachtwoord-management-systeem op te slaan.