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

Zweistufige CA-Infrastruktur: ein Server-Zertifikat erstellen

von Thomas,
assono GmbH, Standort Kiel,

Die Root-CA und eine Intermediate-CA sind fertig, jetzt erstellen wir endlich ein Zertifikat für einen Server.

Verzeichnis und privaten Schlüssel für den Server erstellen

Wie schon bei den bisherigen Schritten erstellen wir ein Unterverzeichnis und dann den privaten Schlüssel für diesen Server, diesmal aber unverschlüsselt, damit der Server ihn direkt nutzen können wird.

mkdir /local/assono-ca/domino-006
cd /local/assono-ca/domino-006
openssl genrsa -out domino-006-key.pem 4096
Generating RSA private key, 4096 bit long modulus (2 primes)
..........................................++++
................................++++
e is 65537 (0x010001)

CSR für Server-Zertifikat erstellen

Es folgt der "Antrag beim Passamt", also der Certificate Signing Request (CSR). An der entsprechenden Stelle sollten wir als Common Name den vollqualifizierten Namen des Servers eintragen:

openssl req -new -config ../servers/openssl.cnf -key domino-006-key.pem -out domino-006-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) [Schnwentinental]:
Organization Name (eg, company) [assono GmbH]:
Organizational Unit Name (eg, section) []: 
Common Name (eg, your name or your server's hostname) []:domino-006.assono.local
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 Server-Zertifikat mit Intermediate-CA signieren

Das Serverzertifikat muss, damit es von den Browsern akzeptiert wird, ein paar zusätzliche Informationen beinhalten. Dazu erstellen wir eine Konfigurationsdatei speziell für diesen Server:

nano server_cert_ext.cnf

Ganz unten im Abschnitt [alt_names] können numerische IP-Adressen und vollqualifizierte Namen aufgelistet werden, unter denen der Server erreichbar ist. So gilt das Zertifikat für alle angegebenen Varianten:

basicConstraints = CA:FALSE
nsCertType = server
nsComment = "OpenSSL Generated Server Certificate"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer:always
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
IP.1 = 192.168.0.48
DNS.1 = domino-006.assono.local
DNS.2 = domino-006.ki.assono.local

In letzter Zeit ist dieser Abschnitt noch wichtiger geworden, weil die Browser-Hersteller teilweise nur noch hierhin gucken und den Common Name ignorieren: "For Chrome 58 and later, only the subjectAlternativeName extension, not commonName, is used to match the domain name and site certificate. " (Error: "Subject Alternative Name Missing" or NET::ERR_CERT_COMMON_NAME_INVALID or "Your connection is not private").

Und Apple will, dass das Attribut ExtendedKeyUsage entsprechend gesetzt wird: "TLS server certificates must contain an ExtendedKeyUsage (EKU) extension containing the id-kp-serverAuth OID" (Requirements for trusted certificates in iOS 13 and macOS 10.15).

Jetzt können wir den CSR mit der Intermediate-CA unterzeichnen und erhalten das gültige Server-Zertifikat:

openssl x509 -req -in domino-006-csr.pem -passin file:../passwort.enc -CA ../servers/servers-cert.pem -CAkey ../servers/servers-key.pem -out domino-006-cert.pem -CAcreateserial -days 730 -sha256 -extfile server_cert_ext.cnf
Signature ok
subject=C = DE, ST = Schleswig-Holstein, L = Schnwentinental, O = assono GmbH, CN = domino-006.assono.local, emailAddress = tbahn@assono.de
Getting CA Private Key

Ich habe hier noch eine Gültigkeitsdauer von 730 Tagen, also rund 2 Jahren angegeben. Leider muss man das in Kürze auf maximal 398 Tage, also rund 13 Monate verkürzen, wenn man mit nach dem 1. September 2020 ausgestellten Zertifikaten noch für Apple-Geräte erreichbar sein will: "Ab dem 1. September reduziert der Hersteller offenbar die Gültigkeit neu ausgegebener TLS-Zertifikate auf maximal 398 Tage [...]" (Verkürzte Laufzeit für SSL/TLS-Zertifikate: Apple prescht offenbar vor). Und ziemlich sicher werden die anderen Browserhersteller folgen.

Zertifikat verifizieren

Sehen wir uns noch einmal an, was wir gemacht haben:

Zuerst der private Schlüssel:

openssl rsa -noout -text -in domino-006-key.pem
RSA Private-Key: (4096 bit, 2 primes)
modulus:
[…]
publicExponent: 65537 (0x10001)
privateExponent:
[…]
prime1:
[…]
prime2:
[…]
exponent1:
[…]
exponent2:
[…]
coefficient:
[…]

Der CSR:

openssl req -noout -text -in domino-006-csr.pem
Certificate Request:
		Data:
				Version: 1 (0x0)
				Subject: C = DE, ST = Schleswig-Holstein, L = Schnwentinental, O = assono GmbH, CN = domino-006.assono.local, emailAddress = tbahn@assono.de
				Subject Public Key Info:
						Public Key Algorithm: rsaEncryption
								RSA Public-Key: (4096 bit)
								Modulus: 
…]
								Exponent: 65537 (0x10001)
				Attributes:
						a0:00
		Signature Algorithm: sha256WithRSAEncryption
[…]

Und zu guter Letzt noch das Server-Zertifikat:

openssl x509 -noout -text -in domino-006-cert.pem
Certificate:
		Data:
				Version: 3 (0x2)
				Serial Number:
						40:f4:ce:78:c5:6f💿09:7b:78:f4:6b:4a:b9:73:5a:f7:3f:7d:be
				Signature Algorithm: sha256WithRSAEncryption
				Issuer: C = DE, ST = Schleswig-Holstein, O = assono GmbH, CN = servers.assono, emailAddress = tbahn@assono.de
				Validity
						Not Before: Jul	7 09:45:45 2020 GMT
						Not After : Jul	7 09:45:45 2022 GMT
				Subject: C = DE, ST = Schleswig-Holstein, L = Schnwentinental, O = assono GmbH, CN = domino-006.assono.local, emailAddress = tbahn@assono.de
				Subject Public Key Info:
						Public Key Algorithm: rsaEncryption
								RSA Public-Key: (4096 bit)
								Modulus:
[…]
								Exponent: 65537 (0x10001)
				X509v3 extensions:
						X509v3 Basic Constraints:
								CA:FALSE
						Netscape Cert Type:
								SSL Server
						Netscape Comment:
								OpenSSL Generated Server Certificate
						X509v3 Subject Key Identifier:
								62:8D:08:86:E8:6D:91:10:70:7B:01:BC:46:E2:F9:B4:5F:38:29:63
						X509v3 Authority Key Identifier:
								keyid:79:0F:58:24:00:6D:73:BF:7F:5A:5F:CF:E0:A9:C3:05:7E:24:76:8C
								DirName:/C=DE/ST=Schleswig-Holstein/L=Schnwentinental/O=assono GmbH/CN=assono/emailAddress=tbahn@assono.de
								serial:01
						X509v3 Key Usage: critical
								Digital Signature, Key Encipherment
						X509v3 Extended Key Usage:
								TLS Web Server Authentication
						X509v3 Subject Alternative Name:
								IP Address:192.168.0.48, DNS:domino-006.assono.local, DNS:domino-006.ki.assono.local
		Signature Algorithm: sha256WithRSAEncryption
[…]

Zertifikatskette erstellen und verifizieren

Wie schon bei der Intermediate-CA, erstellen wir hier auch wieder die Zertifikatskette - diesmal bestehend aus Server-, Intermediate- und Root-CA-Zertifikaten. Danach gleich wieder prüfen:

cat domino-006-cert.pem ../servers/servers-cert-chain-bundle.pem > domino-006-cert-chain-bundle.pem
openssl verify -CAfile ../servers/servers-cert-chain-bundle.pem domino-006-cert-chain-bundle.pem
domino-006-cert-chain-bundle.pem: OK

Für den Import in den Domino-Keyring ist es praktisch, wenn man neben den Zertifikaten auch den privaten Schlüssel mit drin hat, also verlängern wir die Kette: privater Schlüssel, Server-, Intermediate- und Root-CA-Zertifikat - und prüfen:

cat domino-006-key.pem domino-006-cert.pem ../servers/servers-cert-chain-bundle.pem > domino-006-key-cert-chain-bundle.pem
openssl verify -CAfile ../servers/servers-cert-chain-bundle.pem domino-006-key-cert-chain-bundle.pem
domino-006-key-cert-chain-bundle.pem: OK

Das Server-Zertifikat ist genau das, was wir brauchen, damit wir zum Beispiel den Netzwerkverkehr zu einem Web-Server absichern können.

Das wird dann auch der nächste Schritt in der nächsten Folge sein: Was muss ich tun, um das gerade erstellte Server-Zertifikat auf einen Domino-Web-Server zu bringen? Wie muss ich die Server-Konfiguration ändern, damit das Zertifikat verwendet wird?

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