*.key
-----BEGIN RSA PRIVATE KEY----- ... -----END RSA PRIVATE KEY-----
*.crt
-----BEGIN CERTIFICATE----- ... -----END CERTIFICATE-----
*.csr
-----BEGIN CERTIFICATE REQUEST----- ... -----END CERTIFICATE REQUEST-----
Will man wissen, ob z.B. ein Zertifikat zu einem Schlüssel gehört, dann kann man das so überprüfen:
# openssl rsa -noout -modulus -in domain.de.key | openssl md5 0d35e7c7e4db8c07fff78dd4c3de17f1 # openssl req -noout -modulus -in domain.de.csr | openssl md5 0d35e7c7e4db8c07fff78dd4c3de17f1 # openssl x509 -noout -modulus -in domain.de.crt | openssl md5 0d35e7c7e4db8c07fff78dd4c3de17f1
Wenn alle Checksummen identisch sind, dann gehören alle Dateien zusammen.
Wenn Schlüssellänge egal ist und der Schlüssel keinen Passwortschutz benötigt, dann braucht man keinen Schlüssel separat erzeugen weil beim erzeugen eines Zertifikates automatisch ein Schlüssel generiert wird, wenn keiner vorhanden ist.
Alle gewünschten Parameter (z.B. Schlüssellänge) müssen in der /etc/ssl/openssl.cnf gesetzt werden.
Wenn man einen Schlüssel mit einer bestimmten Länge möchte:
# openssl genrsa -out server.key 4096
Wenn man einen mit Passwort geschützten Schlüssel möchte:
# openssl genrsa -des3 -out server.key 4096
# openssl rsa < server.pem > private_key_ohne_passphrase.key
Schlüssel und Zertifikat erzeugen:
# openssl req -new -x509 -nodes -keyout server.key -out server.crt -days 7000
damit nicht jeder ran kann:
# chmod 0600 server.*
Fingerabdruck anzeigen:
# openssl x509 -noout -fingerprint -in server.crt
Zertifikats-Ersteller -Signierer und Gültigkeitszeitraum:
# openssl x509 -noout -subject -issuer -dates -in server.crt
SSL-Schlüssellänge ausgeben:
# openssl x509 -noout -text -in server.crt | fgrep ' bit)'
Um ein Zertifikat von einer offiziellen CA signieren lassen
zu können, brauchen wir eine *.csr-Datei.
Die *.csr-Datei wird dann zur Zertifizierungsstelle geschickt,
die dann das signierte Zertifikat in einer *.crt-Datei zurück
schicken.
*.key (privater Schlüssel) und *.csr (Anfrage zum signieren des Zertifikates mit Zertifikat) erstellen:
# bin/make_cert.sh -d '*.firma.de' -l Hessen -c Frankfurt -o Firma -a Abteilung
nur *.csr (Anfrage zum signieren des Zertifikates mit Zertifikat) erstellen:
# bin/make_cert.sh -d www.firma.de -l Hessen -c Frankfurt -o Firma -a Abteilung -k www.firma.de.key
*.key (privater Schlüssel) und *.crt (unsigniertes Zertifikat → öffentlicher Schlüssel) erstellen:
# bin/make_cert.sh -d '*.firma.de' -l Hessen -c Frankfurt -o Firma -a Abteilung -u
nur *.crt (unsigniertes Zertifikat → öffentlicher Schlüssel) erstellen:
# bin/make_cert.sh -d www.firma.de -l Hessen -c Frankfurt -o Firma -a Abteilung -u -k www.firma.de.key
#!/bin/bash
# Voreinstellungen
STAAT="DE" # Staat
EMAIL="default@domain.de" # eMail
ZEITRAUM="731" # Gültigkeitszeitraum in Tagen
BITLANG="4096" # Schlüssellänge in Bit
if [ -z "${1}" ] ; then
echo "${0} -h"
exit 1
fi
while [ "${#}" -ne "0" ]; do
case "${1}" in
-d)
DOMAIN=${2} # neuen oder vorhandenen Schlüssel verwenden
shift
;;
-k)
KEY=${2} # neuen oder vorhandenen Schlüssel verwenden
shift
;;
-u)
UNSIGNIERT=JA # Schlüssel mit unsigniertem Zertifikat erstellen
shift
;;
-s)
STAAT=${2} # z.B.: DE
shift
;;
-l)
LAND=${2} # z.B.: Hessen
shift
;;
-c)
STADT=${2} # z.B.: Frankfurt
shift
;;
-o)
ORGANISATION=${2} # Organisation
shift
;;
-a)
ABTEILUNG=${2} # Abteilung
shift
;;
-m)
EMAIL=${2} # z.B.: default@domain.de
shift
;;
-z)
ZEITRAUM=${2} # Gültigkeitszeitraum: 730
shift
;;
-b)
BITLANG=${2} # Schlüssellänge: 4096
shift
;;
-h)
echo "
zwingend erforderliche Parameter:
-d Domain/FQDN
-l Land
-c City/Stadt
-o Organisation/Mandant
-a Abteilung/Marke
optionale Parameter:
-k Key-Datei der schon existiert
-s Staat
-m Mail
-z Zeitraum der Gültigkeit
-b Bit-Länge des Schlüssels
Beispiele
wild-card-Zertifikat mit neuem Schlüssel:
# ${0} -d '*.firma.de' -l Hessen -c Frankfurt -o Firma -a Abteilung
unsigniertes Standard-Zertifikat mit vorhandenem Schlüssel:
# ${0} -d www.firma.de -l Hessen -c Frankfurt -o Firma -a Abteilung -k www.firma.de.key -u
"
exit 0
;;
*)
if [ "$(echo "${1}"|egrep '^-')" ] ; then
echo "Der Parameter '${1}' wird nicht unterstützt!"
exit 1
fi
shift
;;
esac
done
ZNAME="$(echo "${DOMAIN}" | tr -s '[*]' 'w')"
if [ -z "${DOMAIN}" -o -z "${LAND}" -o -z "${STADT}" -o -z "${ORGANISATION}" -o -z "${ABTEILUNG}" ] ; then
echo "
Es werden mind. die Parameter -d, -l, -c, -o, und -a benötigt!
=> ${0} -h
"
exit 1
fi
if [ "${UNSIGNIERT}" == "JA" ] ; then
if [ -z "${KEY}" ] ; then
# neuer Schlüssel
KEY="${ZNAME}.key"
echo "openssl req -x509 -rand /dev/urandom -sha1 -newkey rsa:${BITLANG} -nodes -keyout ${KEY} -keyform PEM -out ${ZNAME}.crt -outform PEM -subj \"/emailAddress=${EMAIL}/C=${STAAT}/ST=${LAND}/L=${STADT}/O=${ORGANISATION}/OU=${ABTEILUNG}/CN=${DOMAIN}\" -days ${ZEITRAUM}"
openssl req -x509 -rand /dev/urandom -sha1 -newkey rsa:${BITLANG} -nodes -keyout ${KEY} -keyform PEM -out ${ZNAME}.crt -outform PEM -subj "/emailAddress=${EMAIL}/C=${STAAT}/ST=${LAND}/L=${STADT}/O=${ORGANISATION}/OU=${ABTEILUNG}/CN=${DOMAIN}" -days ${ZEITRAUM}
else
echo "openssl req -x509 -new -key ${KEY} -out ${ZNAME}.crt -outform PEM -subj "/emailAddress=${EMAIL}/C=${STAAT}/ST=${LAND}/L=${STADT}/O=${ORGANISATION}/OU=${ABTEILUNG}/CN=${DOMAIN}" -days ${ZEITRAUM}"
openssl req -x509 -new -key ${KEY} -out ${ZNAME}.crt -outform PEM -subj "/emailAddress=${EMAIL}/C=${STAAT}/ST=${LAND}/L=${STADT}/O=${ORGANISATION}/OU=${ABTEILUNG}/CN=${DOMAIN}" -days ${ZEITRAUM}
fi
else
if [ -z "${KEY}" ] ; then
# neuer Schlüssel
KEY="${ZNAME}.key"
echo "openssl req -rand /dev/urandom -sha1 -newkey rsa:${BITLANG} -nodes -keyout ${KEY} -keyform PEM -out ${ZNAME}.csr -outform PEM -subj \"/emailAddress=${EMAIL}/C=${STAAT}/ST=${LAND}/L=${STADT}/O=${ORGANISATION}/OU=${ABTEILUNG}/CN=${DOMAIN}\" -days ${ZEITRAUM}"
openssl req -rand /dev/urandom -sha1 -newkey rsa:${BITLANG} -nodes -keyout ${KEY} -keyform PEM -out ${ZNAME}.csr -outform PEM -subj "/emailAddress=${EMAIL}/C=${STAAT}/ST=${LAND}/L=${STADT}/O=${ORGANISATION}/OU=${ABTEILUNG}/CN=${DOMAIN}" -days ${ZEITRAUM}
else
if [ -r "${KEY}" ] ; then
# vorhandener Schlüssel
echo "openssl req -new -key ${KEY} -keyform PEM -out ${ZNAME}.csr -outform PEM -subj \"/emailAddress=${EMAIL}/C=${STAAT}/ST=${LAND}/L=${STADT}/O=${ORGANISATION}/OU=${ABTEILUNG}/CN=${DOMAIN}\" -days ${ZEITRAUM}"
openssl req -new -key ${KEY} -keyform PEM -out ${ZNAME}.csr -outform PEM -subj "/emailAddress=${EMAIL}/C=${STAAT}/ST=${LAND}/L=${STADT}/O=${ORGANISATION}/OU=${ABTEILUNG}/CN=${DOMAIN}" -days ${ZEITRAUM}
else
echo "die Datei ${KEY} ist nicht lesbar..."
exit 1
fi
fi
fi
if [ -r "${ZNAME}.csr" ] ; then
echo "${ZNAME}.csr $(openssl req -text -verify -in ${ZNAME}.csr)"
fi
if [ -r "${KEY}" ] ; then
echo "${KEY} $(openssl rsa -noout -modulus -in ${KEY} | openssl md5)"
fi
if [ -r "${ZNAME}.csr" ] ; then
echo "${ZNAME}.csr $(openssl req -noout -modulus -in ${ZNAME}.csr | openssl md5)"
fi
if [ -r "${ZNAME}.crt" ] ; then
echo "${ZNAME}.crt $(openssl x509 -noout -modulus -in ${ZNAME}.crt | openssl md5)"
fi
Dieses Script erstellt eine eigene CA.
#!/bin/bash
#
# Schlüssel mit Zertifikat
# für eine CA-Signatur erzeugen
#
if [ -z "${1}" ] ; then
echo "${0} [CA-Name]"
exit 1
else
### initialisieren
. $(dirname ${0})/cert.cfg
rm -fr CA
mkdir -p ~/CA/private ~/CA/newcerts && echo '01' > ~/CA/serial && touch ~/CA/index.txt
openssl req -x509 -rand /dev/urandom -sha1 -newkey rsa:${BITLANG} -keyout ~/CA/private/ca.key -keyform PEM -out ~/CA/ca.crt -outform PEM -subj "/emailAddress=${EMAIL}/C=${STAAT}/ST=${LAND}/L=${STADT}/O=${ORGANISATION}/OU=${ABTEILUNG}/CN=${1}" -days ${ZEITRAUM}
echo -e "[ca]\ndefault_ca=CA_default\n[CA_default]\npolicy=policy_match\nserial=CA/serial\ndatabase=CA/index.txt\n[policy_match]\ncommonName=supplied" > ~/CA/openssl.cnf
fi
Für eine Testumgebung kann man die Passphrase auch entfernen:
# openssl rsa < ~/CA/private/ca.key > ca.key # mv ca.key ~/CA/private/ca.key
Dieses Script generiert einen privaten Schlüssel, ein Zertifikat (öffentlicher Schlüssel) und signiert das Zertifikat mit der eigenen CA.
#!/bin/bash
#
# Schlüssel mit signiertem Zertifikat erzeugen
#
if [ -z "${1}" ] ; then
echo "${0} [FQDN des Zielhost]"
echo "${0} www.domain.org"
echo "${0} '*.domain.org'"
exit 1
else
### generieren
ZNAME="$(echo "${1}" | tr -s '[*]' 'i')"
. $(dirname ${0})/cert.cfg
openssl req -x509 -rand /dev/urandom -sha1 -newkey rsa:${BITLANG} -nodes -keyout ${ZNAME}.key -keyform PEM -out ${ZNAME}.crt -outform PEM -subj "/emailAddress=${EMAIL}/C=${STAAT}/ST=${LAND}/L=${STADT}/O=${ORGANISATION}/OU=${ABTEILUNG}/CN=${1}" -days ${ZEITRAUM}
### signieren
openssl ca -config ~/CA/openssl.cnf -batch -md sha1 -selfsign -ss_cert ${ZNAME}.crt -keyfile ~/CA/private/ca.key -cert ~/CA/ca.crt -outdir ~/CA/newcerts/ -days ${ZEITRAUM}
echo
cp ~/CA/newcerts/$(tail -n1 ~/CA/index.txt | awk '{gsub("="," ");print $3".pem"}') ${ZNAME}.pem
rm -f $(tail -n1 ~/CA/index.txt | awk '{gsub("="," ");print $NF".crt"}')
openssl x509 -noout -subject -issuer -dates -in ${ZNAME}.pem
ls -1 ${ZNAME}.*
fi
#!/bin/bash
if [ -z "${1}" ] ; then
echo "${0} *.domain.de.*"
exit 1
fi
echo
for i in ${@}
do
ENDUNG="$(echo "${i}" | rev | awk -F'.' '{print $1}' | rev)"
if [ "${ENDUNG}" == "key" ] ; then
MD5PRUEFSUMME="$(openssl rsa -noout -modulus -in ${i} | openssl md5)"
echo "${MD5PRUEFSUMME} - ${i}"
elif [ "${ENDUNG}" == "csr" ] ; then
MD5PRUEFSUMME="$(openssl req -noout -modulus -in ${i} | openssl md5)"
echo "${MD5PRUEFSUMME} - ${i}"
elif [ "${ENDUNG}" == "crt" ] ; then
MD5PRUEFSUMME="$(openssl x509 -noout -modulus -in ${i} | openssl md5)"
echo "${MD5PRUEFSUMME} - ${i}"
# else
# echo "${i} ..."
fi
done | sort -n
echo
Zusammengehörigkeit von Schlüssel und Zertifikatsanfrage überprüfen:
# /root/bin/ssl_check.sh *.domain.de.* 0d345e7c7e4db8c05fff48d4c3de17e1 - www.domain.de.crt 0d345e7c7e4db8c05fff48d4c3de17e1 - www.domain.de.csr 0d345e7c7e4db8c05fff48d4c3de17e1 - www.domain.de.key
nachlesen wie es geht:
# zless /usr/share/doc/apache2.2-common/README.Debian.gz
Schlüssel und signiertes Zertifikat an die richtige Stelle legen:
# cp www.test.net.pem /etc/ssl/certs/ # cp www.test.net.key /etc/ssl/private/
den gewünschten Schlüssel mit Zertifikat eintragen:
# vi /etc/apache2/sites-available/default-ssl
...
SSLCertificateFile /etc/ssl/certs/www.test.net.pem
SSLCertificateKeyFile /etc/ssl/private/www.test.net.key
...
SSL aktivieren:
# a2ensite default-ssl # a2enmod ssl # /etc/init.d/apache2 restart
# openssl pkcs12 -export -out zertifikat.p12 -inkey privater.key -in zertifikat.crt -certfile ca.crt