Einfache PKI selber bauen

Submitted by admin on So, 11.12.2016 - 11:25

Eine Anleitung zum Aufbau einer sehr einfachen CA Infrastruktur. Damit haben Sie das nötige Handwerkszeug, um z.B. eine einfache PKI aufzubauen. Sie hat jedoch zahlreiche Einschränkungen, so werden CSR nicht automatisiert erstellt (kann man aber mit einem Skript machen) und es gibt keinen OCSP Server. In vielen Fällen reicht jedoch so eine einfache Lösung.

X.509 Zertifikate

X.509 Zertifikate eigenen sich sehr gut für alle Arten der Authentifizierung. Der große Vorteil liegt darin, dass man keine Passwörter mehr durch die Weltgeschichte schicken muss, sondern dass grundsätzlich ein private/public Verfahren zur Anwendung kommt. Weiterhin können X.509 Zertifikate auf Smartcards gespeichert werden, so das mit einfachen Mitteln eine 2Faktoren Authentifizierung implementiert werden kann. Es spielt dabei keine Rolle, ob kontaktbehaftete oder RFID Smartcards verwendet werden. In diesem Kochbuch wird nur mit normalen Files gearbeitet, damit man auch ohne Smartcards testen kann.

Benötigte Software

OpenSSL ( http://www.openssl.org )

Zertifikatskette erstellen

Zunächst brauchen wir für unsere CA einen Key, der mit einer Passphrase verschlüsselt wird. Dieser Key wird immer gebraucht, wenn ein neues Zertifikat zu signieren ist, oder ein Zertifikat widerrufen wird.

openssl genrsa -aes256 -out ca.key 4096
# oder alternativ mit elliptischen Kurven
# openssl ecparam -out "ca.key" -name secp521r1 -genkey

Generating RSA private key, 4096 bit long modulus ...............++ ................................................++ e is 65537 (0x10001)
Enter pass phrase for ca.key: Verifying - Enter pass phrase for ca.key:

Nun wird das CA Zertifikat generiert:

openssl req -new -x509 -days 999999 -sha256 -key ca.key -out ca.crt -subj '/CN=My Cool CA/O=Honest Achmed/OU=Used Cars/C=EU'

Die CA soll längerfristig verwendet werden, daher die Gültigkeit von ca. 2700 Jahren - unser Gebrauchtwagenhändler denkt halt langfristig… In produktiven Umgebungen im Internet sollte man das nicht machen, da sollte die Lebensdauer der CA ca. 30Jahre betragen und die ausgestellten Zertifikate sollten 2-3 Jahre gültig sein. Ist das CA Zertifikat verfallen, dann werden alle damit signierten Zertifikate ungültig.

Mit

openssl x509 -in ca.crt -noout -subject

es erscheint

subject= /CN=My Cool CA/O=Honest Achmed/OU=Used Cars/C=EU

und wir können uns ansehen, um was es bei dem CA Zertifikat geht. Statt -subject kann man auch -text angeben, dann werden noch weitere Daten angezeigt:

openssl x509 -in ca.crt -noout -text

Certificate:
Data:
    Version: 3 (0x2)
    Serial Number: 15657512078632235118 (0xd94aa8474943306e)
Signature Algorithm: sha256WithRSAEncryption
    Issuer: CN=My Cool CA, O=Honest Achmed, OU=Used Cars, C=EU
    Validity
        Not Before: Dec  3 18:36:32 2015 GMT
        Not After : Oct 29 18:36:32 4753 GMT
    Subject: CN=My Cool CA, O=Honest Achmed, OU=Used Cars, C=EU
    Subject Public Key Info:
        Public Key Algorithm: rsaEncryption
            Public-Key: (4096 bit)

… (noch sehr viel Text)

Konfiguration

Bevor wir die PKI benutzen können, muss ein passendes Config File angelegt werden. Es werden im folgenden Ausschnitt nur die Diffs zu dem Beispiel Config File aus Fedora Linux 22 gezeigt:

--- /etc/pki/tls/openssl.cnf	2015-08-13 14:13:05.000000000 +0200
+++ openssl.cnf	2015-12-03 19:49:46.336743255 +0100
@@ -39,7 +39,7 @@
 ####################################################################
 [ CA_default ]
 
-dir		= /etc/pki/CA		# Where everything is kept
+dir		= ./demoCA			# Where everything is kept
 certs		= $dir/certs		# Where the issued certs are kept
 crl_dir		= $dir/crl		# Where the issued crl are kept
 database	= $dir/index.txt	# database index file.
@@ -83,7 +83,7 @@
 # For the CA policy
 [ policy_match ]
 countryName		= match
-stateOrProvinceName	= match
+stateOrProvinceName	= optional
 organizationName	= match
 organizationalUnitName	= optional
 commonName		= supplied

Jetzt brauchen wir noch ein paar initiale Files und Verzeichnisse:

mkdir demoCA
mkdir ./demoCA/newcerts
touch ./demoCA/index.txt
echo '00000000' > ./demoCA/serial

Jetzt können wir weitermachen.

Server Zertifikat erstellen und signieren

Nun generieren wir für einen Server einen Key und einen “Certificate Signing Request”:

openssl req -subj "/CN=www.example.com/O=Honest Achmed/OU=Used Cars/C=EU" -newkey rsa:4096 -keyout server.key.pem -out server.csr.pem -passin pass:geheim -passout pass:geheim
# oder alternativ mit elliptischen Kurven
# openssl ecparam -out server.key.pem -name secp521r1 -genkey
# openssl req -new -key server.key.pem -sha256 -subj "/CN=www.example.com/O=Honest Achmed/OU=Used Cars/C=EU" -out server.csr.pem

Mit dem Kommando wird auch das Passwort für den privaten Schlüssel übergeben (nur bei RSA). In der Praxis sollte man das bleiben lassen, es sei denn man verwendet einen PC ohne Netzwerkanbindung. Im Falle der EC Variante wird kein Passwort gesetzt.

Jetzt kann das Zertifikat mit unserer neuen CA signiert werden:

openssl ca -config ./openssl.cnf -batch -keyfile ca.key -cert ca.crt -in server.csr.pem -days 735 -out server.crt.pem -notext


Using configuration from ./openssl.cnf
Enter pass phrase for ca.key:
Check that the request matches the signature
Signature ok
Certificate Details:
    Serial Number: 0 (0x0)
    Validity
        Not Before: Dec  3 18:49:49 2015 GMT
        Not After : Dec  7 18:49:49 2017 GMT
    Subject:
        countryName               = EU
        organizationName          = Honest Achmed
        organizationalUnitName    = Used Cars
        commonName                = www.example.com
    X509v3 extensions:
        X509v3 Basic Constraints: 
            CA:FALSE
        Netscape Comment: 
            OpenSSL Generated Certificate
        X509v3 Subject Key Identifier: 
            BB:39:CC:70:B1:64:C3:65:3E:0A:63:96:EB:3E:08:EA:71:BF:D6:97
        X509v3 Authority Key Identifier: 
            keyid:73:7B:63:F0:B3:74:5E:DB:DF:92:E5:28:C5:17:26:1B:8F:F0:7B:22

Certificate is to be certified until Dec  7 18:49:49 2017 GMT (735 days)

Write out database with 1 new entries
Data Base Updated

Mit

openssl x509 -noout -text -in server.crt.pem

können wir unser erstes, mit unserer neuen CA signiertes Zertifikat ansehen:

Certificate:
Data:
    Version: 3 (0x2)
    Serial Number: 0 (0x0)
Signature Algorithm: sha256WithRSAEncryption
    Issuer: CN=My Cool CA, O=Honest Achmed, OU=Used Cars, C=EU
    Validity
        Not Before: Dec  3 18:49:49 2015 GMT
        Not After : Dec  7 18:49:49 2017 GMT
    Subject: C=EU, O=Honest Achmed, OU=Used Cars, CN=www.example.com
    Subject Public Key Info:
        Public Key Algorithm: rsaEncryption
            Public-Key: (4096 bit)
            Modulus:
                00:d3:78:a5:43:4e:5c:57:4a:2d:1b:61:a7:9a:07:
                ...
                da:1e:83
            Exponent: 65537 (0x10001)
    X509v3 extensions:
        X509v3 Basic Constraints: 
            CA:FALSE
        Netscape Comment: 
            OpenSSL Generated Certificate
        X509v3 Subject Key Identifier: 
            BB:39:CC:70:B1:64:C3:65:3E:0A:63:96:EB:3E:08:EA:71:BF:D6:97
        X509v3 Authority Key Identifier: 
            keyid:73:7B:63:F0:B3:74:5E:DB:DF:92:E5:28:C5:17:26:1B:8F:F0:7B:22

Signature Algorithm: sha256WithRSAEncryption
     97:69:50:14:22:89:a5:ad:df:86:94:d3:94:03:6b:30:5f:6a:
     ...
     62:05:37:d7:76:d1:ea:5f

PKCS#12 File erstellen

Für die weitere Verwendung, z.B. als Clientzertifikat brauchen wir die Komponenten

  • private Key
  • Zertifikat
  • CA Zertifikat
    in Form einer PKCS#12 Datei. Auch das kann mit OpenSSL erledigt werden:
openssl pkcs12 -export -name "My Cool Certificate" -caname "Honest Achmed" -inkey server.key.pem -in server.crt.pem -CAfile ca.crt  -out server.p12

Das .p12 kann man problemlos in Firefox, Thunderbird oder Windows importieren. Dem Microsoft IIS kann man damit ebenfalls ein Zertifikat verpassen