Eigene CA
From NJH-Wiki
- Autor
- Volker Grabsch
Contents |
Einleitung
Wer auf seiner Webseite SSL verwenden möchte, benötigt ein SSL-Zertifikat. Dazu gibt es mehrere Möglichkeiten:
- ein SSL-Zertifikat bei einem kommerziellen Anbieter kaufen
- ein SSL-Zertifikat bei CAcert ausstellen lassen
- eine eigene, kleine CA (Certificate Authority) betreiben
Dieser Artikel beschreibt den dritten Weg.
Veraltet?
Achtung! Die hier vorgestellten Scripte sind womöglich überholt, seit es XCA gibt!
Anleitung
Vorbereitungen
Zunächst erstellen wir ein neues Verzeichnis, am besten:
mkdir /etc/ca cd /etc/ca
Dort hinein werden die beiden Scripte create_ca.sh und mk_cert.sh kopiert.
Nicht vergessen, die Dateien ausführbar zu machen!
chmod 755 create_ca.sh mk_cert.sh
Beide Scripte benutzen OpenSSL.
CA erstellen
Mit dem ersten Script kann man die CA ganz schnell erstellen:
./create_ca.sh
Es wird unter anderem das CA-Zertifikat (Stammzertifikat) generiert. Es ist 30 Jahre gültig und wird im PEM- und im DER-Format abgelegt. Das DER-Format ist dem PEM-Format vorzuziehen, weil einige alte Browser mit PEM nicht klar kommen.
Unser Stammzertifikat können wir nun veröffentlichen:
cp ca.DER.crt /pfad/zur/webseite/stammzertifikat.crt
Damit ein Browser bzw. Mailprogramme alle in Zukunft von dieser CA ausgestellten Zertifikate akzeptiert (ohne Warnmeldung), muss es extra geladen werden. Hierzu braucht man einfach nur auf seine Homepage einen Link auf die Datei stammzertifikat.crt anlegen. Klick ein Benutzer auf diesen Link, erkennt sein Browser sofort, dass es sich um das Zertifikat einer CA handelt. Der Benutzer wird gefragt, ob er dieser CA in Zukunft verfrauen möchte, und fertig!
Zertifikate erstellen
Ein neues Zertifikat, z.B. test.pem, wird mit dem zweiten Script erstellt:
./mk_cert.sh test
Es ist per Voreinstellung 1 Jahr gültig. Rechtzeitig (d.h. vor Ablauf des Jahres) sollte ein neues erstellt werden, sonst gibt's Fehlermeldungen.
Sollen neu erstellte Zertifikate länger gültig sein (z.B. 10 Jahre), muss dies vor dem Aufruf von mk_cert in der ca.config festgelegt werden:
default_days = 3650
Informationen über ein Zertifikat
Einige nützliche Infos über ein Zertifikat (hier: test.crt) erfahren wir per
openssl x509 -noout -subject -in test.crt
Ausführlichere Informationen erhälten wir per
openssl x509 -noout -text -in test.crt
Scripte
create_ca.sh
#!/bin/bash #---- # create_ca.sh # - a simple shell script for creating an own CA (using OpenSSL) # # Author: Volker Grabsch #---- # don't kill an existing CA if [ -s ca.crt ] then echo "ca.crt already exists!" exit 1 fi # create private key for CA touch ca.key chmod 600 ca.key openssl genrsa -out ca.key 2048 || exit 1 # create self signed 30-year certificate for CA openssl req -x509 -days 10960 -new -key ca.key -out ca.crt || exit 1 # create a DER variant of the certificate (useful for publishing to browsers) openssl x509 -outform DER -in ca.crt -out ca.DER.crt || exit 1 # create all necessary config files and directories echo -n >ca.db.index echo "unique_subject = yes" >ca.db.index.attr echo "01" >ca.db.serial mkdir ca.db.certs/ 2>/dev/null chmod 700 ca.db.certs cat >ca.config <<EOF [ ca ] default_ca = CA_own [ CA_own ] dir = . certs = \$dir new_certs_dir = \$dir/ca.db.certs database = \$dir/ca.db.index serial = \$dir/ca.db.serial RANDFILE = \$dir/ca.db.rand certificate = \$dir/ca.crt private_key = \$dir/ca.key default_days = 365 default_crl_days = 30 default_md = md5 preserve = no policy = policy_anything [ policy_anything ] countryName = optional stateOrProvinceName = optional localityName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional EOF
mk_cert.sh
#!/bin/bash
#----
# mk_cert.sh
# - a simple shell script for creating a new certificate
# signed by an own CA (using OpenSSL)
#
# Author: Volker Grabsch
#----
# check for parameters
if [ "$1" == "" ]
then
echo "syntax: $0 <base>"
exit 1
fi
# read parameters
BASE=$1
# create private key
rm $BASE.key
touch $BASE.key
chmod 600 $BASE.key
openssl genrsa -out $BASE.key 1024 || exit 1
# create certificate, i.e. make the CA sign it
openssl req -new -key $BASE.key -out $BASE.csr || exit 1
openssl ca -batch -config ca.config -out $BASE.crt -infiles $BASE.csr || exit 1
rm $BASE.csr
# create PEM file, i.e. concatenate [private key + certificate + dh-parameters]
> $BASE.pem
chmod 600 $BASE.pem
cat $BASE.key >> $BASE.pem
sed -n '/^-----BEGIN CERTIFICATE-----$/,$ p' < $BASE.crt >> $BASE.pem
touch $BASE.rnd
dd if=/dev/urandom of=$BASE.rnd bs=4096 count=1
openssl gendh -rand $BASE.rnd 512 >> $BASE.pem || exit 1
rm $BASE.rnd

