In unserem Podcast diskutiert Thomas Bahn über Nutzen, Anwendungen und Erfahrungen aus den Bereichen Chatbots und Künstliche Intelligenz. Mehr erfahren

Zweistufige CA-Infrastruktur: eine Intermediate-CA erstellen

von Thomas,
assono GmbH, Standort Kiel,

Die Root-CA liegt bereit, heute steigen wir eine Stufe hinab auf die mittlere Ebene unserer CA-Infrastruktur und erstellen eine Intermediate-CA.

Es gibt verschiedene fachliche, technische Bereiche oder Unterteilung eines Unternehmens in Standorte, Bereiche, Abteilungen usw., die den Einsatz von Intermediate-CAs sinnvoll machen. Man kann diese dem jeweiligen Team oder Verantwortlichen geben, damit diese neue Zertifikate nur für ihren Bereich erstellen können.

Wir erstellen hier als Beispiel eine Intermediate-CA, mit der wir später Server-Zertifikate signieren werden.

Verzeichnisse und Dateien vorbereiten

Um die langfristige Verwaltung zu vereinfachen, erstellen wir für dieses CA, wie später auch für andere CAs und Server, eigene Unterverzeichnisse.

Verzeichnis und Dateien vorbereiten:

mkdir /local/assono-ca/servers
cd /local/assono-ca/servers
touch index.txt
echo 01 > serial
echo 01 > crlnumber

Danach sollte das neue Verzeichnis ungefähr so aussehen:

ls -l
insgesamt 8
-rw-r--r-- 1 root root 3	7. Jul 11:37 crlnumber
-rw-r--r-- 1 root root 0	7. Jul 11:37 index.txt
-rw-r--r-- 1 root root 3	7. Jul 11:37 serial

Konfigurationsdatei erstellen

Die folgende Konfigurationsdatei erstellen wir schon einmal, auch wenn wir sie erst später, beim Unterzeichnen der Server-Zertifikate brauchen werden.

Die openssl.cnf vom letzten Mal wieder als Basis kopieren und danach anpassen:

cp ../root/openssl.cnf ./openssl.cnf
nano openssl.cnf

Die folgenden Einstellungen so ändern:

dir				 = /local/assono-ca/servers	 # Where everything is kept
certificate		 = $dir/servers-cert.pem	 # The CA certificate
private_key		 = $dir/servers-key.pem		 # The private key
policy			 = anything

Privaten Schlüssel der Intermediate-CA erstellen

Eine 4096 Bit langen und mit 3DES verschlüsselten privaten Schlüssel für die Intermediate-CA erstellen, der später für das elektronische Signieren der ausgestellten Zertifikate benutzt wird:

openssl genrsa -des3 -passout file:../passwort.enc -out servers-key.pem 4096
Generating RSA private key, 4096 bit long modulus (2 primes)
........................................................................................................................................++++
............................++++
e is 65537 (0x010001)

CSR für Intermediate-CA-Zertifikat erstellen

Die Root-CA war einfach mit sich selbst signiert und sie lässt sich dadurch auch nicht überprüfen - man muss ihr einfach glauben. Deshalb übermittelt man zusätzlich zu ihrem Zertifikat zumindest einen elektronischen Fingerabdruck, den "Fingerprint", möglichst auf einem zweiten, vertrauenswürdigen Kanal. Das ist so etwas wie eine kryptografisch gesicherte, kompliziert berechnete Quersumme. Sie soll es schwer bis unmöglich machen, das Zertifikat nachzumachen. Man kann zwar die Inhalte nachstellen, aber man kommt nur ganz, ganz, ganz schwer wieder zum gleichen Fingerprint.

Alle weiteren Zertifikate aber kann man dann mit der Root-CA validieren. Dazu müssen sie von der Root-CA zertifiziert werden - direkt oder indirekt über eine Intermediate-CA.

Die Intermediate-CA, die wir jetzt gerade erstellen, soll deshalb eine solche Signatur bekommen. Dafür erstellen wir jetzt einen Certificate Signing Request oder kurz: CSR.

openssl req -new -sha256 -config ../root/openssl.cnf -passin file:../passwort.enc	-key servers-key.pem -out servers-csr.pem
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) [DE]:
State or Province Name (full name) [Schleswig-Holstein]:
Locality Name (eg, city) [Schwentinental]:
Organization Name (eg, company) [assono GmbH]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:servers.assono
Email Address []:tbahn@assono.de
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

CSR für Intermediate-CA-Zertifikat mit Root-CA signieren

Würde man jetzt eine offizielle Zertifizierungsstelle nutzen, würde man den erzeugten CSR dorthin übermitteln, also typischerweise hochladen. Den nächsten Schritt würde dann von dieser Stelle gemacht werden.

Wir machen es aber jetzt selbst und unterzeichnen mit unserer eigenen Root-CA den CSR von eben. Das Zertifikat soll eine Gültigkeit von 3650 Tagen, also rund 10 Jahren haben.

Beachte, dass wir die Konfigurationsdatei aus dem Root-CA-Verzeichnis mit der v3_intermediate_ca-Extension verwenden.

openssl ca -config ../root/openssl.cnf -extensions v3_intermediate_ca -days 3650 -notext -batch -passin file:../passwort.enc -in servers-csr.pem -out servers-cert.pem
Using configuration from ../root/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
				Serial Number: 1 (0x1)
				Validity
						Not Before: Jul	7 09:40:26 2020 GMT
						Not After : Jul	5 09:40:26 2030 GMT
				Subject:
						countryName							 = DE
						stateOrProvinceName			 = Schleswig-Holstein
						organizationName					= assono GmbH
						commonName								= servers.assono
						emailAddress							= tbahn@assono.de
				X509v3 extensions:
						X509v3 Subject Key Identifier:
								79:0F:58:24:00:6D:73:BF:7F:5A:5F:CF:E0:A9:C3:05:7E:24:76:8C
						X509v3 Authority Key Identifier:
								keyid:41:AA:79:F1:2E:AF:42:10:11:BB:33:8B:32:DA:A8:B5:49:64:F6:43

						X509v3 Basic Constraints: critical
								CA:TRUE, pathlen:0
						X509v3 Key Usage: critical
								Digital Signature, Certificate Sign, CRL Sign
Certificate is to be certified until Jul	5 09:40:26 2030 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated

Wer neugierig ist, kann jetzt in der index.txt im Root-CA-Verzeichnis nachschauen:

cat ../root/index.txt
V			 300705094026Z					 01			unknown /C=DE/ST=Schleswig-Holstein/O=assono GmbH/CN=servers.assono/emailAddress=tbahn@assono.de

Zusätzlich kann man sich noch einmal das ausgestellte Zertifikat ansehen:

openssl x509 -noout -text -in servers-cert.pem
Certificate:
		Data:
				Version: 3 (0x2)
				Serial Number: 1 (0x1)
				Signature Algorithm: sha256WithRSAEncryption
				Issuer: C = DE, ST = Schleswig-Holstein, L = Schnwentinental, O = assono GmbH, CN = assono, emailAddress = tbahn@assono.de
				Validity
						Not Before: Jul	7 09:40:26 2020 GMT
						Not After : Jul	5 09:40:26 2030 GMT
				Subject: C = DE, ST = Schleswig-Holstein, O = assono GmbH, CN = servers.assono, emailAddress = tbahn@assono.de
				Subject Public Key Info:
						Public Key Algorithm: rsaEncryption
								RSA Public-Key: (4096 bit)
								Modulus:
[…]
								Exponent: 65537 (0x10001)
				X509v3 extensions:
						X509v3 Subject Key Identifier:
								79:0F:58:24:00:6D:73:BF:7F:5A:5F:CF:E0:A9:C3:05:7E:24:76:8C
						X509v3 Authority Key Identifier:
								keyid:41:AA:79:F1:2E:AF:42:10:11:BB:33:8B:32:DA:A8:B5:49:64:F6:43
						X509v3 Basic Constraints: critical
								CA:TRUE, pathlen:0
						X509v3 Key Usage: critical
								Digital Signature, Certificate Sign, CRL Sign
		Signature Algorithm: sha256WithRSAEncryption
[…]

Schließlich verifizieren wir das Zertifikat auch noch mit der Root-CA:

openssl verify -CAfile ../root/assono-cert.pem servers-cert.pem
servers-cert.pem: OK

Zertifikatskette erstellen und verifizieren

An manchen Stellen benötigt man nicht nur das einzelne Zertifikat, sondern auch alle Zertifikate "die Kette hoch". Die Zertifikatskette bzw. Certificate Chain besteht dann einfach nur aus den aneinander gehängten einzelnen Zertifikaten, wo bei das "unterste" zuerst in der Datei stehen muss und das "oberste", also die Root-CA als letztes kommen soll.

Wir erstellen die Zertifikatskette und verifizieren sie gleich mit der Root-CA:

cat servers-cert.pem ../root/assono-cert.pem > servers-cert-chain-bundle.pem
openssl verify -CAfile ../root/assono-cert.pem servers-cert-chain-bundle.pem
servers-cert-chain-bundle.pem: OK

Bis jetzt haben wir nur die CA-Infrastruktur aufgebaut, aber beim nächsten Mal kommen wir dort hin, wofür wir das alles machen: Wir erstellen ein Server-Zertifikat.

Nächste Artikel in dieser Reihe:

Quellen:

Fachbeitrag Sicherheit Administration Für Entwickler

Sie haben Fragen zu diesem Artikel? Kontaktieren Sie uns gerne: blog@assono.de

Sie haben Interesse an diesem Thema?

Gerne bieten wir Ihnen eine individuelle Beratung oder einen Workshop an.

Kontaktieren Sie uns

Weitere interessante Artikel

Sie haben Fragen?

Wenn Sie mehr über unsere Angebote erfahren möchten, können Sie uns jederzeit kontaktieren. Gerne erstellen wir eine individuelle Demo für Sie.

assono GmbH

Standort Kiel (Zentrale)
assono GmbH
Lise-Meitner-Straße 1–7
24223 Schwentinental

Standort Hamburg
assono GmbH
Bornkampsweg 58
22761 Hamburg

Telefonnummern:
Zentrale: +49 4307 900 416
Vertrieb: +49 4307 900 402

E-Mail-Adressen:
kontakt@assono.de
bewerbung@assono.de