rootCA unter debian

In diesem Beispiel soll mit Hilfe von openssl eine rootCA erzeugt werden, die den öffentlichen Schlüssel für eine ServerCA signiert. Diese wiederrum soll den öffentlichen Schlüssel, der beispielsweise in einem IIS-Webserver verwendet werden kann, signieren.

Unter lenny sind die Pakete openssl und sharutils installiert.

Der Ablauf ist dabei wie folgt:

     1. Verzeichnisstruktur für rootCA und serverCA erstellen
        1.1 .rand-Dateien erzeugen

     2. rootCA anlegen
        2.1 RCAkey.pem generieren
        2.2 RCAcert.pem erzeugen

     3. ServerCA anlegen
        3.1 SCAkey.pem generieren
        3.2 SCAcert.pem erzeugen

     4. Werbserver Zertifikat erzeugen
        4.1 Zertifikatsrequest im IIS erzeugen
        4.2 Zertifikatsrequest SCAkey.pem signieren

     5. PEM in cer konvertieren

     6. Zertifikatskette exportieren
1. Verzeichnisstruktur für rootCA und serverCA erstellen

Mit folgenden Befehlen wird die gewünschte Struktur inklusive der Dateien angelegt.

[bash]
mkdir /root/CA/certs /root/CA/private /root/CA/rootCA /root/CA/serverCA
cd /root/CA/rootCA
mkdir certs newcerts private crl
chmod go-rwx private
echo „01“ > serial
echo „01“ > crlnumber
touch index.txt
cd ../serverCA
mkdir certs newcerts private crl
chmod go-rwx private
echo „01“ > serial
echo „01“ > crlnumber
touch index.txt
cd ..
[/bash]

In der Datei serial wird die Seriennummer in hexadezimaler Codierung, des Zertifikats hinterlegt das als nächste von der jeweiligen CA herausgegeben wird. In der Datei index.txt sind die bereits signierten Zertifikate aufgelistet.

1.1 .rand-Dateien erzeugen

Der Verzeichnispfad /root/CA/.. muss entsprechend der CA angepasst werden.

[bash]
for i in `find /root/CA/serverCA/ -name private`
do cat /dev/urandom |
uuencode -m bla |
head -19 |
sed „s/begin.*//g“ |
tail -18 | xargs |
sed „s/ //g“ > $i/.rand
chmod 770 $i/.rand
ls -l $i/.rand
done
[/bash]

Die Verzeichnisstruktur inlusive der benötigten Dateien sieht nun wie folgt aus:

[bash]
/root/CA/
|– certs
|– openssl.cnf
|– private
`– .random
|– rootCA
| |– certs
| |– crl
| |– crlnumber
| |– index.txt
| |– newcerts
| |– private
`– .random
| |– serial
`– serverCA
|– certs
|– crl
|– crlnumber
|– index.txt
|– newcerts
|– private
`– .random
`– serial
[/bash]

2. rootCA anlegen
2.1 RCAkey.pem generieren

Mit folgendem Aufruf wird mit Hilfe einer zufallsgenerierten Zahl (.rand) eine 2048-Bit lange RSA-Schlüsseldatei (RCAkey.pem) erzeugt in der sowohl der private als auch der öffentliche Schlüssel hinterlegt sind. Die Schlüsseldatei ist durch den Parameter aes256 passwortgeschützt.

Das Passwort (Passphrase) sollte den Anforderungen für sichere Passwörtern genügen, also am Besten eine Mischung aus Zahlen, Buchstaben und Sonderzeichen und mindestens 8 Zeichen lang sein. Bei nicht-Benutzerzertifikaten sollte/muss der Parameter aes256 weggelassen werden, so ist der private Schlüssel passwortlos und ein Dienst oder ähnliches benötigt zum Starten kein Passwort. Der Zugriff auf den ohne Passwortschutz vorliegenden privaten Schlüssel muss über ACL’s im Dateisystem entsprechend geregelt werden.

[bash]
openssl genrsa -aes256 -out ./rootCA/private/RCAkey.pem -rand ./rootCA/private/.rand 2048

246 semi-random bytes loaded
Generating RSA private key, 2048 bit long modulus
……………………..+++
….+++
e is 65537 (0x10001)
Enter pass phrase for ./rootCA/private/RCAkey.pem: *****
Verifying – Enter pass phrase for ./rootCA/private/RCAkey.pem: *****
[/bash]

2.2 RCAcert.pem erzeugen

Mit der zuvor erzeugten Schlüsseldatei (RCAkey.pem) wird nun ein selbstsigniertes Zertifikat (RCAcert.pem) erzeugt, das für 50 Jahre (18530 Tage) gültig ist. Die default-Werte der Attribute des Requests sind in der Sektion req_distinguished_name in der openssl.cnf hinterlegt. Das eindeutige Merkmal des Request ist das Attribut „hostname, IP or your name“.

[bash]
openssl req -new -x509 -set_serial 0 -days 18250 -config ./openssl.cnf -key ./rootCA/private/RCAkey.pem -out ./rootCA/certs/RCAcert.pem
Enter pass phrase for ./rootCA/private/RCAkey.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.
—–
Organization Name (company) [xyz]:
Organizational Unit Name (department, division) [xyz]:
Email Address xyz@zerfallskonstante.de]:
Locality Name (city, district) [xyz]:
State or Province Name (full name) [xyz]:
Country Name (2 letter code) [DE]:
Common Name (hostname, IP, or your name) []:caroot.zerfallskonstante.de
[/bash]

Im Verzeichnis /root/CA/rootCA/private befinden sich nun die RSA-Schlüsseldatei (RCAkey.pem) und im Verzeichnis /root/CA/rootCA/certs das selbstsignierte Zertifikat (RCAcert.pem) der rootCA.

selbstsigniertes Zertifikat der rootCA veröffentlichen:

[bash]
cp /root/CA/rootCA/certs/RCAcert.pem /root/CA/rootCA/certs/00.pem
cd /root/CA/rootCA/certs
ln -s 00.pem `openssl x509 -in 00.pem -hash -noout`.0
[/bash]

Inhalt des RSA-Schlüssels anzeigen:

[bash]
openssl rsa -in /root/CA/rootCA/private/RCAkey.pem -text | less
[/bash]

Inhalt des Zertifikats anzeigen:

[bash]
openssl x509 -in /root/CA/rootCA/certs/00.pem -noout -text
openssl x509 -in /root/CA/rootCA/certs/00.pem -noout -dates
openssl x509 -in /root/CA/rootCA/certs/00.pem -noout -purpose
[/bash]

3. ServerCA anlegen

Bei der ServerCA wird ebenfalls zuerst mit Hilfe einer zufallsgenerierten Zahl (.rand) eine 2048-Bit lange RSA-Schlüsseldatei (SCAkey.pem) erzeugt. Die Schlüsseldatei ist ebenfalls durch ein Passwort geschützt.

3.1 SCAkey.pem generieren

[bash]
openssl genrsa -aes256 -out ./serverCA/private/SCAkey.pem -rand ./serverCA/private/.rand 2048
248 semi-random bytes loaded
Generating RSA private key, 2048 bit long modulus
…..+++
…+++
e is 65537 (0x10001)
Enter pass phrase for ./serverCA/private/SCAkey.pem:
Verifying – Enter pass phrase for ./serverCA/private/SCAkey.pem:
[/bash]

Nun wird ein Zertifikatsrequest (SCAreq.pem) mit der zuvor erstellten Schlüsseldatei (SCAkey.pem) erzeugt.

[bash]
openssl req -config ./openssl.cnf -new -key ./serverCA/private/SCAkey.pem -out ./serverCA/SCAreq.pem
Enter pass phrase for ./serverCA/private/SCAkey.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.
—–
Organization Name (company) [xyz]:
Organizational Unit Name (department, division) [xyz]:
Email Address xyz@zerfallskonstante.de]:
Locality Name (city, district) [xyz]:
State or Province Name (full name) [xyz]:
Country Name (2 letter code) [DE]:
Common Name (hostname, IP, or your name) []:casrv.zerfallskonstante.de

Please enter the following ‚extra‘ attributes
to be sent with your certificate request
A Challenge Password []: *****GEHEIM*****
[/bash]

3.2 SCAcert.pem erzeugen

Der Zertifikatsrequest (SCAreq.pem) wird nun mit dem RSA-Schlüssels (RCAkey.pem) der übergeordneten CA signiert. Die Schlüsseldatei der rootCA wird über die Parameter private_key in der Sektion Root_CA der openssl.cnf-Datei in den Aufruf eingebunden.

[bash]
openssl ca -config ./openssl.cnf -name Root_CA -in ./serverCA/SCAreq.pem -out ./serverCA/certs/SCAcert.pem

Using configuration from openssl.cnf
Enter pass phrase for /root/CA/rootCA/private/RCAkey.pem:
Check that the request matches the signature
Signature ok
The Subject’s Distinguished Name is as follows
organizationName :PRINTABLE:’xyz‘
organizationalUnitName:PRINTABLE:’xyz‘
emailAddress :IA5STRING:’xyz@zerfallskonstante.de‘
localityName :PRINTABLE:’xyz‘
stateOrProvinceName :PRINTABLE:’xyz‘
countryName :PRINTABLE:’DE‘
commonName :PRINTABLE:’casrv.zerfallskonstante.de‘
Certificate is to be certified until Jun 26 11:07:05 2016 GMT (1825 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
[/bash]

Das signierte Zertifikat der ServerCA (SCAcert.pem) liegt in /root/CA/serverCA/certs sowie als 01.pem in /root/CA/rootCA/newcerts (durch den Parameter new_cert_dir in der Sektion Root_CA in der openssl.cnf).

signiertes Zertifikat der ServerCA veröffentlichen:

[bash]
mv ./rootCA/newcerts/01.pem ./rootCA/certs/
cd ./rootCA/certs
ln -s 01.pem `openssl x509 -in 01.pem -hash -noout`.0
[/bash]

Das Verzeichnis /root/CA/rootCA/certs sieht nun wie folgt aus:

[bash]
drwxr-xr-x 2 root root 4096 7. Sep 10:22 .
drwxr-xr-x 5 root root 4096 7. Sep 10:11 ..
-rw-r–r– 1 root root 1533 6. Sep 13:55 00.pem
-rw-r–r– 1 root root 5108 7. Sep 10:11 01.pem
lrwxrwxrwx 1 root root 6 7. Sep 10:22 a155d062.0 -> 01.pem
lrwxrwxrwx 1 root root 6 7. Sep 10:22 d7b91c41.0 -> 00.pem
[/bash]

Die SCAcert.pem sollte nun auch in den oben genannten Kontainer in Windows importiert werden um die Gültigkeit von Zertifikaten, die von der Server_CA ausgestellt werden sicherzustellen.

4. Werbserver Zertifikat erzeugen
4.1 Zertifikatsrequest im IIS erzeugen

Über die Eigenschaften der Standardwebseite im IIS-Manager wird auf dem Karteikartenreiter Verzeichnissicherheit, Serverzertifikat ausgewählt und ggf. ein bestehendes Zertifikat entfernt und dann ein neues Zertifikat beantragt.

Der Inhalt des erzeugten CSR.txt wird über die Zwischenablage (STRG+C) in die Datei wwwreq.csr kopiert. Die letzte Zeile ist u.U. eine leer Zeile, die entfernt werden muss.

4.2 Zertifikatsrequest SCAkey.pem signieren

[bash]
openssl ca -config ../openssl.cnf -name Server_CA -policy policy_anything -in ./serverCA/wwwreq.csr -out ./serverCA/certs/wwwcert.pem
Using configuration from ../openssl.cnf
Enter pass phrase for /root/CA/serverCA/private/SCAkey.pem:
Check that the request matches the signature
Signature ok
The Subject’s Distinguished Name is as follows
Organization Name (company) [xyz]:
Organizational Unit Name (department, division) [xyz]:
Email Address [xyz@zerfallskonstante.de]:
Locality Name (city, district) [xyz]:
State or Province Name (full name) [xyz]:
Country Name (2 letter code) [DE]:
Common Name (hostname, IP, or your name) []:www.zerfallskonstante.de
Certificate is to be certified until Sep 5 09:44:15 2016 GMT (1825 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries

Data Base Updated
[/bash]

5. PEM in cer konvertieren

Das wwwcert.pem wird, damit es in den IIS importiert werden kann, DER-Kodiert.

[bash]
openssl x509 -in wwwcert.pem -inform PEM -out wwwcert.cer -outform DER
[/bash]

6. Zertifikatskette exportieren

Die Zertifikatskette ist in der wwwcert.cer NICHT enthalten. Mit folgendem Aufruf wird das Zertifikat (01.pem) der ServerCA und das der rootCA (00.pem) unter Verwendung des privaten Schlüssels (SCAkey.pem) in eine pkcs12-Codierte Datei exportiert, die auf Windows Systemen in den Container der Vertrauenswürdigen Stammzertifizierungsstellen importiert werden muss. Der Parameter chain ist hierbei wichtig.

[bash]
openssl pkcs12 -export -chain -in ./rootCA/certs/01.pem -inkey ./serverCA/private/SCAkey.pem -out ./serverCA/certs/certChain.p12 -CAfile ./rootCA/certs/00.pem
Enter pass phrase for ./serverCA/private/SCAkey.pem:
Enter Export Password:
Verifying – Enter Export Password:
[/bash]

verwendete openssl.cnf

Dieser Beitrag wurde unter Linux, openssl abgelegt und mit , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert