Eine eigene x509v3 CA erstellen

Zunächst wird eine Config Datei benötigt.
ca.conf:
[ req ]
default_bits=4096
default_md=sha512
utf8=yes
distinguished_name=req_distinguished_name
x509_extensions=x509_exts

[ req_distinguished_name ]

[ x509_exts ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer:always
basicConstraints = CA:true

[ ca ]
default_ca=default_ca

[ default_ca ]
certificate=ca.crt
private_key=private/ca.key
default_days=36500
default_md=sha512
database=meta/db.txt
unique_subject=no
serial=meta/serial
policy=ca_policy
name_opt=ca_default
cert_opt=ca_default
copy_extensions=copyall
x509_extensions=ca_x509_ext

[ ca_x509_ext ]
# an empty referenced section ensures a v3 cert is generated

[ server ]
nsCertType=server

[ ca_policy ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = optional
emailAddress = optional

Dann werden noch ein paar Ordner, eine lehre Datenbank(halde) und eine Seriennummer benötigt.
mkdir private meta certs
touch meta/db.txt
echo 01 > meta/serial

Nun wird die CA erstellt.
openssl req -x509 -subj /CN=TestCA -newkey rsa:4096 -keyout private/ca.key -out ca.crt -nodes -config ca.conf -days 36500

Dann muss das CSR (Certifikate signing request) erstellt werden.
openssl req -subj /CN=TestCert -newkey rsa:4096 -keyout new.key -out new.csr -nodes -config ca.conf -days 36500

Zum Schluss wird aus dem CSR das von der CA signierte Zertifikat des Clients.
openssl ca -in new.csr -outdir certs/ -config ca.conf -notext -utf8

Möchten man nun z.b. ein vpn Server mit der CA betreiben braucht man noch ein Server Zertifikat.
openssl ca -in new.csr -outdir certs/ -config ca.conf -extensions server -notext -utf8
(z.B. openvpn server wenn man die –ns-cert-type server bei den clients angibt)

Die Zertifikate kann man sich dann mit folgenden Befehl anzeigen lassen.
openssl x509 -in ca.crt -noout -text

Quelle: www.openssl.org

[update 17.02.2014]
Der Hash Algorithmus wurde von sha1 auf sha512 geändert, da dieser als Angreifbar gilt.

Tolle Zahl: 65535

64 bytes from 10.0.0.1: icmp_seq=65533 ttl=64 time=0.349 ms
64 bytes from 10.0.0.1: icmp_seq=65534 ttl=64 time=0.312 ms
64 bytes from 10.0.0.1: icmp_seq=65535 ttl=64 time=0.318 ms
64 bytes from 10.0.0.1: icmp_seq=0 ttl=64 time=0.325 ms
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=0.308 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=0.312 ms

Dabei fängt der erste ping bei 1 an und nicht bei 0.

Ubuntu 12.04 Precise Pangolin

Es ist so weit, Precise Pangolin Ubuntu 12.04 ist auf unserem Mirror angekommen.

http://mirror.bauhuette.fh-aachen.de/ubuntu-cd/

openvpn up/down script-security unter 12.04 precise

Ach, toll. Nach der Umstellung von Lucid auf Ubuntu 12.04 Precise konnte OpenVPN nicht mehr starten. Im opnvpn.log fand ich folgenden Warnung die das Problem beschreibt.
WARNING: External program may not be called unless '--script-security 2' or higher is enabled. Use '--script-security 3 system' for backward compatibility with 2.1_rc8 and earlier. See --help text or man page for detailed info.
WARNING: Failed running command (--up/--down): external program fork failed

Das Problem, in meiner client.conf stand ein Script das ausgeführt wird wenn der Tunnel Startet.
up /etc/openvpn/ip-config

Wenn man folgende Ziele in der client.conf ergähnst, wird dem OpenVPN erlaub dies auszuführen.
script-security 3 system

zone files eine IP ändern

Mal eben schnell in allen Zonefiles eine IP ändern und die serial Nummer updaten.

#!/bin/bash
for item in *; do 
  if [ -f $item ]; then 
    sed 's/'88.198.44.248'/'46.4.34.52'/g' $item > $item.tmp;
    if [ "$(md5sum $item | awk '{print $1}')" = "$(md5sum $item.tmp | awk '{print $1}')" ]; then 
      rm $item.tmp
    else
      sed "s/$(cat $item.tmp | grep 'serial' | awk '{print $1}')/2012040601/g" $item.tmp > $item
      rm $item.tmp
    fi   
  fi 
done

Das funktioniert natürlich nur solange wenn die Zonefiles noch nicht geupdatet wurden und die Serienummern mit ;sirial getakt sind.