Erstellen einer eigenen Certificate Authority
Warnung: Dieser Beitrag ist lediglich eine Dokumentation meiner Schritte und basiert im wesentlichen auf diesem und diesem Beitrag. Ich stehe mit den ganzen verschiedenen Dateien noch etwas auf Kriegsfuß.
Ziel ist es eine eigene Certificate Authority aufzusetzen um dann eigene SSL Zertifikate für Webserver und persönliche Zertifikate für die Authentifizierung zu erstellen.
Zuerst muss ein öffentlicher und privater Schlüssel erstellt werden und dann das Zertifikate sowie ein Repository für die Ablage der neuen Schlüssel
1. Verzeichnisse einrichten
export SSLDIR=$HOME/CERT-AUTH
mkdir $SSLDIR
mkdir $SSLDIR/certs
mkdir $SSLDIR/crl
mkdir $SSLDIR/newcerts
mkdir $SSLDIR/private
mkdir $SSLDIR/requests
touch $SSLDIR/index.txt
echo "01" > $SSLDIR/serial
chmod 700 $SSLDIR
2. Konfigurationsdatei openssl.conf einrichten
Die meisten Werte kann ich nicht erklären. Für mich wichtig waren nur die Pfadangaben im Abschnitt CA_default, user_cert und v3_ca. Den Rest habe ich einfach übernommen.
# =================================================
# OpenSSL configuration file
# =================================================
RANDFILE = $ENV::SSLDIR/.rnd
[ ca ]
default_ca = CA_default
[CA_default ]
dir = $ENV::SSLDIR
certs = $dir/certs
new_certs_dir = $dir/newcerts
crl_dir = $dir/crl
database = $dir/index.txt
private_key = $dir/private/ca.key.pem
certificate = $dir/certs/ca.cert.pem
serial = $dir/serial
crl = $dir/crl.pem
RANDFILE = $dir/private/.rand
default_days = 365
default_crl_days = 30
default_md = sha1
preserve = no
policy = policy_anything
name_opt = ca_default
cert_opt = ca_default
[ usr_cert ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
nsComment = "OpenSSL Generated Certificate"
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
[ v3_ca ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = critical, CA:true
nsCertType = sslCA
keyUsage = cRLSign, keyCertSign
extendedKeyUsage = serverAuth, clientAuth
nsComment = "OpenSSL CA Certificate"
3. Öffentlichen und privaten Schlüssel des Wurzelzertifikates erstellen
openssl genrsa -aes256 -out $SSLDIR/private/ca.key.pem 4096
chmod 400 $SSLDIR/private/ca.key.pem
4. Wurzelzertifikat erstellen
openssl req -new -x509 -days 3650 -key $SSLDIR/private/ca.key.pem -extensions v3_ca -out $SSLDIR/certs/ca.cert.pem
Enter pass phrase for /root/CERT-AUTH/private/ca.key.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) [AU]:DE
State or Province Name (full name) [Some-State]:NRW
Locality Name (eg, city) []:Meckenheim
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Hagen-Bauer-CA
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:Hagen-Bauer
Email Address []:hagen.bauer@caserio.de
5. Schlüssel für den Web Server erstellen
cd $SSLDIR
openssl genrsa -out private/seeblick.hagen-bauer.de.key.pem 4096
6. Generiere ein CSR
openssl req -new -key private/www.hagen-bauer.de.key.pem -out certs/www.hagen-bauer.de.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) [AU]:DE
State or Province Name (full name) [Some-State]:NRW
Locality Name (eg, city) []:Meckenheim
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Hagen-Bauer-CA
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:www.hagen-bauer.de
Email Address []:hagen.bauer@caserio.de
7. Signiere den CSR und erstelle ein neues Zertifikat
openssl ca -config openssl.conf -extensions usr_cert -notext -md sha1 -in certs/seeblick.hagen-bauer.de.csr.pem -out certs/seeblick.hagen-bauer.de.cert.pem
Using configuration from openssl.conf
Enter pass phrase for /root/CERT-AUTH/private/ca.key.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Jun 22 08:59:49 2014 GMT
Not After : Jun 22 08:59:49 2015 GMT
Subject:
countryName = DE
stateOrProvinceName = NRW
localityName = Meckenheim
organizationName = Hagen-Bauer-CA
commonName = www.hagen-bauer.de
emailAddress = hagen.bauer@caserio.de
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
X509v3 Key Usage:
Digital Signature, Non Repudiation, Key Encipherment
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
70:88:86:07:4.....
X509v3 Authority Key Identifier:
keyid:70:80:....
Certificate is to be certified until Jun 22 08:59:49 2015 GMT (365 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
8. Installiere die Zertifikate und Schlüssel auf dem Webserver
Ein schönes Paket erstellen
mkdir transferpakete
mkdir transferpakete/www.hagen-bauer.de
cd transferpakete/www.hagen-bauer.de/
ln -s /root/CERT-AUTH/private/www.hagen-bauer.de.key.pem .
ln -s /root/CERT-AUTH/certs/ca.cert.pem .
ln -s /root/CERT-AUTH/certs/www.hagen-bauer.de.cert.pem .
cd ..
tar czvfh admin.hagen-bauer.de.tar.gz www.hagen-bauer.de
Dann dieses Paket auf den eigentlichen Webserver kopieren und an die richtige Stelle auspacken
cd /etc/ssl
tar xzvf /home/hbauer/www.hagen-bauer.de.tar.gz
und im Serverdokument für den Webserver eintragen
vi /etc/apache2/sites-enabled/hagen-bauer-admin
SSLEngine on
SSLCertificateFile /etc/ssl/www.hagen-bauer.de/www.hagen-bauer.de.cert.pem
SSLCertificateKeyFile /etc/ssl/www.hagen-bauer.de/www.hagen-bauer.de.key.pem
SSLCACertificateFile /etc/ssl/www.hagen-bauer.de/ca.cert.pem
Wenn man jetzt auf den Webserver zugreift bekommt man natürlich zuerst wieder die übliche Meldung des unzuverlässigen Zertifikates. Installiert man allerdings das SSLCACertificte ca.cert.pem im Browser dann wird von da an allen selbst erstellten Zertifikaten vertraut.