Dieser Artikel behandelt die Erstellung von sauberen SSL-Zertifikaten mittels OpenSSL. Hierbei wird auf folgende Schritte eingegangen:

  1. Erstellung eines privaten Schlüssels (Key)
  2. Erstellung einer Zertifikatssignierungsanfrage (CSR)
  3. Erstellung eines selbssignierten Zertifikatssignierungsanfrage
  4. Umwandlungen ins PKCS#12 Format
  5. Alternative in der Windows CMD

Die Schritte werden extra einzeln behandelt, da so das CSR mit einer echten CA genutzt werden kann. Dies ermöglicht es ein Zertifikat zu bekommen welches durch die eigene Unternehmens PKI oder eine externe CA ausgestellt wird.

Voraussetzungen

Auf die Installation von OpenSSL wird hier nicht eingegangen. Diese Anleitung setzt aber Version 1.1 voraus, da erst ab dieser Version der Parameter -addext funktioniert. Dieser wird genutzt um über die Commandline alternative Namen zu vergeben.

Erstellung des privaten Schlüssels (KEY)

Zuerst wird ein privater Schlüssel benötigt. Es muss nicht zwangsläufig ein neuer Schlüssel generiert werden. Aber in vielen Fällen ist dies sinnvoll. Folgend wird ein 2048 Bit starker RSA Schlüssel erstellt.

openssl genrsa -out key.pem 2048

Erstellung einer Zertifikatssignierungsanfrage (CSR)

Die Zertifikatsanfrage (CSR) wird wie folgt erstellt. Weitere DNS Einträge können ergänzt werden, indem die Zahl hinter DNS. erhöht wird. Hier sind es nur zwei, nämlich einmal der Hostname und der vollqualifizierte Name. Auch wenn der Name schon im Subject auftaucht, sollte der als subjectAltName = DNS ... angegeben werden.

Achtung: Der folgende Block ist eigentlich ein Einzeiler. Das Beispiel funktiniert per Copy-und-Paste so nur unter Linux, da hier der Backslash den Zeilenumbruch "entfernt".

openssl req -new -subj "/C=DE/ST=NRW/L=MeineStadt/O=MeineFirma/OU=MeineAbteilung/CN=HostName" \
                 -addext "subjectAltName = DNS.1:HostName" \
                 -addext "subjectAltName = DNS.2:HostName.domain.int" \
                 -addext "certificatePolicies = 1.2.3.4" \
                 -newkey rsa:2048 -keyout key.pem -out csr.csr

Die so entstandene Datei csr.csr kann nun bei jeder Zertifizierungsstelle (auch der Unternehmens-CA) genutzt werden um ein Zertifikat zu beantragen bzw. ausstellen zu lassen.

Erstellung eines selbssignierten Zertifikats

Soll aus dem Ganzen aber nun doch ein selbstsigniertes Zertifikat erstellt werden, so erledigt dies folgender Befehl. Als Gültigkeitsdauer wurden hier 3 Jahre (1095 Tage) genommen.

openssl req -x509 -sha256 -days 1095 -key key.pem -in csr.csr -out cert.pem

Umwandlungen ins PKCS#12 Format

Zum Import in Windows (z.B. für die Nutzung im IIS) wird das Zertifikat oft in dem Format PKCS#12 benötigt. Dies ist sozusagen ein Archiv aus Key, Zertifikat und ggfs. noch Intermediate Zertifikat(en) der ausstellenden CA.

Bei der Umwandlung kann auch ein Kennwort zum Schutz vor unberechtigten Import vergeben werden. Die Umwandlung erfolgt wie in der ersten Zeile zu sehen. Mit Intermediate Zertifikate wie in der letzten Zeile.

openssl pkcs12 -inkey key.pem -in cert.pem -export -out cert_with_key.pfx
OR
openssl pkcs12 -inkey key.pem -in cert.pem -export -out cert_with_key.pfx -certfile IntermediateCA.crt

Alternative in der Windows CMD

Folgender Block ist der Inhalt einer CMD Datei unter Windows. Hiermit kann auch mit einer Version kleiner als 1.1 ein Zertifikat mit alternativen Namen erstellt werden. Das Beispiel kann selbstverständlich so abgewandelt werden, dass es auch unter Linux läuft.

Achtung folgendes ist nur ein Beispiel für ein selbstsigniertes Zertifikat.

@echo off

REM IN YOUR SSL FOLDER, SAVE THIS FILE AS: makeCERT.bat
REM AT COMMAND LINE IN YOUR SSL FOLDER, RUN: makecert
REM IT WILL CREATE THESE FILES: example.cnf, example.crt, example.key
REM IMPORT THE .crt FILE INTO CHROME Trusted Root Certification Authorities
REM REMEMBER TO RESTART APACHE OR NGINX AFTER YOU CONFIGURE FOR THESE FILES

REM PLEASE UPDATE THE FOLLOWING VARIABLES FOR YOUR NEEDS.
SET HOSTNAME=HostName
SET DOT=domain.int
SET COUNTRY=DE
SET STATE=NRW
SET CITY=MeineStadt
SET ORGANIZATION=MeineFirma
SET ORGANIZATION_UNIT=MeineAbteilung
SET EMAIL=webmaster@%HOSTNAME%.%DOT%

(
echo [req]
echo default_bits = 4096
echo prompt = no
echo default_md = sha256
echo x509_extensions = v3_req
echo distinguished_name = dn
echo:
echo [dn]
echo C = %COUNTRY%
echo ST = %STATE%
echo L = %CITY%
echo O = %ORGANIZATION%
echo OU = %ORGANIZATION_UNIT%
echo emailAddress = %EMAIL%
echo CN = %HOSTNAME%.%DOT%
echo:
echo [v3_req]
echo subjectAltName = @alt_names
echo:
echo [alt_names]
echo DNS.1 = %HOSTNAME%
echo DNS.2 = %HOSTNAME%.%DOT%
REM echo DNS.3 = *.%HOSTNAME%.%DOT%
)>%HOSTNAME%.cnf

openssl req -new -x509 -newkey rsa:4096 -sha256 -nodes -keyout %HOSTNAME%.key -days 3560 -out %HOSTNAME%.crt -config %HOSTNAME%.cnf