Eigene CA

From NJH-Wiki

Jump to: navigation, search
Autor 
Volker Grabsch

Contents

Einleitung

Wer auf seiner Webseite SSL verwenden möchte, benötigt ein SSL-Zertifikat. Dazu gibt es mehrere Möglichkeiten:

  1. ein SSL-Zertifikat bei einem kommerziellen Anbieter kaufen
  2. ein SSL-Zertifikat bei CAcert ausstellen lassen
  3. 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

Weblinks

Personal tools