Dovecot, SSL/TLS - Dovecotverbindungen verschlüsselte Kommunikation

Bild: Weltkugel
Dass das Internet systembedingt unsicher ist, hat sich in aller Regel herumgesprochen. Daten durchlaufen von der Quelle bis zum Ziel zahlreiche Server und Systeme, an denen die Daten, abgegriffen und/oder manipuliert werden können. Persönliche und vertrauliche Daten können so einfach Dritten in die Hände fallen, die mit großer krimineller Energie versuchen an diese Daten zu kommen.

Inwieweit staatliche Stellen den Datenverkehr abhören, protokollieren und abgreifen und zu manipulieren bzw. zensieren versuchen, weiss

  1. keiner so genau und
  2. was mit den gewonnen Daten angestellt wird, wird sich niemand öffentlich sagen trauen.

Tja, das war Stand der Dinge vor 2013, denn was bisher in den Bereich der Spekulation fiel, findet nun Bestätigung durch die Erkenntnisse des Whistleblowers Edward Snowden zu den Projekten PRISM aus den USA und TEMPORA aus England. Bild: Ausrufezeichen Seit Jahren werden unschuldige Bürgerinnen und Bürger von staatlichen Institutionen unter Generalverdacht gestellt und überwacht! Regierungen scheuen keinen Aufwand um in die Privatsphäre unschuldiger Bürgerinnen und Bürger einzudringen, Daten auszulesen und auszuwerten!

Was lernen wir aus dieser Tatsache? Unsere Kommunikation ist nach besten Wissen und Gewissen, so zu gestalten, damit andere unsere Daten nicht mitlesen und manipulieren können. Ferner ist sicherzustellen, dass Empfänger vertrauen können, dass Informationen tatsächlich von dem versandt wurden, von dem wir glauben, diese zu bekommen.

Nicht nur auf Seiten der Endkunden, die mit Hilfe von OpenPGP oder S/MIME vertraulich kommunizieren, sondern auch serverseitig kann der Übertragungsweg mit einfachen Mitteln entsprechend verschlüsselt werden. SSL/TLS Logo Für die vertrauliche Kommunikation zwischen unseren Usern und unserm Dovcot-Mailserver bietet sich eine verschlüsselte Kommunikation mit Hilfe von SSL/TLS an.

Mit Hilfe von PFS1) können wir leicht und einfach sicherstellen, dass aufgezeichnete Datenströme im nachhinein nicht entschlüsselt werden können. Dies wird erreicht, da die beiden Kommunikationspartner, einen separaten und individuellen temporären Schlüssel zur Datensicherung verweden. Dieser Schlüssel ist dabei nicht fix, sondern wird bei jeder Verbindung neu ausgehandelt. Da aber der Schlüssel an sich nicht ausgetauscht werden muss, ist es auch nicht möglich, den eventuell aufgezeichneten Datenstrom zu entschlüsseln, da der dazu benötigte Schlüssel nicht im Datenstrom enthalten war.

Perfect Forward Secrecy (PFS) basiert auf der Idee, dass Client und Server ihre Kommunikation über einen zusätzlichen temporären Schlüssel absichern, der wechselt. Da der Verbindungsaufbau so gestrickt ist, daß der Schlüssel selbst gar nicht ausgetauscht werden muß, kann der jeweils benutzte Sitzungsschlüssel selbst auch nicht aufgezeichnet werden. Eine nachträgliche Entschlüsselung einer früher aufgezeichneten Session ist damit nicht mehr möglich.

Die für die Verschlüsselung notwendigen Schlüssel und Zertifikate erstellen wir mittels OpenSSL, einer freien Implementierung von SSL2). SSL oder TLS3) ist ein hybrides Verschlüsselungsprotokoll zur Datenübertragung im Internet. Unter TLS 1.0, 1.1 und 1.2 versteht man die standardisierten Weiterentwicklungen von SSL 3.0 (TLS 1.0 steht neu für SSL 3.1). Dies bedeutet also, SSL wird nun unter dem Namen TLS weiterentwickelt.

Dovecot stellt das normale DHE-Verfahren bereits ab Version 2.1.x und das wesentlich bessere und performantere ECDHE-Verfahren ab 2.2.x zur Verfügung.

Bei der Standardinstallation unseres Systems wurde in der Regel bereits das Paket openssl installiert. Ein kurzer Blick in die RPMdatenbank schafft hierzu Gewissheit.

 # yum list openssl
 Installed Packages
 openssl.x86_64                     1:1.0.1e-34.el7_0.3                             @updates-LC

Sollte das Paket noch fehlen, installieren wir dies einfach via:

 # yum install openssl

Was uns das Paket openssl alles mitbringt und wohin die Programme und Konfigurationsdateien kopiert werden, offenbart uns das System wie folgt.

 # rpm -qil openssl
Name        : openssl
Epoch       : 1
Version     : 1.0.1e
Release     : 34.el7_0.3
Architecture: x86_64
Install Date: Mon 21 Jul 2014 03:25:15 PM CEST
Group       : System Environment/Libraries
Size        : 1609970
License     : OpenSSL
Signature   : RSA/SHA256, Sat 05 Jul 2014 05:29:46 PM CEST, Key ID 24c6a8a7f4a80eb5
Source RPM  : openssl-1.0.1e-34.el7_0.3.src.rpm
Build Date  : Tue 24 Jun 2014 02:59:00 PM CEST
Build Host  : worker1.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : http://www.openssl.org/
Summary     : Utilities from the general purpose cryptography library with TLS implementation
Description :
The OpenSSL toolkit provides support for secure communications between
machines. OpenSSL includes a certificate management tool and shared
libraries which provide various cryptographic algorithms and
protocols.
/etc/pki/CA
/etc/pki/CA/certs
/etc/pki/CA/crl
/etc/pki/CA/newcerts
/etc/pki/CA/private
/etc/pki/tls/certs/Makefile
/etc/pki/tls/certs/make-dummy-cert
/etc/pki/tls/certs/renew-dummy-cert
/etc/pki/tls/misc/CA
/etc/pki/tls/misc/c_hash
/etc/pki/tls/misc/c_info
/etc/pki/tls/misc/c_issuer
/etc/pki/tls/misc/c_name
/usr/bin/openssl
/usr/share/doc/openssl-1.0.1e
/usr/share/doc/openssl-1.0.1e/CHANGES
/usr/share/doc/openssl-1.0.1e/FAQ
/usr/share/doc/openssl-1.0.1e/INSTALL
/usr/share/doc/openssl-1.0.1e/LICENSE
/usr/share/doc/openssl-1.0.1e/NEWS
/usr/share/doc/openssl-1.0.1e/README
/usr/share/doc/openssl-1.0.1e/README.FIPS
/usr/share/doc/openssl-1.0.1e/c-indentation.el
/usr/share/doc/openssl-1.0.1e/openssl.txt
/usr/share/doc/openssl-1.0.1e/openssl_button.gif
/usr/share/doc/openssl-1.0.1e/openssl_button.html
/usr/share/doc/openssl-1.0.1e/ssleay.txt
/usr/share/man/man1/asn1parse.1ssl.gz
/usr/share/man/man1/ca.1ssl.gz
/usr/share/man/man1/ciphers.1ssl.gz
/usr/share/man/man1/cms.1ssl.gz
/usr/share/man/man1/crl.1ssl.gz
/usr/share/man/man1/crl2pkcs7.1ssl.gz
/usr/share/man/man1/dgst.1ssl.gz
/usr/share/man/man1/dhparam.1ssl.gz
/usr/share/man/man1/dsa.1ssl.gz
/usr/share/man/man1/dsaparam.1ssl.gz
/usr/share/man/man1/ec.1ssl.gz
/usr/share/man/man1/ecparam.1ssl.gz
/usr/share/man/man1/enc.1ssl.gz
/usr/share/man/man1/errstr.1ssl.gz
/usr/share/man/man1/gendsa.1ssl.gz
/usr/share/man/man1/genpkey.1ssl.gz
/usr/share/man/man1/genrsa.1ssl.gz
/usr/share/man/man1/md2.1ssl.gz
/usr/share/man/man1/md4.1ssl.gz
/usr/share/man/man1/md5.1ssl.gz
/usr/share/man/man1/mdc2.1ssl.gz
/usr/share/man/man1/nseq.1ssl.gz
/usr/share/man/man1/ocsp.1ssl.gz
/usr/share/man/man1/openssl.1ssl.gz
/usr/share/man/man1/pkcs12.1ssl.gz
/usr/share/man/man1/pkcs7.1ssl.gz
/usr/share/man/man1/pkcs8.1ssl.gz
/usr/share/man/man1/pkey.1ssl.gz
/usr/share/man/man1/pkeyparam.1ssl.gz
/usr/share/man/man1/pkeyutl.1ssl.gz
/usr/share/man/man1/req.1ssl.gz
/usr/share/man/man1/ripemd160.1ssl.gz
/usr/share/man/man1/rsa.1ssl.gz
/usr/share/man/man1/rsautl.1ssl.gz
/usr/share/man/man1/s_client.1ssl.gz
/usr/share/man/man1/s_server.1ssl.gz
/usr/share/man/man1/s_time.1ssl.gz
/usr/share/man/man1/sess_id.1ssl.gz
/usr/share/man/man1/sha.1ssl.gz
/usr/share/man/man1/sha1.1ssl.gz
/usr/share/man/man1/smime.1ssl.gz
/usr/share/man/man1/speed.1ssl.gz
/usr/share/man/man1/spkac.1ssl.gz
/usr/share/man/man1/sslpasswd.1ssl.gz
/usr/share/man/man1/sslrand.1ssl.gz
/usr/share/man/man1/ts.1ssl.gz
/usr/share/man/man1/tsget.1ssl.gz
/usr/share/man/man1/verify.1ssl.gz
/usr/share/man/man1/version.1ssl.gz
/usr/share/man/man1/x509.1ssl.gz
/usr/share/man/man5/config.5ssl.gz
/usr/share/man/man5/openssl.cnf.5ssl.gz
/usr/share/man/man5/x509v3_config.5ssl.gz
/usr/share/man/man7/des_modes.7ssl.gz

Cipher-Suites und Diffie-Hellman

Möchte man in Erfahrung bringen, welche Cipher-Suites4) unser installiertes OpenSSL-Paket mitbringt, können wir wie folgt abfragen5).

 # openssl ciphers -v
ECDHE-RSA-AES256-GCM-SHA384   TLSv1.2 Kx=ECDH       Au=RSA   Enc=AESGCM(256)   Mac=AEAD
ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH       Au=ECDSA Enc=AESGCM(256)   Mac=AEAD
ECDHE-RSA-AES256-SHA384       TLSv1.2 Kx=ECDH       Au=RSA   Enc=AES(256)      Mac=SHA384
ECDHE-ECDSA-AES256-SHA384     TLSv1.2 Kx=ECDH       Au=ECDSA Enc=AES(256)      Mac=SHA384
ECDHE-RSA-AES256-SHA          SSLv3   Kx=ECDH       Au=RSA   Enc=AES(256)      Mac=SHA1
ECDHE-ECDSA-AES256-SHA        SSLv3   Kx=ECDH       Au=ECDSA Enc=AES(256)      Mac=SHA1
DHE-DSS-AES256-GCM-SHA384     TLSv1.2 Kx=DH         Au=DSS   Enc=AESGCM(256)   Mac=AEAD
DHE-RSA-AES256-GCM-SHA384     TLSv1.2 Kx=DH         Au=RSA   Enc=AESGCM(256)   Mac=AEAD
DHE-RSA-AES256-SHA256         TLSv1.2 Kx=DH         Au=RSA   Enc=AES(256)      Mac=SHA256
DHE-DSS-AES256-SHA256         TLSv1.2 Kx=DH         Au=DSS   Enc=AES(256)      Mac=SHA256
DHE-RSA-AES256-SHA            SSLv3   Kx=DH         Au=RSA   Enc=AES(256)      Mac=SHA1
DHE-DSS-AES256-SHA            SSLv3   Kx=DH         Au=DSS   Enc=AES(256)      Mac=SHA1
DHE-RSA-CAMELLIA256-SHA       SSLv3   Kx=DH         Au=RSA   Enc=Camellia(256) Mac=SHA1
DHE-DSS-CAMELLIA256-SHA       SSLv3   Kx=DH         Au=DSS   Enc=Camellia(256) Mac=SHA1
ECDH-RSA-AES256-GCM-SHA384    TLSv1.2 Kx=ECDH/RSA   Au=ECDH  Enc=AESGCM(256)   Mac=AEAD
ECDH-ECDSA-AES256-GCM-SHA384  TLSv1.2 Kx=ECDH/ECDSA Au=ECDH  Enc=AESGCM(256)   Mac=AEAD
ECDH-RSA-AES256-SHA384        TLSv1.2 Kx=ECDH/RSA   Au=ECDH  Enc=AES(256)      Mac=SHA384
ECDH-ECDSA-AES256-SHA384      TLSv1.2 Kx=ECDH/ECDSA Au=ECDH  Enc=AES(256)      Mac=SHA384
ECDH-RSA-AES256-SHA           SSLv3   Kx=ECDH/RSA   Au=ECDH  Enc=AES(256)      Mac=SHA1
ECDH-ECDSA-AES256-SHA         SSLv3   Kx=ECDH/ECDSA Au=ECDH  Enc=AES(256)      Mac=SHA1
AES256-GCM-SHA384             TLSv1.2 Kx=RSA        Au=RSA   Enc=AESGCM(256)   Mac=AEAD
AES256-SHA256                 TLSv1.2 Kx=RSA        Au=RSA   Enc=AES(256)      Mac=SHA256
AES256-SHA                    SSLv3   Kx=RSA        Au=RSA   Enc=AES(256)      Mac=SHA1
CAMELLIA256-SHA               SSLv3   Kx=RSA        Au=RSA   Enc=Camellia(256) Mac=SHA1
PSK-AES256-CBC-SHA            SSLv3   Kx=PSK        Au=PSK   Enc=AES(256)      Mac=SHA1
ECDHE-RSA-AES128-GCM-SHA256   TLSv1.2 Kx=ECDH       Au=RSA   Enc=AESGCM(128)   Mac=AEAD
ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH       Au=ECDSA Enc=AESGCM(128)   Mac=AEAD
ECDHE-RSA-AES128-SHA256       TLSv1.2 Kx=ECDH       Au=RSA   Enc=AES(128)      Mac=SHA256
ECDHE-ECDSA-AES128-SHA256     TLSv1.2 Kx=ECDH       Au=ECDSA Enc=AES(128)      Mac=SHA256
ECDHE-RSA-AES128-SHA          SSLv3   Kx=ECDH       Au=RSA   Enc=AES(128)      Mac=SHA1
ECDHE-ECDSA-AES128-SHA        SSLv3   Kx=ECDH       Au=ECDSA Enc=AES(128)      Mac=SHA1
DHE-DSS-AES128-GCM-SHA256     TLSv1.2 Kx=DH         Au=DSS   Enc=AESGCM(128)   Mac=AEAD
DHE-RSA-AES128-GCM-SHA256     TLSv1.2 Kx=DH         Au=RSA   Enc=AESGCM(128)   Mac=AEAD
DHE-RSA-AES128-SHA256         TLSv1.2 Kx=DH         Au=RSA   Enc=AES(128)      Mac=SHA256
DHE-DSS-AES128-SHA256         TLSv1.2 Kx=DH         Au=DSS   Enc=AES(128)      Mac=SHA256
DHE-RSA-AES128-SHA            SSLv3   Kx=DH         Au=RSA   Enc=AES(128)      Mac=SHA1
DHE-DSS-AES128-SHA            SSLv3   Kx=DH         Au=DSS   Enc=AES(128)      Mac=SHA1
ECDHE-RSA-DES-CBC3-SHA        SSLv3   Kx=ECDH       Au=RSA   Enc=3DES(168)     Mac=SHA1
ECDHE-ECDSA-DES-CBC3-SHA      SSLv3   Kx=ECDH       Au=ECDSA Enc=3DES(168)     Mac=SHA1
DHE-RSA-SEED-SHA              SSLv3   Kx=DH         Au=RSA   Enc=SEED(128)     Mac=SHA1
DHE-DSS-SEED-SHA              SSLv3   Kx=DH         Au=DSS   Enc=SEED(128)     Mac=SHA1
DHE-RSA-CAMELLIA128-SHA       SSLv3   Kx=DH         Au=RSA   Enc=Camellia(128) Mac=SHA1
DHE-DSS-CAMELLIA128-SHA       SSLv3   Kx=DH         Au=DSS   Enc=Camellia(128) Mac=SHA1
EDH-RSA-DES-CBC3-SHA          SSLv3   Kx=DH         Au=RSA   Enc=3DES(168)     Mac=SHA1
EDH-DSS-DES-CBC3-SHA          SSLv3   Kx=DH         Au=DSS   Enc=3DES(168)     Mac=SHA1
ECDH-RSA-AES128-GCM-SHA256    TLSv1.2 Kx=ECDH/RSA   Au=ECDH  Enc=AESGCM(128)   Mac=AEAD
ECDH-ECDSA-AES128-GCM-SHA256  TLSv1.2 Kx=ECDH/ECDSA Au=ECDH  Enc=AESGCM(128)   Mac=AEAD
ECDH-RSA-AES128-SHA256        TLSv1.2 Kx=ECDH/RSA   Au=ECDH  Enc=AES(128)      Mac=SHA256
ECDH-ECDSA-AES128-SHA256      TLSv1.2 Kx=ECDH/ECDSA Au=ECDH  Enc=AES(128)      Mac=SHA256
ECDH-RSA-AES128-SHA           SSLv3   Kx=ECDH/RSA   Au=ECDH  Enc=AES(128)      Mac=SHA1
ECDH-ECDSA-AES128-SHA         SSLv3   Kx=ECDH/ECDSA Au=ECDH  Enc=AES(128)      Mac=SHA1
ECDH-RSA-DES-CBC3-SHA         SSLv3   Kx=ECDH/RSA   Au=ECDH  Enc=3DES(168)     Mac=SHA1
ECDH-ECDSA-DES-CBC3-SHA       SSLv3   Kx=ECDH/ECDSA Au=ECDH  Enc=3DES(168)     Mac=SHA1
AES128-GCM-SHA256             TLSv1.2 Kx=RSA        Au=RSA   Enc=AESGCM(128)   Mac=AEAD
AES128-SHA256                 TLSv1.2 Kx=RSA        Au=RSA   Enc=AES(128)      Mac=SHA256
AES128-SHA                    SSLv3   Kx=RSA        Au=RSA   Enc=AES(128)      Mac=SHA1
SEED-SHA                      SSLv3   Kx=RSA        Au=RSA   Enc=SEED(128)     Mac=SHA1
CAMELLIA128-SHA               SSLv3   Kx=RSA        Au=RSA   Enc=Camellia(128) Mac=SHA1
DES-CBC3-SHA                  SSLv3   Kx=RSA        Au=RSA   Enc=3DES(168)     Mac=SHA1
IDEA-CBC-SHA                  SSLv3   Kx=RSA        Au=RSA   Enc=IDEA(128)     Mac=SHA1
PSK-AES128-CBC-SHA            SSLv3   Kx=PSK        Au=PSK   Enc=AES(128)      Mac=SHA1
PSK-3DES-EDE-CBC-SHA          SSLv3   Kx=PSK        Au=PSK   Enc=3DES(168)     Mac=SHA1
KRB5-IDEA-CBC-SHA             SSLv3   Kx=KRB5       Au=KRB5  Enc=IDEA(128)     Mac=SHA1
KRB5-DES-CBC3-SHA             SSLv3   Kx=KRB5       Au=KRB5  Enc=3DES(168)     Mac=SHA1
KRB5-IDEA-CBC-MD5             SSLv3   Kx=KRB5       Au=KRB5  Enc=IDEA(128)     Mac=MD5 
KRB5-DES-CBC3-MD5             SSLv3   Kx=KRB5       Au=KRB5  Enc=3DES(168)     Mac=MD5 
ECDHE-RSA-RC4-SHA             SSLv3   Kx=ECDH       Au=RSA   Enc=RC4(128)      Mac=SHA1
ECDHE-ECDSA-RC4-SHA           SSLv3   Kx=ECDH       Au=ECDSA Enc=RC4(128)      Mac=SHA1
ECDH-RSA-RC4-SHA              SSLv3   Kx=ECDH/RSA   Au=ECDH  Enc=RC4(128)      Mac=SHA1
ECDH-ECDSA-RC4-SHA            SSLv3   Kx=ECDH/ECDSA Au=ECDH  Enc=RC4(128)      Mac=SHA1
RC4-SHA                       SSLv3   Kx=RSA        Au=RSA   Enc=RC4(128)      Mac=SHA1
RC4-MD5                       SSLv3   Kx=RSA        Au=RSA   Enc=RC4(128)      Mac=MD5 
PSK-RC4-SHA                   SSLv3   Kx=PSK        Au=PSK   Enc=RC4(128)      Mac=SHA1
KRB5-RC4-SHA                  SSLv3   Kx=KRB5       Au=KRB5  Enc=RC4(128)      Mac=SHA1
KRB5-RC4-MD5                  SSLv3   Kx=KRB5       Au=KRB5  Enc=RC4(128)      Mac=MD5

Wir haben also mit der aktuellen Version von OpenSSL, den für Perfect Forward Secrecy benötigten kryptographischen Algorithmus DH6) sowie den weiterentwickelten ECDH7).

Technisch gesehen unterscheiden sich Zertifikate einer „offiziellen“ oder besser gesagt einer kommerziellen CA nicht von Zertifikaten einer eigenen „self signed“ Zertifikaten. In aller Regel wird dies abhängig davon sein, ob die verwendeten Zertifikate anstandslos von den Clientprogrammen (Mailclients und ggf. Browser) beim Endnutzer akzeptiert werden, also von einer vertrauenswürdigen CA stammen.

Egal welchen Weg wir hier gehen können oder müssen, zur Absicherung unserer Kommunikation benötigen wir drei Dinge:

  1. unseren Private Key, den wir hüten wie unseren Augapfel
  2. unseren Public Key mit zusätzlichen Daten , auch bekannt als CSR8), den wir von einer CA9) signieren lassen. Dies ist das Zertifikat, welches wir von unserer eigenen CA oder auch eine der vielen kommerziellen erhalten, und
  3. den Public Key der unterschreibenden CA, um deren Unterschrift zu prüfen, auch als Root-Zertifikat bekannt.

Nutzt man ein kommerzielle CA können wir die nächsten Kapitel getrost überspringen und gleich damit starten, den nötigen Schlüssel für unser Zertifikat/CSR zu erstellen.

Erstellen einer eigenen CA

Scriptgesteuert erstellen

Dem Paket openssl liegt zwar ein Bash-Script bei, mit dessen Hilfe die nachfolgenden Installationsschritte automatisiert ablaufen sollen, aber zum besseren Verständnis, gehen wir die Schritte kurz manuell durch. Das vorgenante Script aus dem Jahre '96 :-? findet man im Übrigen sonderbarer Weise unter /etc/pki/tls/misc/CA.

# cat /etc/pki/tls/misc/CA
/etc/pki/tls/misc/CA
#!/bin/sh
#
# CA - wrapper around ca to make it easier to use ... basically ca requires
#      some setup stuff to be done before you can use it and this makes
#      things easier between now and when Eric is convinced to fix it :-)
#
# CA -newca ... will setup the right stuff
# CA -newreq ... will generate a certificate request
# CA -sign ... will sign the generated request and output
#
# At the end of that grab newreq.pem and newcert.pem (one has the key
# and the other the certificate) and cat them together and that is what
# you want/need ... I'll make even this a little cleaner later.
#
#
# 12-Jan-96 tjh    Added more things ... including CA -signcert which
#                  converts a certificate to a request and then signs it.
# 10-Jan-96 eay    Fixed a few more bugs and added the SSLEAY_CONFIG
#                  environment variable so this can be driven from
#                  a script.
# 25-Jul-96 eay    Cleaned up filenames some more.
# 11-Jun-96 eay    Fixed a few filename missmatches.
# 03-May-96 eay    Modified to use 'ssleay cmd' instead of 'cmd'.
# 18-Apr-96 tjh    Original hacking
#
# Tim Hudson
# tjh@cryptsoft.com
#
 
# default openssl.cnf file has setup as per the following
# demoCA ... where everything is stored
cp_pem() {
    infile=$1
    outfile=$2
    bound=$3
    flag=0
    exec <$infile;
    while read line; do
	if [ $flag -eq 1 ]; then
		echo $line|grep "^-----END.*$bound"  2>/dev/null 1>/dev/null
		if [ $? -eq 0 ] ; then
			echo $line >>$outfile
			break
		else
			echo $line >>$outfile
		fi
	fi
 
	echo $line|grep "^-----BEGIN.*$bound"  2>/dev/null 1>/dev/null
	if [ $? -eq 0 ]; then
		echo $line >$outfile
		flag=1
	fi
    done
}
 
usage() {
 echo "usage: $0 -newcert|-newreq|-newreq-nodes|-newca|-sign|-verify" >&2
}
 
if [ -z "$OPENSSL" ]; then OPENSSL=openssl; fi
 
if [ -z "$DAYS" ] ; then DAYS="-days 365" ; fi	# 1 year
CADAYS="-days 1095"	# 3 years
REQ="$OPENSSL req $SSLEAY_CONFIG"
CA="$OPENSSL ca $SSLEAY_CONFIG"
VERIFY="$OPENSSL verify"
X509="$OPENSSL x509"
PKCS12="openssl pkcs12"
 
if [ -z "$CATOP" ] ; then CATOP=/etc/pki/CA ; fi
CAKEY=./cakey.pem
CAREQ=./careq.pem
CACERT=./cacert.pem
 
RET=0
 
while [ "$1" != "" ] ; do
case $1 in
-\?|-h|-help)
    usage
    exit 0
    ;;
-newcert)
    # create a certificate
    $REQ -new -x509 -keyout newkey.pem -out newcert.pem $DAYS
    RET=$?
    echo "Certificate is in newcert.pem, private key is in newkey.pem"
    ;;
-newreq)
    # create a certificate request
    $REQ -new -keyout newkey.pem -out newreq.pem $DAYS
    RET=$?
    echo "Request is in newreq.pem, private key is in newkey.pem"
    ;;
-newreq-nodes) 
    # create a certificate request
    $REQ -new -nodes -keyout newreq.pem -out newreq.pem $DAYS
    RET=$?
    echo "Request (and private key) is in newreq.pem"
    ;;
-newca)
    # if explicitly asked for or it doesn't exist then setup the directory
    # structure that Eric likes to manage things
    NEW="1"
    if [ "$NEW" -o ! -f ${CATOP}/serial ]; then
	# create the directory hierarchy
	mkdir -p ${CATOP}
	mkdir -p ${CATOP}/certs
	mkdir -p ${CATOP}/crl
	mkdir -p ${CATOP}/newcerts
	mkdir -p ${CATOP}/private
	touch ${CATOP}/index.txt
    fi
    if [ ! -f ${CATOP}/private/$CAKEY ]; then
	echo "CA certificate filename (or enter to create)"
	read FILE
 
	# ask user for existing CA certificate
	if [ "$FILE" ]; then
	    cp_pem $FILE ${CATOP}/private/$CAKEY PRIVATE
	    cp_pem $FILE ${CATOP}/$CACERT CERTIFICATE
	    RET=$?
	    if [ ! -f "${CATOP}/serial" ]; then
		$X509 -in ${CATOP}/$CACERT -noout -next_serial \
		      -out ${CATOP}/serial
	    fi
	else
	    echo "Making CA certificate ..."
	    $REQ -new -keyout ${CATOP}/private/$CAKEY \
			   -out ${CATOP}/$CAREQ
	    $CA -create_serial -out ${CATOP}/$CACERT $CADAYS -batch \
			   -keyfile ${CATOP}/private/$CAKEY -selfsign \
			   -extensions v3_ca \
			   -infiles ${CATOP}/$CAREQ
	    RET=$?
	fi
    fi
    ;;
-xsign)
    $CA -policy policy_anything -infiles newreq.pem
    RET=$?
    ;;
-pkcs12)
    if [ -z "$2" ] ; then
	CNAME="My Certificate"
    else
	CNAME="$2"
    fi
    $PKCS12 -in newcert.pem -inkey newreq.pem -certfile ${CATOP}/$CACERT \
	    -out newcert.p12 -export -name "$CNAME"
    RET=$?
    exit $RET
    ;;
-sign|-signreq)
    $CA -policy policy_anything -out newcert.pem -infiles newreq.pem
    RET=$?
    cat newcert.pem
    echo "Signed certificate is in newcert.pem"
    ;;
-signCA)
    $CA -policy policy_anything -out newcert.pem -extensions v3_ca -infiles newreq.pem
    RET=$?
    echo "Signed CA certificate is in newcert.pem"
    ;;
-signcert)
    echo "Cert passphrase will be requested twice - bug?"
    $X509 -x509toreq -in newreq.pem -signkey newreq.pem -out tmp.pem
    $CA -policy policy_anything -out newcert.pem -infiles tmp.pem
    RET=$?
    cat newcert.pem
    echo "Signed certificate is in newcert.pem"
    ;;
-verify)
    shift
    if [ -z "$1" ]; then
	    $VERIFY -CAfile $CATOP/$CACERT newcert.pem
	    RET=$?
    else
	for j
	do
	    $VERIFY -CAfile $CATOP/$CACERT $j
	    if [ $? != 0 ]; then
		    RET=$?
	    fi
	done
    fi
    exit $RET
    ;;
*)
    echo "Unknown arg $i" >&2
    usage
    exit 1
    ;;
esac
shift
done
exit $RET

Wichtig:
Zum besseren Verständnis der Zertifikatsthematik, gehen wir die Schritte kurz manuell durch und nutzen nicht das fast 20 jahre alte Script.

manuelle Erstellung unserer eigenen CA

fehlende Dateien anlegen

Als erstes legen wir die noch fehlenden Dateien an.

 # echo "00" > /etc/pki/CA/serial
 # touch /etc/pki/CA/index.txt

Somit befindet sich in unserem Pfad /etc/pki/CA nun folgender Inhalt:

 # ll /etc/pki/CA
total 4
drwxr-xr-x 2 root root 6 Jun 24 14:57 certs
drwxr-xr-x 2 root root 6 Jun 24 14:57 crl
-rw-r--r-- 1 root root 0 Jul 23 14:03 index.txt
drwxr-xr-x 2 root root 6 Jun 24 14:57 newcerts
drwx------ 2 root root 6 Jun 24 14:57 private
-rw-r--r-- 1 root root 3 Jul 23 14:03 serial
CA-Erstellung mit Hilfe von openssl

Die Gültigkeit setzen wir mit 25 Jahren bewusst sehr hoch an. Nach dem Ablauf der Gültigkeit der CA werden nämlich auch alle damit signierten Serverzertifikate ungültig! Bei der nun folgenden Generierung unserer CA wird automatisch ein Schlüssel (private key), mit einer Länge von 2048 Bit, erzeugt und in der Datei cakey.pem abgespeichert. Das CA-Zertifikat selbst wird nach cacert.pem geschrieben.

Zur Sicherheit schützen wir den private key unserer CA mit einer Passphrase! Denn wer den geheimen Schlüssel der CA hat/kennt, könnte damit beliebige Serverzertifikate signieren. Daher legen wir dieses Keyfile nicht im Klartext auf der Festplatte ab, sondern mit einer Passphrase verschlüsselt. Diese Passphrase benötigen wir immer dann, wenn wir mit unser eigenen CA neue Zertifikate ausstellen wollen. Im nachfolgenden Dialog akzetieren wir die Vorgaben in eckigen Klammern, geben unsere individuellen Daten an, oder quittieren ein leeres Feld mittels eines Punktes .. Beim Feld Common Name (CN) geben wir den Domain-Namen unserer Zertifizierungsstelle ein.

Diese Daten werden dem Client angezeigt, sobald dieser aufgefordert wird, das Zertifikat zu akzeptieren oder abzulehnen.

Evolution Warnung

Die Eingaben sind in der Farbe blau und die Rückmeldungen in der Farbe grün gekennzeichnet.

# openssl req -new -x509 -newkey rsa:4096 -keyout cakey.pem -out cacert.pem -days 9125
Generating a 4096 bit RSA private key
..................................................++
....................++
writing new private key to 'cakey.pem'
Enter PEM pass phrase: des-woas-blos-I-und-sundst-koana
Verifying - Enter PEM pass phrase: des-woas-blos-I-und-sundst-koana
-----
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) [XX]:DE
State or Province Name (full name) []:Bayern
Locality Name (eg, city) [Default City]:Pliening
Organization Name (eg, company) [Default Company Ltd]:nausch.org
Organizational Unit Name (eg, section) []:Zertifizierungsstelle
Common Name (eg, your name or your server's hostname) []:nausch.org
Email Address []:ca-support@nausch.org

Als Ergebnis erhalten wir zwei Dateien:

  • cakey.pem den private key unserer CA und
  • cacert.pem das CA-Certifikat unserer CA.
 # ll *.pem
  1. rw-r–r– 1 root root 2171 Jul 23 14:07 cacert.pem
  2. rw-r–r– 1 root root 3394 Jul 23 14:07 cakey.pem

Sichtshalber ändern wir die Rechte so, dass die Schlüsseldateien nur für root lesbar sind:

 # chmod 400 *.pem

Bei Bedarf kann man mit openssl rsa -in <keyfile> -noout -text die Schlüsseldatei öffnen und ausgeben lassen.

 # openssl rsa -in cakey.pem -noout -text
Enter pass phrase for cakey.pem: des-woas-blos-I-und-sundst-koana
Private-Key: (4096 bit)
modulus:
    00:a6:c0:e4:4a:c5:be:6c:c7:fe:8d:20:34:3d:58:
    f5:40:3c:4b:b6:8a:df:3f:2b:cf:c2:9a:d6:0e:1e:
    78:25:93:b1:6e:d4:fe:c4:41:0a:3a:f4:7e:f9:f1:
    f1:a3:2a:b9:c2:b7:86:39:94:4a:16:be:97:e6:92:
    4a:3d:e7:f3:63:46:d4:fb:66:b1:cb:f6:d0:0a:9e:
    04:fd:cc:d0:7f:bd:af:40:01:cb:86:ab:c7:e8:25:
    d8:58:72:66:a7:6e:ab:af:70:a6:07:06:df:a8:86:
    d9:53:75:74:d5:55:a7:4c:7e:4a:55:96:39:0a:97:
    98:eb:b3:58:57:bc:5d:ef:7b:6c:8c:a0:ba:9f:10:
    67:14:f0:4f:2b:7b:b9:72:b9:ff:e2:99:3f:a7:d2:
    91:2c:a2:db:94:e9:bb:90:06:e2:91:06:c7:26:fb:
    23:06:83:b0:60:30:a2:d5:7d:22:95:62:99:42:c3:
    8e:58:44:32:52:29:ad:68:27:bb:ae:5d:99:67:0e:
    10:a0:3c:c0:a6:d4:d5:44:a8:c9:c4:a4:45:12:19:
    46:c3:aa:dc:e5:61:a2:0c:cf:2f:38:f3:6f:5c:13:
    f9:fe:86:c0:4a:ba:2a:9a:4f:25:4d:63:85:e4:6a:
    9d:f1:53:a0:31:64:aa:77:98:b9:0e:63:5c:de:d9:
    04:ed:d0:b7:fa:5b:5d:cc:e4:1e:c4:5b:e3:05:dd:
    79:21:ae:e1:a3:6d:0b:9e:78:fb:d7:67:cc:a4:b2:
    21:44:e1:0a:bc:e1:e9:ab:1d:f2:c8:a9:59:51:3c:
    dd:d9:e4:de:e5:a3:c7:95:83:5a:f5:c1:b1:cb:69:
    f5:fe:a6:8d:91:11:c4:5d:cd:b5:cc:fc:77:60:68:
    aa:3e:92:dc:6f:ac:55:03:82:7a:7d:77:17:00:14:
    4f:e2:b9:d8:87:bc:30:f1:b7:28:1d:a9:6b:25:2c:
    22:28:29:6b:9e:ba:ad:2f:12:77:be:e4:43:69:0f:
    fd:a7:f9:03:21:05:df:f4:eb:90:1c:8e:1e:82:d2:
    81:0d:a1:a9:00:cb:3e:b8:73:39:19:4f:32:cc:dc:
    4e:ea:ab:1c:1b:a1:6d:63:68:a8:3a:67:65:22:ec:
    0c:ea:f7:e6:38:9c:5e:0c:8c:e7:d1:30:fa:53:2d:
    80:2f:19:84:d2:49:17:7f:6d:d5:63:d2:20:3d:ec:
    e6:d7:74:65:e6:cc:be:cb:1b:07:76:96:aa:05:16:
    4e:26:89:ab:42:f1:39:58:2c:af:44:fb:e6:c9:ea:
    46:34:19:8f:6a:d4:59:55:d8:40:d5:a2:39:8e:80:
    ce:9b:6e:42:8f:2f:49:93:24:b5:6c:a5:07:b0:9c:
    f9:25:eb
publicExponent: 65537 (0x10001)
privateExponent:
    45:42:50:8f:8d:da:2d:ac:53:59:a2:4a:90:40:66:
    7c:ab:8e:76:de:ef:22:79:bb:ed:04:0a:6c:0a:d3:
    b4:27:c7:c6:54:c9:0c:12:47:81:7d:13:50:14:e1:
    5b:f7:de:f7:b4:ea:16:f8:34:5d:86:03:e9:4c:51:
    71:ac:e9:36:0e:b1:5f:49:a4:07:27:17:f9:90:f0:
    59:c9:bb:bf:92:b5:3b:4c:83:90:07:c1:1b:f6:bc:
    08:e0:5b:2a:a7:98:bf:61:76:53:ec:d2:f0:58:31:
    e3:ac:21:3e:8a:38:d6:58:8d:df:46:69:a2:b0:9c:
    5f:29:3a:44:16:84:9d:77:11:fa:c6:b7:3c:61:bf:
    ae:be:b0:e3:4a:9c:17:be:91:3d:38:91:6b:ce:d5:
    65:48:af:13:06:91:54:9c:c7:75:9c:ef:12:8d:b4:
    5a:7c:4f:c1:63:f1:fd:e1:df:7f:54:58:7b:96:65:
    84:db:ae:5a:d9:dc:a0:2a:00:95:c7:62:73:9f:2f:
    e0:9d:db:16:6f:c7:b4:a0:b6:4c:ea:3d:95:ea:d1:
    ad:6b:46:1c:2f:94:f2:e5:0a:a4:08:d7:f3:d2:88:
    3e:e3:10:f2:f8:a7:c1:37:a6:32:a2:67:76:1b:a2:
    46:1d:89:a7:7a:3c:23:38:57:84:56:58:b8:66:42:
    d9:27:95:61:cb:1b:39:61:a4:f1:cb:c1:71:ea:3f:
    3b:a3:44:ea:84:77:eb:f6:bb:3e:9e:08:1d:27:91:
    b5:89:cd:ba:97:fc:6a:de:f9:43:9d:e4:a0:b2:b5:
    bd:b7:ea:d7:84:2e:9e:78:5b:fc:27:73:6c:51:40:
    c0:bd:0c:69:3e:4a:c5:ac:15:cb:a8:7c:4a:fa:ee:
    bc:64:94:02:af:da:56:e5:56:9f:79:93:8d:f1:42:
    f7:39:99:dc:82:ab:4b:20:e9:10:da:01:2c:94:be:
    fa:d6:9d:59:e9:fb:b9:b8:af:79:10:25:f9:a4:22:
    1e:4b:03:ac:e7:a1:57:35:d8:e4:49:1b:78:c5:b9:
    1c:3f:30:1c:19:20:2a:b9:0f:90:aa:c1:60:19:ba:
    b5:de:98:c4:68:81:ef:8a:c7:fc:c7:64:85:3a:47:
    a7:97:b7:ec:4d:fe:f9:ce:e9:9a:2f:76:ea:77:0e:
    3e:ac:48:f9:f2:c4:c0:fa:af:f7:09:a6:cb:35:14:
    c6:30:fe:ba:7d:b2:d9:ba:50:9a:84:5c:17:11:65:
    c4:b9:86:c7:db:52:05:b6:66:df:05:e9:17:03:c1:
    02:5b:77:06:0b:7f:5a:a9:f9:01:b7:8d:4a:c3:42:
    d7:cd:80:f3:12:c1:36:e2:bf:08:36:52:d8:c6:79:
    6d:a1
prime1:
    00:dd:13:5d:14:12:93:0e:aa:0b:5f:b2:a7:a8:10:
    5b:0c:cc:41:46:bb:ac:3a:d1:e1:e8:76:4b:1a:49:
    0e:d4:0c:5e:51:75:c4:77:f5:68:dd:26:f2:d1:b6:
    02:77:e2:cf:53:37:a6:f4:a5:b3:dc:26:56:bd:8f:
    3e:b2:22:67:67:dc:a1:70:40:6b:57:33:b4:08:e6:
    d0:f3:a4:dd:b3:0c:17:bc:57:2a:47:9a:fc:c8:0d:
    03:41:b7:56:d6:ce:69:bf:7a:45:5a:72:6c:02:b3:
    70:a7:fa:62:ac:a4:5d:5a:c6:92:5d:84:f4:8f:90:
    3a:d2:4a:79:89:d7:6a:50:41:12:ea:b9:24:e0:96:
    e5:70:62:0a:50:3e:82:cf:56:08:99:47:ba:bf:7b:
    8f:b7:b0:89:b6:06:ea:0e:78:86:5b:e1:32:2f:49:
    61:88:62:29:c3:db:c0:a1:89:1a:66:48:c4:c1:07:
    12:11:2a:ad:73:0a:c2:f3:fa:75:66:88:87:c0:66:
    cc:70:7c:29:96:e1:4b:36:36:7e:73:4c:ba:65:5b:
    c6:07:c1:e1:d0:43:e6:c8:6e:83:ed:67:c2:ce:b4:
    2c:a9:e2:5c:87:24:bb:ad:f0:3c:d7:7a:c7:86:aa:
    d3:e3:f1:24:12:8b:b1:55:3e:a7:77:65:80:75:fe:
    b6:37
prime2:
    00:c1:18:a8:42:3e:47:be:ac:a1:5a:82:06:24:ff:
    15:d6:07:dc:79:94:25:6a:f9:de:63:18:d9:93:ca:
    d8:88:94:8a:d3:7f:f3:2e:6f:1c:64:40:86:e7:3d:
    34:8e:45:c9:f4:dd:1a:17:bb:7f:55:9d:ed:d6:d3:
    73:7e:c5:9d:a8:0f:cd:00:eb:78:9c:0c:4d:77:b5:
    f7:80:e4:5c:ee:84:1b:aa:9f:b9:82:24:b3:e9:cd:
    7e:ee:bb:bf:ce:a0:82:cf:cc:fa:2c:b8:07:fe:79:
    ab:00:41:6a:55:3b:88:6e:5c:53:64:07:c2:2a:78:
    29:a6:c2:5c:5d:77:1d:a1:83:d5:d1:4b:3d:ce:88:
    e4:6f:e8:ff:0b:cb:9e:79:51:63:00:02:5e:2f:fc:
    2d:14:9d:02:e0:eb:88:8b:35:76:94:a9:da:da:a9:
    b6:5b:eb:b2:ff:ad:72:a6:4e:6a:1d:08:36:99:fc:
    63:8b:92:66:c9:0b:af:6d:64:f0:d0:0e:8b:10:2c:
    45:7f:2e:e3:6d:7d:e0:60:69:65:30:0e:25:5b:d8:
    06:00:77:cb:1e:d5:9b:72:34:49:e8:9c:c6:a8:61:
    2d:e0:f8:fe:c7:57:ae:47:79:14:07:22:38:9e:bf:
    44:ec:28:b5:73:73:a4:c1:26:89:b0:71:ee:4e:4e:
    b3:ed
exponent1:
    69:79:e7:9a:c0:11:f1:99:27:bc:0c:dc:f8:ce:74:
    e2:72:41:62:a1:ff:d6:40:74:ec:18:24:54:f2:2e:
    64:f5:51:ba:c3:d9:6c:f2:65:89:be:1f:73:f6:c6:
    ce:b4:23:fe:ac:3a:b7:d6:a7:2d:8e:0d:2c:7b:bf:
    89:f5:e8:28:21:97:d4:9a:a7:9b:ff:4b:12:44:2d:
    c5:51:0f:85:71:6b:91:ac:74:bb:9d:32:a5:af:af:
    b2:16:eb:13:a9:7f:c2:9f:6f:9f:6b:a0:24:d9:c0:
    12:24:e0:17:46:84:53:df:11:ce:14:b5:2a:19:c2:
    36:ba:d9:a9:ee:61:06:d1:45:59:3f:e4:5c:53:22:
    3c:b0:4a:03:67:0f:ba:24:6e:0d:d3:af:41:d4:8e:
    09:31:ed:42:2f:a2:54:2d:24:cd:89:70:0c:27:92:
    a5:23:50:91:e5:b2:ce:5f:3f:7d:35:92:ca:15:b9:
    84:ff:3b:a9:fb:a4:70:0b:3b:20:24:5b:c0:6c:4b:
    76:0f:87:38:39:5d:4d:0c:4a:e0:6f:e7:2e:9c:ce:
    aa:bc:d2:24:2f:81:58:77:81:f2:2e:e3:3f:03:af:
    9b:8e:28:5f:42:23:59:25:99:a1:a5:2e:b5:0d:a3:
    f2:c9:06:50:e2:dd:44:b2:93:eb:df:3d:9f:0e:5b:
    99
exponent2:
    0f:3d:16:ea:43:67:fe:10:39:9b:9e:ef:45:34:2c:
    50:fb:c5:d6:82:6e:81:86:be:9a:2b:77:e0:45:fd:
    d8:a9:80:5b:38:99:c4:6c:58:5d:41:0a:64:6d:5c:
    1c:6e:3d:85:e9:7d:09:aa:6e:5e:1f:5c:89:bb:9e:
    3d:be:f2:b6:34:a9:05:0d:90:33:20:75:6c:a1:1b:
    ab:3c:5a:69:28:5b:d6:97:4c:58:8c:f4:f5:da:95:
    cd:d9:5b:45:bf:3d:13:91:25:9d:29:d8:d7:a8:5a:
    6a:66:bf:31:82:c5:3d:90:63:b4:5d:38:61:89:a2:
    1f:da:ee:d7:21:73:61:2f:ba:4c:0e:18:0e:98:97:
    0e:8d:e0:b2:d9:9a:e4:10:1c:33:ff:fb:d6:e5:9b:
    d9:28:9a:f5:8d:20:f5:7b:7e:a4:34:d3:64:b6:48:
    01:f1:13:eb:41:90:ee:b6:f9:80:d9:09:16:15:e8:
    f5:36:d4:8d:c1:32:52:fb:c8:55:63:10:6e:72:4f:
    f9:bd:85:8d:3a:85:de:95:f2:ba:5c:23:6e:a0:19:
    b9:27:bb:0b:ef:e7:98:97:af:cd:7f:b1:dd:cf:ed:
    82:f7:a3:83:af:d3:bd:28:3d:00:63:1e:fc:c8:33:
    74:3f:b2:32:2e:4a:2e:44:10:51:b0:6c:12:19:fb:
    f1
coefficient:
    00:a6:96:2f:62:1b:35:35:c6:20:ef:a9:8e:66:ac:
    5b:2c:a4:cc:ff:ed:a6:53:ad:9d:e1:cb:73:4e:3c:
    df:08:f8:7a:10:ee:f1:3b:51:52:6a:ba:eb:60:3a:
    72:ee:89:d5:ce:f3:64:bb:44:97:0a:94:25:7f:ce:
    0e:f5:13:33:1e:2c:ba:7e:7e:ec:39:4a:ea:8c:05:
    76:48:59:f2:19:e5:16:37:1f:1d:dc:9e:06:cb:20:
    31:9c:00:61:40:ba:8b:94:c2:68:2c:54:04:a4:5b:
    36:d5:36:dd:cc:64:d8:15:d1:14:0e:de:23:9a:59:
    c3:b3:1d:7c:6d:29:98:6d:b3:11:71:d1:6e:d2:9d:
    01:9a:12:aa:f9:1f:54:f1:d6:0a:b3:ea:1c:b4:cb:
    fb:91:f3:dd:e4:a7:3c:f0:74:f1:c9:e5:42:f2:2d:
    03:b6:a4:ba:34:92:f5:70:f0:ae:34:b3:6f:c4:69:
    3d:14:76:ec:a6:e6:c6:d2:a4:d3:05:30:0e:f8:de:
    46:f1:f6:bc:4d:ba:7c:fe:fa:5d:fa:35:54:df:be:
    b5:08:92:ea:ba:b6:9c:cc:06:77:40:1e:c3:cc:f7:
    6a:4f:56:a7:b3:a9:9a:55:91:55:e0:aa:8e:f7:8d:
    6e:59:26:d7:8e:ea:c8:e1:19:a9:12:c0:43:f7:7d:
    82:f5

Will man die Passphrase eines Schlüssels entfernen, geht man wie folgt vor:

# openssl rsa <cakey.pem >cakey_ohne_passphrase.pem
Enter pass phrase: des-woas-blos-I-und-sundst-koana
writing RSA key

Auch hier sind die Eingaben sind in der Farbe blau, sowie die Rückmeldungen in der Farbe grün gekennzeichnet.

Laufzeit der Zertifikate anpassen

Da wir die Laufzeit der erzeugten Zertifikate nicht auf der Kommandozeile beim Aufruf von openssl angeben können, passen wir in der OpenSSL-Konfigurationsdatei die Laufzeit default_days an.

 # vim /etc/pki/tls/openssl.cnf
/etc/pki/tls/openssl.cnf
#
# OpenSSL example configuration file.
# This is mostly being used for generation of certificate requests.
#
 
# This definition stops the following lines choking if HOME isn't
# defined.
HOME			= .
RANDFILE		= $ENV::HOME/.rnd
 
# Extra OBJECT IDENTIFIER info:
#oid_file		= $ENV::HOME/.oid
oid_section		= new_oids
 
# To use this configuration file with the "-extfile" option of the
# "openssl x509" utility, name here the section containing the
# X.509v3 extensions to use:
# extensions		= 
# (Alternatively, use a configuration file that has only
# X.509v3 extensions in its main [= default] section.)
 
[ new_oids ]
 
# We can add new OIDs in here for use by 'ca', 'req' and 'ts'.
# Add a simple OID like this:
# testoid1=1.2.3.4
# Or use config file substitution like this:
# testoid2=${testoid1}.5.6
 
# Policies used by the TSA examples.
tsa_policy1 = 1.2.3.4.1
tsa_policy2 = 1.2.3.4.5.6
tsa_policy3 = 1.2.3.4.5.7
 
####################################################################
[ ca ]
default_ca	= CA_default		# The default ca section
 
####################################################################
[ CA_default ]
 
dir		= /etc/pki/CA		# Where everything is kept
certs		= $dir/certs		# Where the issued certs are kept
crl_dir		= $dir/crl		# Where the issued crl are kept
database	= $dir/index.txt	# database index file.
#unique_subject	= no			# Set to 'no' to allow creation of
					# several ctificates with same subject.
new_certs_dir	= $dir/newcerts		# default place for new certs.
 
certificate	= $dir/cacert.pem 	# The CA certificate
serial		= $dir/serial 		# The current serial number
crlnumber	= $dir/crlnumber	# the current crl number
					# must be commented out to leave a V1 CRL
crl		= $dir/crl.pem 		# The current CRL
private_key	= $dir/private/cakey.pem# The private key
RANDFILE	= $dir/private/.rand	# private random number file
 
x509_extensions	= usr_cert		# The extentions to add to the cert
 
# Comment out the following two lines for the "traditional"
# (and highly broken) format.
name_opt 	= ca_default		# Subject Name options
cert_opt 	= ca_default		# Certificate field options
 
# Extension copying option: use with caution.
# copy_extensions = copy
 
# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
# so this is commented out by default to leave a V1 CRL.
# crlnumber must also be commented out to leave a V1 CRL.
# crl_extensions	= crl_ext
 
# Django : 2014-07-23
# default: default_days    = 365        # how long to certify for (one year)
default_days	= 730			# how long to certify for (two years)
default_crl_days= 30			# how long before next CRL
default_md	= sha256		# use SHA-256 by default
preserve	= no			# keep passed DN ordering
 
# A few difference way of specifying how similar the request should look
# For type CA, the listed attributes must be the same, and the optional
# and supplied fields are just that :-)
policy		= policy_match
 
# For the CA policy
[ policy_match ]
countryName		= match
stateOrProvinceName	= match
organizationName	= match
organizationalUnitName	= optional
commonName		= supplied
emailAddress		= optional
 
# For the 'anything' policy
# At this point in time, you must list all acceptable 'object'
# types.
[ policy_anything ]
countryName		= optional
stateOrProvinceName	= optional
localityName		= optional
organizationName	= optional
organizationalUnitName	= optional
commonName		= supplied
emailAddress		= optional
 
####################################################################
[ req ]
default_bits		= 2048
default_md		= sha256
default_keyfile 	= privkey.pem
distinguished_name	= req_distinguished_name
attributes		= req_attributes
x509_extensions	= v3_ca	# The extentions to add to the self signed cert
 
# Passwords for private keys if not present they will be prompted for
# input_password = secret
# output_password = secret
 
# This sets a mask for permitted string types. There are several options. 
# default: PrintableString, T61String, BMPString.
# pkix	 : PrintableString, BMPString (PKIX recommendation before 2004)
# utf8only: only UTF8Strings (PKIX recommendation after 2004).
# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings).
# MASK:XXXX a literal mask value.
# WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings.
string_mask = utf8only
 
# req_extensions = v3_req # The extensions to add to a certificate request
 
[ req_distinguished_name ]
countryName			= Country Name (2 letter code)
countryName_default		= XX
countryName_min			= 2
countryName_max			= 2
 
stateOrProvinceName		= State or Province Name (full name)
#stateOrProvinceName_default	= Default Province
 
localityName			= Locality Name (eg, city)
localityName_default		= Default City
 
0.organizationName		= Organization Name (eg, company)
0.organizationName_default	= Default Company Ltd
 
# we can do this but it is not needed normally :-)
#1.organizationName		= Second Organization Name (eg, company)
#1.organizationName_default	= World Wide Web Pty Ltd
 
organizationalUnitName		= Organizational Unit Name (eg, section)
#organizationalUnitName_default	=
 
commonName			= Common Name (eg, your name or your server\'s hostname)
commonName_max			= 64
 
emailAddress			= Email Address
emailAddress_max		= 64
 
# SET-ex3			= SET extension number 3
 
[ req_attributes ]
challengePassword		= A challenge password
challengePassword_min		= 4
challengePassword_max		= 20
 
unstructuredName		= An optional company name
 
[ usr_cert ]
 
# These extensions are added when 'ca' signs a request.
 
# This goes against PKIX guidelines but some CAs do it and some software
# requires this to avoid interpreting an end user certificate as a CA.
 
basicConstraints=CA:FALSE
 
# Here are some examples of the usage of nsCertType. If it is omitted
# the certificate can be used for anything *except* object signing.
 
# This is OK for an SSL server.
# nsCertType			= server
 
# For an object signing certificate this would be used.
# nsCertType = objsign
 
# For normal client use this is typical
# nsCertType = client, email
 
# and for everything including object signing:
# nsCertType = client, email, objsign
 
# This is typical in keyUsage for a client certificate.
# keyUsage = nonRepudiation, digitalSignature, keyEncipherment
 
# This will be displayed in Netscape's comment listbox.
nsComment			= "OpenSSL Generated Certificate"
 
# PKIX recommendations harmless if included in all certificates.
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
 
# This stuff is for subjectAltName and issuerAltname.
# Import the email address.
# subjectAltName=email:copy
# An alternative to produce certificates that aren't
# deprecated according to PKIX.
# subjectAltName=email:move
 
# Copy subject details
# issuerAltName=issuer:copy
 
#nsCaRevocationUrl		= http://www.domain.dom/ca-crl.pem
#nsBaseUrl
#nsRevocationUrl
#nsRenewalUrl
#nsCaPolicyUrl
#nsSslServerName
 
# This is required for TSA certificates.
# extendedKeyUsage = critical,timeStamping
 
[ v3_req ]
 
# Extensions to add to a certificate request
 
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
 
[ v3_ca ]
 
 
# Extensions for a typical CA
 
 
# PKIX recommendation.
 
subjectKeyIdentifier=hash
 
authorityKeyIdentifier=keyid:always,issuer
 
# This is what PKIX recommends but some broken software chokes on critical
# extensions.
#basicConstraints = critical,CA:true
# So we do this instead.
basicConstraints = CA:true
 
# Key usage: this is typical for a CA certificate. However since it will
# prevent it being used as an test self-signed certificate it is best
# left out by default.
# keyUsage = cRLSign, keyCertSign
 
# Some might want this also
# nsCertType = sslCA, emailCA
 
# Include email address in subject alt name: another PKIX recommendation
# subjectAltName=email:copy
# Copy issuer details
# issuerAltName=issuer:copy
 
# DER hex encoding of an extension: beware experts only!
# obj=DER:02:03
# Where 'obj' is a standard or added object
# You can even override a supported extension:
# basicConstraints= critical, DER:30:03:01:01:FF
 
[ crl_ext ]
 
# CRL extensions.
# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL.
 
# issuerAltName=issuer:copy
authorityKeyIdentifier=keyid:always
 
[ proxy_cert_ext ]
# These extensions should be added when creating a proxy certificate
 
# This goes against PKIX guidelines but some CAs do it and some software
# requires this to avoid interpreting an end user certificate as a CA.
 
basicConstraints=CA:FALSE
 
# Here are some examples of the usage of nsCertType. If it is omitted
# the certificate can be used for anything *except* object signing.
 
# This is OK for an SSL server.
# nsCertType			= server
 
# For an object signing certificate this would be used.
# nsCertType = objsign
 
# For normal client use this is typical
# nsCertType = client, email
 
# and for everything including object signing:
# nsCertType = client, email, objsign
 
# This is typical in keyUsage for a client certificate.
# keyUsage = nonRepudiation, digitalSignature, keyEncipherment
 
# This will be displayed in Netscape's comment listbox.
nsComment			= "OpenSSL Generated Certificate"
 
# PKIX recommendations harmless if included in all certificates.
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
 
# This stuff is for subjectAltName and issuerAltname.
# Import the email address.
# subjectAltName=email:copy
# An alternative to produce certificates that aren't
# deprecated according to PKIX.
# subjectAltName=email:move
 
# Copy subject details
# issuerAltName=issuer:copy
 
#nsCaRevocationUrl		= http://www.domain.dom/ca-crl.pem
#nsBaseUrl
#nsRevocationUrl
#nsRenewalUrl
#nsCaPolicyUrl
#nsSslServerName
 
# This really needs to be in place for it to be a proxy certificate.
proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo
 
####################################################################
[ tsa ]
 
default_tsa = tsa_config1	# the default TSA section
 
[ tsa_config1 ]
 
# These are used by the TSA reply generation only.
dir		= ./demoCA		# TSA root directory
serial		= $dir/tsaserial	# The current serial number (mandatory)
crypto_device	= builtin		# OpenSSL engine to use for signing
signer_cert	= $dir/tsacert.pem 	# The TSA signing certificate
					# (optional)
certs		= $dir/cacert.pem	# Certificate chain to include in reply
					# (optional)
signer_key	= $dir/private/tsakey.pem # The TSA private key (optional)
 
default_policy	= tsa_policy1		# Policy if request did not specify it
					# (optional)
other_policies	= tsa_policy2, tsa_policy3	# acceptable policies (optional)
digests		= sha1, sha256, sha384, sha512	# Acceptable message digests (mandatory)
accuracy	= secs:1, millisecs:500, microsecs:100	# (optional)
clock_precision_digits  = 0	# number of digits after dot. (optional)
ordering		= yes	# Is ordering defined for timestamps?
				# (optional, default: no)
tsa_name		= yes	# Must the TSA name be included in the reply?
				# (optional, default: no)
ess_cert_id_chain	= no	# Must the ESS cert id chain be included?
				# (optional, default: no)

Schlüssel für das Serverzertifikat erzeugen

Nachdem wir nun unsere eigene CA erstellt haben, machen wir uns daran, endlich für unseren Server ein Zertifikat herausgeben. Hierzu erzeugen wir als erstes einen 4096 Bit langen RSA Schlüssel, den wir mit AES 256 verschlüsselt auf der Platte abgelegt lassen. Da OpenSSL keine leere Passphrase zulässt braucht die Passphrase diesmal nicht sonderlich geheim sein, da wir diese im Anschluss ohnehin sofort wieder entfernen werden. Alternativ können wir natürlich auch eine Passphrase vergeben und dieses Passwort dann in der Konfigurationsdatei /etc/dovecot/conf.d/10-ssl.conf beim Konfigurationsparameter ssl_key_password hinterlegen.

Die Eingaben sind in der Farbe blau und die Rückmeldungen in der Farbe grün gekennzeichnet.

# openssl genrsa -out serverkey.pem -aes256 4096 -days 7300
Generating RSA private key, 4096 bit long modulus
.......................................................................................................................................................................................................................++
........................................................................................................................................................................................++
e is 65537 (0x10001)
Enter pass phrase for serverkey.pem: 12qwasyx
Verifying - Enter pass phrase for serverkey.pem: 12qwasyx

Wie schon erwähnt, entfernen wir die Passphrase nun wieder, in dem wir bei der Frage Enter pass phrase: einfach die Taste [ENTER] drücken.

# openssl rsa -in serverkey.pem -out serverkey_2.pem
Enter pass phrase:
writing RSA key

Wie schon zuvor schützen wir auch hier den Serverschlüssel über die Dateirechte, nachdem wir diesen umbenannt haben.

# mv serverkey_2.pem serverkey.pem -f
# chmod 400 serverkey.pem

Certificate Signing Request erzeugen

Im folgenden Schritt zu unserem eigenen Zertifikat erzeugen wir einen CSR10), den wir dann in einem weiteren Schritt von unserer eigenen CA signieren lassen werden, oder bei der ausgewählten kommerziellen CA einkippen.

Wichtig: Bei unserem Serverzertifikat ist der Common Name von entscheidender Bedeutung. Hier muss der DNS-Name unseres Dovecot-Servers eingetragen werden, unter dem der Mailserver angesprochen wird!

Auch hier sind die Eingaben in der Farbe blau und die Rückmeldungen in der Farbe grün gekennzeichnet.

# openssl req -new -key serverkey.pem -out csr.pem -nodes
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) [XX]:DE
State or Province Name (full name) []Bayern
Locality Name (eg, city) [Default City]:Pliening
Organization Name (eg, company) [Default Company Ltd]:nausch.org
Organizational Unit Name (eg, section) []:Postoffice
Common Name (eg, your name or your server's hostname) []:mail.nausch.org
Email Address []:postmaster@nausch.org

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Wollen oder müssen wir ein kommerzielles Zertifikat, also von einer in den Browsern und mailclients von Haus aus installierten CAs, nutzen, so lassen wir den CSR der CA zukommen.

 # cat csr.pem
-----BEGIN CERTIFICATE REQUEST-----
MIIE4TCCAskCAQAwgZsxCzAJBgNVBAYTAkRFMQ8wDQYDVQQIDAZCYXllcm4xETAP
BgNVBAcMCFBsaWVuaW5nMRMwEQYDVQQKDApuYXVzY2gub3JnMRMwEQYDVQQLDApQ
b3N0b2ZmaWNlMRgwFgYDVQQDDA9tYWlsLm5hdXNjaC5vcmcxJDAiBgkqhkiG9w0B
CQEWFXBvc3RtYXN0ZXJAbmF1c2NoLm9yZzCCAiIwDQYJKoZIhvcNAQEBBQADggIP
ADCCAgoCggIBAJdbTDxgm4j1NAQjx3Lynu9E748Fntw3ercL3iwvdbyyw3/MlFAA
v1cfP5T0g7Vgl2UbIUK1tQzcaCN38J2r+9BcxOqk4sh9WOI2ZpZOzMLMYWWtuGak
ieIXH9Bmp/Iwgd2ddpo1Aa+Q/44lHhbN2UPJyG65S+UOFNO8Z6SGWEi/T6mcX9yn
AOvYlS8bIORGmV3aJtwt+9vu3qBFomwgU5Wz76E5vKrRxtpQJumQjnJup/2taCVP
ZtvasYNXP2ZgY4fKD0j24oU8XmpyjRc51vGcqk8UeagYRyrqEcqOMZGbC7WnugS4
yVFU+PAvR2SoAyRAXDeZBRXygxW/d2aWobOoXbOrY7cFVXS28R/z3LBg4LlWLzSA
BNBJdrNAg6HSeF6NGiSesPakIfY4w2u2Syv2+IUqWwtGxhpvn8zhnBY+PQEct7dz
rgsX7eT2/4lc9XQWUlzt+s5JGzlGNWqYvyZY/AUZ2Z4mTzR2nrx7RRQekHP94sk0
D/kDb6hzp9cpI1SRP5/r3u05z9J8mw2RabhAdoAyFG4maf/9i7LBZ3D08tNGIx4u
SLRlpkxfdEs67k/lXKHu/rTWFNqPfNY/49syYAN8J56hsVCkh5/L/deRMxCcLWr0
gbW1cuCeFDm6Abl1qW4s7qcu05ZADtXthWBTvbVC1P3aotzDWCVClGizAgMBAAGg
ADANBgkqhkiG9w0BAQsFAAOCAgEAD+1+9NQMWfOnIFjgZWRf4eQpT7kJZxuA+bYW
63HA0EPe7FURWqbJfSL8RQdEaT42MzNeSXVTSfhbe4CsVB3ta2xoqQOEhiOQSDLz
zgIF2+PxexV1a8BSw/8pm4KtwnCUTeNxe4+TQhsUxEkc12QHAOTMp2lSmRUFo4FZ
WQ/Quq/u7Q+7+IeqJBGPNRRMLCW70CretEpMfCzZujmiMb0c1fV3RqcfJgA3jkd7
ZC8llcF4qVQKzqFMv7gYc8F1ckD1ch11H3q7CjrfzHYbiUS8rHaiSjHG48k+Uqwj
ndArSDug4mQNazI/bkpOigZAGI0F6g5FDyj5/YYvd2UaDcNqIaYgHJFXmsQi675f
icPCIsaCSu0TkvUWyGJRUILoA1mBjnnFV9H9z9NW6Ttsm86MGyve3Va3xrknkGCB
YX0U+4SObf2CONB5UC/ztzqcMvjJ+BOPuVIRfFNxQIOoVlug6DYcBgIbnZyX3QYA
FF6oDA7wsbG+Oub1fHeo75m1O0G+MHzTwbJq0IKcPV5rsX+PFAa7qRMbYhlG0V+i
ji99uAL3jgCUxq670avy9vVanj96/CjXS0v9tcp+g6Sr63VFsV43hsh0ExmmLQZ2
UAcbeW4+RoAly/Bp/r2CgqMtj4E2v7ccjOpWO+4gTkr3SX5SPFW5OvbhycrUS34H
StvlMGo=
-----END CERTIFICATE REQUEST-----

Bei Interesse können wir uns unseren CSR auch ansehen, dazu benutzen wir folgenden Befehl:

 # openssl req -noout -text -in csr.pem
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=DE, ST=Bayern, L=Pliening, O=nausch.org, OU=Postoffice, CN=mail.nausch.org/emailAddress=postmaster@nausch.org
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (4096 bit)
                Modulus:
                    00:97:5b:4c:3c:60:9b:88:f5:34:04:23:c7:72:f2:
                    9e:ef:44:ef:8f:05:9e:dc:37:7a:b7:0b:de:2c:2f:
                    75:bc:b2:c3:7f:cc:94:50:00:bf:57:1f:3f:94:f4:
                    83:b5:60:97:65:1b:21:42:b5:b5:0c:dc:68:23:77:
                    f0:9d:ab:fb:d0:5c:c4:ea:a4:e2:c8:7d:58:e2:36:
                    66:96:4e:cc:c2:cc:61:65:ad:b8:66:a4:89:e2:17:
                    1f:d0:66:a7:f2:30:81:dd:9d:76:9a:35:01:af:90:
                    ff:8e:25:1e:16:cd:d9:43:c9:c8:6e:b9:4b:e5:0e:
                    14:d3:bc:67:a4:86:58:48:bf:4f:a9:9c:5f:dc:a7:
                    00:eb:d8:95:2f:1b:20:e4:46:99:5d:da:26:dc:2d:
                    fb:db:ee:de:a0:45:a2:6c:20:53:95:b3:ef:a1:39:
                    bc:aa:d1:c6:da:50:26:e9:90:8e:72:6e:a7:fd:ad:
                    68:25:4f:66:db:da:b1:83:57:3f:66:60:63:87:ca:
                    0f:48:f6:e2:85:3c:5e:6a:72:8d:17:39:d6:f1:9c:
                    aa:4f:14:79:a8:18:47:2a:ea:11:ca:8e:31:91:9b:
                    0b:b5:a7:ba:04:b8:c9:51:54:f8:f0:2f:47:64:a8:
                    03:24:40:5c:37:99:05:15:f2:83:15:bf:77:66:96:
                    a1:b3:a8:5d:b3:14:12:19:72:55:74:b6:f1:1f:f3:
                    dc:b0:60:e0:b9:56:2f:34:80:04:d0:49:76:b3:40:
                    83:a1:d2:78:5e:8d:1a:24:9e:b0:f6:a4:21:f6:38:
                    c3:6b:b6:4b:2b:f6:f8:85:2a:5b:0b:46:c6:1a:6f:
                    9f:cc:e1:9c:16:3e:3d:01:1c:b7:b7:73:ae:0b:17:
                    ed:e4:f6:ff:89:5c:f5:74:16:52:5c:ed:fa:ce:49:
                    1b:39:46:35:6a:98:bf:26:58:fc:05:19:d9:9e:26:
                    4f:34:76:9e:bc:7b:45:14:1e:90:73:fd:e2:c9:34:
                    0f:f9:03:6f:a8:73:a7:d7:29:23:54:91:3f:9f:eb:
                    de:ed:39:cf:d2:7c:9b:0d:91:69:b8:40:76:80:32:
                    14:6e:26:69:ff:fd:8b:b2:c1:67:70:f4:f2:d3:46:
                    23:1e:2e:48:b4:65:a6:4c:5f:74:4b:3a:ee:4f:e5:
                    5c:a1:ee:fe:b4:d6:14:da:8f:7c:d6:3f:e3:db:32:
                    60:03:7c:27:9e:a1:b1:50:a4:87:9f:cb:fd:d7:91:
                    33:10:9c:2d:6a:f4:81:b5:b5:72:e0:9e:14:39:ba:
                    01:b9:75:a9:6e:2c:ee:a7:2e:d3:96:40:0e:d5:ed:
                    85:60:53:bd:b5:42:d4:fd:da:a2:dc:c3:58:25:42:
                    94:68:b3
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: sha256WithRSAEncryption
         0f:ed:7e:f4:d4:0c:59:f3:a7:20:58:e0:65:64:5f:e1:e4:29:
         4f:b9:09:67:1b:80:f9:b6:16:eb:71:c0:d0:43:de:ec:55:11:
         5a:a6:c9:7d:22:fc:45:07:44:69:3e:36:33:33:5e:49:75:53:
         49:f8:5b:7b:80:ac:54:1d:ed:6b:6c:68:a9:03:84:86:23:90:
         48:32:f3:ce:02:05:db:e3:f1:7b:15:75:6b:c0:52:c3:ff:29:
         9b:82:ad:c2:70:94:4d:e3:71:7b:8f:93:42:1b:14:c4:49:1c:
         d7:64:07:00:e4:cc:a7:69:52:99:15:05:a3:81:59:59:0f:d0:
         ba:af:ee:ed:0f:bb:f8:87:aa:24:11:8f:35:14:4c:2c:25:bb:
         d0:2a:de:b4:4a:4c:7c:2c:d9:ba:39:a2:31:bd:1c:d5:f5:77:
         46:a7:1f:26:00:37:8e:47:7b:64:2f:25:95:c1:78:a9:54:0a:
         ce:a1:4c:bf:b8:18:73:cf:4a:3b:32:a6:5c:4e:81:1f:7a:bb:
         0a:3a:df:cc:76:1b:89:44:bc:ac:76:a2:4a:31:c6:e3:c9:3e:
         52:ac:23:9d:d0:2b:48:3b:a0:e2:64:0d:6b:32:3f:6e:4a:4e:
         8a:06:40:18:8d:05:ea:0e:45:0f:28:f9:fd:86:2f:77:65:1a:
         0d:c3:6a:21:a6:20:1c:91:57:9a:c4:22:eb:be:5f:89:c3:c2:
         22:c6:82:4a:ed:13:92:f5:16:c8:62:51:50:82:e8:03:59:81:
         8e:79:c5:57:d1:fd:cf:d3:56:e9:3b:6c:9b:ce:8c:1b:2b:de:
         dd:56:b7:c6:b9:27:90:60:81:61:7d:14:fb:84:8e:6d:fd:82:
         38:d0:79:50:2f:f3:b7:3a:9c:32:f8:c9:f8:13:8f:b9:52:11:
         7c:53:71:40:83:a8:56:5b:a0:e8:36:1c:06:02:1b:9d:9c:97:
         dd:06:00:14:5e:a8:0c:0e:f0:b1:b1:be:3a:e6:f5:7c:77:a8:
         ef:99:b5:3b:41:be:14:08:19:67:b2:6a:d0:82:9c:3d:5e:6b:
         b1:7f:8f:14:06:bb:a9:13:1b:62:19:46:d1:5f:a2:8e:2f:7d:
         b8:02:f7:8e:00:94:c6:ae:bb:d1:ab:f2:f6:f5:5a:9e:3f:7a:
         fc:28:d7:4b:4b:fd:b5:ca:7e:83:a4:ab:eb:75:45:b1:5e:37:
         86:c8:74:13:19:a6:2d:06:76:50:07:1b:79:6e:3e:46:80:25:
         cb:f0:69:fe:bd:82:82:a3:2d:8f:81:36:bf:b7:1c:8c:ea:56:
         3b:ee:20:4e:4a:f7:49:7e:52:3c:55:b9:3a:f6:e1:c9:ca:d4:
         4b:7e:07:4a:db:e5:30:6a

eigene CA: CSR beabeiten - Zertifikat erstellen

Kommen wir zum krönenden Abschluss - wir signieren nun das Server-Zertifikat durch unsere CA, oder anders ausgedrückt, wir erstellen das benötigte X.509-Serverzertifikat.

Wie schon bereits bei den anderen Konfigurationsbeispielen, sind auch hier die Eingaben in der Farbe blau und die Rückmeldungen in der Farbe grün gekennzeichnet.

# openssl ca -in csr.pem -notext -out servercert.pem
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem: des-woas-blos-I-und-sundst-koana
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 0 (0x0)
        Validity
            Not Before: Jul 23 13:00:41 2014 GMT
            Not After : Jul 22 13:00:41 2016 GMT
        Subject:
            countryName               = DE
            stateOrProvinceName       = Bayern
            organizationName          = nausch.org
            organizationalUnitName    = Postoffice
            commonName                = mail.nausch.org
            emailAddress              = postmaster@nausch.org
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                43:98:32:9B:BA:65:AD:14:08:67:FB:B0:B1:BD:BD:57:A8:B4:3D:C9
            X509v3 Authority Key Identifier: 
                keyid:19:F5:FD:B1:D1:98:4B:E3:E8:26:CD:55:CB:14:08:19:67:9E:78:16

Certificate is to be certified until Jul 22 13:00:41 2016 GMT (730 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

Speicherort

Bei der Dovecot-Installation wurde bereits der Unterordner für das Dovecot-Zertifikates und der zugehörigen Schlüssel-Datei unter /etc/pki angelegt.

/etc/pki/dovecot/
├── certs
│   └── servercert_2014-08-14.pem
├── dovecot-openssl.cnf
└── private
    └── dovecot.pem

Anschließend legen wir dort die drei benötigten Dateien ab:

  1. unseren Serverzertifikat : servercert.pem
     # mv /etc/pki/CA/servercert.pem /etc/pki/dovecot/certs/servercert_2014-08-14.pem
  2. unseren Serverschlüssel : serverkey.pem
     # mv /etc/pki/CA/serverkey.pem /etc/pki/dovecot/private/serverkey_2014-08-14.pem
  3. das CA-Zertifikat : cacert.pem
     # cp /etc/pki/CA/cacert.pem /etc/pki/dovecot/certs/
  4. und schützen diese Dateien mit den Dateirechten 400:
     # chmod 400 /etc/pki/dovecot/private/*.pem
     # chmod 400 /etc/pki/dovecot/certs/*.pem

Zertifikatsketten

Handelt es sich bei der CA um eine mehrstufige CA, so hat man nicht nur ein Zertifikatsfile der RootCA, sondern auch weitere, wie z.B. ein Zwischenzertifikat.

Damit Dovecot mit solchen Zertifikaten umgehen kann, ist es notwendig, dass die einzelnen Inhalte der Zertifikats-Dateien in eine gemeinsame Datei kopiert werden. Folgende Reihenfolge ist dabei dringend einzuhalten:

  1. Dovecot's public certificate
  2. TDC SSL Server CA
  3. TDC Internet Root CA
  4. Globalsign Partners CA
 # less /etc/pki/dovecot/certs/CAcert_bundle_2014-12-14.pem
-----BEGIN CERTIFICATE-----
MIIFKjCCBBKgAwIBAgIDEdPpMA0GCSqGSIb3DQEBCwUAMDwxCzAJBgNVBAYTAlVT
MRcwFQYDVQQKEw5HZW9UcnVzdCwgSW5jLjEUMBIGA1UEAxMLUmFwaWRTU0wgQ0Ew
HhcNMTQwNDA4MDMyNTAyWhcNMTYwNjAyMDEzODU0WjCBuzEpMCcGA1UEBRMgM1M3
eDJsY2JZaUFjY0taUG9oYTBNU3dQNWhOc3VTVFAxEzARBgNVBAsTCkdUNDk0NDc5
NTExMTAvBgNVBAsTKFNlZSB3d3cucmFwaWRzc2wuY29tL3Jlc291cmNlcy9jcHMg
KGMpMTMxLzAtBgNVBAsTJkRvbWFpbiBDb250cm9sIFZhbGlkYXRlZCAtIFJhcGlk
U1NMKFIpMRUwEwYDVQQDDAwqLm5hdXNjaC5vcmcwggEiMA0GCSqGSIb3DQEBAQUA
A4IBDwAwggEKAoIBAQDRhxUen7499yElJr2cOIPdg4u/E93rgFw3DhflaV54r8G3
oA1U+brU7XNpnRVA+QHk1aXTnROwGX46mlxacKOQPE0U9dXMRFrWfnCcOCgUqkjY
vQdivwKUOJqfJfef0Zun4C7LabfP/Gb5TkFUC7+Hq3jzoZnifleRuK+2MZXX05/E
+T5jKrVsanfh2bN6WKgzwvmPaurpelA1f5ciiaWcuXtTc8Hrshyko30IeyIxAJ2J
aj3zHKEjuTMNn/fsMOOFO0LG2T68Wc9gFRa0ds1LXFbuwOxi1i/dLRWDFhGZtplp
HOBlYBkwnEawpsHS+nQVEc2d7CFCBWr2MCSQLQQvAgMBAAGjggGzMIIBrzAfBgNV
HSMEGDAWgBRraT1qGEJK3Y8CZTn9NSSGeJEWMDAOBgNVHQ8BAf8EBAMCBaAwHQYD
VR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMCMGA1UdEQQcMBqCDCoubmF1c2No
Lm9yZ4IKbmF1c2NoLm9yZzBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vcmFwaWRz
c2wtY3JsLmdlb3RydXN0LmNvbS9jcmxzD4n90154g33K1mNybDAdBgNVHQ4EFgQU
HjMj1hUDkcufmSmgDVeMt7sdoAkwDAYDVR0TAQH/BAIwADB4BggrBgEFBQcBAQRs
MGowLQYIKwYBBQUHMAGGIWh0dHA6Ly9yYXBpZHNzbC1vY3NwLmdlb3RydXN0LmNv
bTA5BggrBgEFBQcwAoYtaHR0cDovL3JhcGlkc3NsLWFpYS5nZW90cnVzdC5jb20v
cmFwaWRzc2wuY3J0MEwGA1UdIARFMEMwQQYKYIZIAYb4RQEHNjAzMDEGCCsGAQUF
BwIBFiVodHRwOi8vd3d3Lmdlb3RydXN0LmNvbS9yZXNvdXJjZXMvY3BzMA0GCSqG
SIb3DQEBCwUAA4IBAQACZLmO7zRHC4zEXyXCHpIgZ/TIo8sdvGzDH2koZgU0ZlCR
psebPpulKDr2Q6JYVPsS6z7sqw9SNCmVjeRngIgCpuih7DGUzrc7YzPw4vmGTgND
KTCQ8B3TqjYak3pG3LUUwsSIL1//oSuYKkdClmpNgFgYJegVdXrE3+EjuoLq5wwb
xsGzO1KW5olUX7J4IwZbnE5ZRrhF+UIRtj1yPx2fqXOBGuqGdhZ4pTrsY20e6mJJ
4ZOK0RY0MFy1JN3cWAsL5mR3wZwLeUYXnwSHKqWHE0TjJcy5X6sLZP5IoOt61vu1
7Zv1GcT4i3a/8uGGAGINouL3WmdqQ5Uj5qyhceli
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIID1TCCAr2gAwIBAgIDAjbRMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
YWwgQ0EwHhcNMTAwMjE5MjI0NTA1WhcNMjAwMjE4MjI0NTA1WjA8MQswCQYDVQQG
EwJVUzEXMBUGA1UEChMOR2VvVHJ1c3QsIEluYy4xFDASBgNVBAMTC1JhcGlkU1NM
IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx3H4Vsce2cy1rfa0
l6P7oeYLUF9QqjraD/w9KSRDxhApwfxVQHLuverfn7ZB9EhLyG7+T1cSi1v6kt1e
6K3z8Buxe037z/3R5fjj3Of1c3/fAUnPjFbBvTfjW761T4uL8NpPx+PdVUdp3/Jb
ewdPPeWsIcHIHXro5/YPoar1b96oZU8QiZwD84l6pV4BcjPtqelaHnnzh8jfyMX8
N8iamte4dsywPuf95lTq319SQXhZV63xEtZ/vNWfcNMFbPqjfWdY3SZiHTGSDHl5
HI7PynvBZq+odEj7joLCniD4n90154g33K1efDp6E63yoxhbK1kPzVw662gzxigd
gtFQiwIDAQABo4HZMIHWMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUa2k9ahhC
St2PAmU5/TUkhniRFjAwHwYDVR0jBBgwFoAUwHqYaI2J+6sFZAwRfap9ZbjKzE4w
EgYDVR0TAQH/BAgwBgEB/wIBADA6BgNVHR8EMzAxMC+gLaArhilodHRwOi8vY3Js
Lmdlb3RydXN0LmNvbS9jcmxzL2d0Z2xvYmFsLmNybDA0BggrBgEFBQcBAQQoMCYw
JAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmdlb3RydXN0LmNvbTANBgkqhkiG9w0B
AQUFAAOCAQEAq7y8Cl0YlOPBscOoTFXWvrSY8e48HM3P8yQkXJYDJ1j8Nq6iL4/x
/torAsMzvcjdSCIrYA+lAxD9d/jQ7ZZnT/3qRyBwVNypDFV+4ZYlitm12ldKvo2O
SUNjpWxOJ4cl61tt/qJ/OCjgNqutOaWlYsS3XFgsql0BYKZiZ6PAx2Ij9OdsRu61
04BqIhPSLT90T+qvjF+0OJzbrs6vhB6m9jRRWXnT43XcvNfzc9+S7NIgWW+c+5X4
knYYCnwPLKbK3opie9jzzl9ovY8+wXS7FXI6FoOpC+ZNmZzYV+yoAVHHb1c0XqtK
LEL2TxyJeN4mTvVvk0wVaydWTQBUbHq3tw==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
MPRfwCvocWvk+QIDAQABo1MwUTAD4n90154g33K1BTADAQH/MB0GA1UdDgQWBBTA
ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
-----END CERTIFICATE-----

SSL-Konfiguration

Damit nun unser Dovecot Server auch SSL/TLS spricht, müssen wir in der Konfigurationsdatei /etc/dovecot/conf.d/10-ssl.conf ein paar Änderungen vornehmen. Wichtige Informationen zur SSL/TLS-Konfiguration sind im Dovecot-Wiki zu finden! Der Inhalt der Schlüssel- und Zertifikatsdatei werden dynamisch beim Start von Dovecot zur Konfiguration geladen. In chroot-Umgebungen engtstehen so keine Probleme beim Zugriff auf die beiden Dateien durch den Laufzeit-Benutzer entstehen.

 # vim /etc/dovecot/conf.d/10-ssl.conf
/etc/dovecot/conf.d/10-ssl.conf
##                                                                        
## SSL settings                                                           
##                                                                        
 
# SSL/TLS support: yes, no, required. <doc/wiki/SSL.txt>
# disable plain pop3 and imap, allowed are only pop3+TLS, pop3s, imap+TLS and imaps
# plain imap and pop3 are still allowed for local connections                      
ssl = required                                                                     
 
# PEM encoded X.509 SSL/TLS certificate and private key. They're opened before
# dropping root privileges, so keep the key file unreadable by anyone but     
# root. Included doc/mkcert.sh can be used to easily generate self-signed     
# certificate, just make sure to update the domains in dovecot-openssl.cnf    
# Django : 2015-06-09                                                         
# old    : ssl_cert = </etc/pki/dovecot/certs/dovecot.pem                     
#          ssl_key = </etc/pki/dovecot/private/dovecot.pem                    
ssl_cert = </etc/pki/dovecot/certs/imap.nausch.org.cert_bundle.2015-06-09.pem
ssl_key = </etc/pki/dovecot/private/serverkey_2015-06-09.pem                 
 
# If key file is password protected, give the password here. Alternatively
# give it when starting dovecot with -p parameter. Since this file is often
# world-readable, you may want to place this setting instead to a different
# root owned 0600 file by using ssl_key_password = <path.                  
#ssl_key_password =                                                        
 
# PEM encoded trusted certificate authority. Set this only if you intend to use
# ssl_verify_client_cert=yes. The file should contain the CA certificate(s)
# followed by the matching CRL(s). (e.g. ssl_ca = </etc/pki/dovecot/certs/ca.pem)
#ssl_ca =
 
# Require that CRL check succeeds for client certificates.
#ssl_require_crl = yes
 
# Directory and/or file for trusted SSL CA certificates. These are used only
# when Dovecot needs to act as an SSL client (e.g. imapc backend). The
# directory is usually /etc/pki/dovecot/certs in Debian-based systems and the file is
# /etc/pki/tls/cert.pem in RedHat-based systems.
#ssl_client_ca_dir =
#ssl_client_ca_file =
 
# Request client to send a certificate. If you also want to require it, set
# auth_ssl_require_client_cert=yes in auth section.
#ssl_verify_client_cert = no
 
# Which field from certificate to use for username. commonName and
# x500UniqueIdentifier are the usual choices. You'll also need to set
# auth_ssl_username_from_cert=yes.
#ssl_cert_username_field = commonName
 
# DH parameters length to use.
# Django : 2015-05-21
# default: ssl_dh_parameters_length = 1024
ssl_dh_parameters_length=4096
 
# Weekly regeneration of the ssl-parameters
# Django : 2015-06-10
# default: ssl_parameters_regenerate = 0
#          ssl_parameters_regenerate = 2 hours
#          Won't work since dovecot 2.2!
#          Update ssl_dh_parameters_length with script dh-params
#          https://dokuwiki.nausch.org/doku.php/centos:mail_c7:dovecot_4?&#diffie-hellman-verfahren_und_perfect_forward_secrecy
 
# SSL protocols to use
# Django : 2014-10-16
# default: #ssl_protocols = !SSLv2
ssl_protocols = !SSLv2 !SSLv3
 
# SSL ciphers to use
# Django : 2014-10-16
# default: #ssl_cipher_list = ALL:!LOW:!SSLv2:!EXP:!aNULL
ssl_cipher_list = EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4
 
# Prefer the server's order of ciphers over client's.
# Django : 2015-05-20
# default: #ssl_prefer_server_ciphers = no
ssl_prefer_server_ciphers = yes
 
# SSL crypto device to use, for valid values run "openssl engine"
#ssl_crypto_device =

Über den Paramter ssl kann man steuern, ob SSL/TLS nun verwendet werden kann, oder ob es verwendet werden muss, oder eben nicht. Wir lassen den Default-Wert required stehen, was bedeutet, dass den Clients SSL/TLS als zwingend vorgeschrieben ist. Ein yes setzt die Transportverschlüsselung als optional und ein no deaktiviert die Transportverschlüsselung gar ganz, aber wer will das seinen Endkunden in Zeiten vob NSA, BND und Tempora noch guten Gewissens verkaufen?

Diffie-Hellman-Verfahren und Perfect Forward Secrecy

Wie am Anfang des Artikels bereits angeschnitten, basiert Perfect Forward Secrecy (PFS) auf der Idee, dass Client und Server ihre Kommunikation über einen zusätzlichen temporären Schlüssel absichern, der wechselt.

Dovecot stellt das normale DHE-Verfahren bereits ab Version 2.1.x und das wesentlich bessere und performantere ECDHE-Verfahren ab 2.2.x zur Verfügung.

Wichtig:

Die Diffie-Hellman-Parameter werden beim ersten Start des Dovecot-Daemon erzeugt und in der Datei /var/lib/dovecot/ssl-parameters.dat abgelegt.

Entgegen den Angaben im Abschnitt SSL security settings im Dovecot WIKI wird die Parameterdatei nicht wöchentlich erneuert! Diese Funktion wurde ab Dovecot-Version 2.2.7 nicht mehr bereitgestellt.

Die Hintergründe und die Lösung zu diesem Problem, basieren auf den Hinweisen von Andreas Schulze, dem hier ein ausdrücklicher Dank gebührt!

Wir werden also das Wechseln der Diffie-Hellman-Parameter werden wir also selbst in die Hand nehmen. Dies erfolgt in zwei Schritten.

  1. Parameterdatei erstellen und
  2. Dovecot die neuen Parameter bekanntgeben

Die Erzeugung der DH-Parameter-Datei erfolgt mit Hilfe des Programms ssl-params aus dem Verzeichnis /usr/libexec/dovecot/. Diesem Binary müssen wir angeben, welche Parameter-Länge ssl_dh_parameters_length verwendet werden und wo die Parameter-Datei state_dir gespeichert werden soll. Hierzu legen wir uns eine Konfigurationsdatei an.

 # vim /etc/dovecot/ssl-params.conf
/etc/dovecot/ssl-params.conf
# Django : 2015-06-09
#          Länge der Diffie-Hellman-Parameter, diese muss der Länge des privaten RSA-Schlüssels entsprechen
ssl_dh_parameters_length = 4096
#
#          Speicherort der Diffie-Hellman-Parameter-Datei ssl-parameters.dat
state_dir = /var/lib/dovecot/tmp

Als nächstes erzeugen wir noch das temporäre Verzeichnis, in dem die Parameterdatei erzeugt werden kann.

 # mkdir /var/lib/dovecot/tmp/

Das Erzeugen erfolgt nun mit Hilfe des folgenden Aufrufs.

 # /usr/libexec/dovecot/ssl-params -c /etc/dovecot/ssl-params.conf

Dovecot können wir nun leider nicht anweisen, direkt diese Parameterdatei zu laden. Wir werden daher unsere neu generierte Datei an Ort und Stelle verschieben, wo Dovecot diese erwartet.

 # /usr/bin/mv /var/lib/dovecot/tmp/ssl-parameters.dat /var/lib/dovecot/ssl-parameters.dat

Anschließend führen wir einen Reload des Dovecot-Daemon durch, damit dieser diese DH-Parameter neu einliest.

 # systemctl reload dovecot

Da wir in regelmäßigen Abständen die Diffie-Hellman Parameter neu generieren wollen, verpacken wir die gerade gezeigten Schritte in ein Script verlagern.

 # vim /etc/cron.weekly/dh-params
/etc/cron.weekly/dh-params
#!/bin/sh
# Diffie-Hellman Parameter Datei erzeugen
/usr/libexec/dovecot/ssl-params -c /etc/dovecot/ssl-params.conf
 
# Hostname und Datum holen
NAME=`hostname -s`
DATUM=`date +'%b %e %H:%M:%S'`
 
# Parameterdatei für Dovecot bereitstellen
/usr/bin/mv /var/lib/dovecot/tmp/ssl-parameters.dat /var/lib/dovecot/ssl-parameters.dat
 
# Informationen zur neuen Parameterdatei im Maillog vermerken
echo "$DATUM" "$NAME" "dovecot: ssl-params: renewed diffie-hellman parameters 4096bit" >> /var/log/maillog
 
# Dovecot die neuen DH-Parameter bekannt geben
/usr/bin/systemctl reload dovecot
 
# Temporäres Verzeichnis leeren
/usr/bin/rm /var/lib/dovecot/tmp/ssl-parameters.dat -f

Damit das Script nun auch ausgeführt werden kann, versehen wir es noch mit den x-Ausführungsrechten.

 # chmod +x /etc/cron.weekly/dh-params

Das regelmäßige Erneuern der DH-Parameter erfolgt nun regelmäßig und wir im Maillog entsprechend dokumentiert.

 # less /var/log/maillog
Jun  9 20:08:31 vml000077 dovecot: ssl-params(4526): renewed diffie-hellman parameters 4096bit
Jun  9 20:08:31 vml000077 dovecot: master: Warning: SIGHUP received - reloading configuration

Logging

Ob nun PFS11) verwendet wird oder nicht, wollen wir natürlich in unserer Mailservere-Logdatei /var/log/maillog sehen. Denn tauchen im Dovecot Log Hinweise auf TLS-Sessions und die Chiffren DHE-RSA-AES128-SHA oder DHE-RSA-AES256-SHA auf, werden die entsprechenden Verbindungen mit PFS abgesichert. Da wir Dovecot in der Version 2.2.13 im Betrieb haben, stehen uns noch die Chiffren mit ECDHE zur Verfügung.

Mit dem login_log_format_elements %k werden im Logfile Angaben zu SSL Protokoll und Cipher-Information vermerkt.

 # vim /etc/dovecot/conf.d/10-logging.conf
/etc/dovecot/conf.d/10-logging.conf
##
## Log destination.
##
 
# Log file to use for error messages. "syslog" logs to syslog,
# /dev/stderr logs to stderr.
#log_path = syslog
 
# Log file to use for informational messages. Defaults to log_path.
#info_log_path = 
# Log file to use for debug messages. Defaults to info_log_path.
#debug_log_path = 
 
# Syslog facility to use if you're logging to syslog. Usually if you don't
# want to use "mail", you'll use local0..local7. Also other standard
# facilities are supported.
#syslog_facility = mail
 
##
## Logging verbosity and debugging.
##
 
# Log unsuccessful authentication attempts and the reasons why they failed.
#auth_verbose = no
# Django : 2014-07-21
# Detaillierte Loginformationen zum positiven Authentifizierungsprozess 
# bzw. im Fehlerfall mit Details zu den Fehlern
# default: auth_verbose = no
auth_verbose = no
 
# In case of password mismatches, log the attempted password. Valid values are
# no, plain and sha1. sha1 can be useful for detecting brute force password
# attempts vs. user simply trying the same password over and over again.
# You can also truncate the value to n chars by appending ":n" (e.g. sha1:6).
#auth_verbose_passwords = no
 
# Even more verbose logging for debugging purposes. Shows for example SQL
# queries.
#auth_debug = no
# Django : 2014-07-21
# Detaillierte Debug-Loginformationen zum Authentifizierungsprozess inkl.
# der SQL-Abfragen und deren Ergebnisse ins Logfile schreiben
 
# In case of password mismatches, log the passwords and used scheme so the
# problem can be debugged. Enabling this also enables auth_debug.
#auth_debug_passwords = no
# Django : 2014-07-21
# Passwort zum Debuggen mitloggen? 
 
# Enable mail process debugging. This can help you figure out why Dovecot
# isn't finding your mails.
#mail_debug = no
# Django : 2014-07-21
# Detailierte Loginformationen zur Verarbeitung der eMails durch Dovecot.
mail_debug = yes
 
# Show protocol level SSL errors.
#verbose_ssl = no
# Django : 2014-07-21
# SSL-Debugmode aktivieren. 
verbose_ssl = yes
 
# mail_log plugin provides more event logging for mail processes.
plugin {
  # Events to log. Also available: flag_change append
  #mail_log_events = delete undelete expunge copy mailbox_delete mailbox_rename
  # Available fields: uid, box, msgid, from, subject, size, vsize, flags
  # size and vsize are available only for expunge and copy events.
  #mail_log_fields = uid box msgid size
}
 
##
## Log formatting.
##
 
# Prefix for each line written to log file. % codes are in strftime(3)
# format.
#log_timestamp = "%b %d %H:%M:%S "
# Django : 2014-07-21
# default: unset
log_timestamp  = "%Y-%m-%d %H:%M:%S "
 
# Space-separated list of elements we want to log. The elements which have
# a non-empty variable value are joined together to form a comma-separated
# string.
#login_log_format_elements = user=<%u> method=%m rip=%r lip=%l mpid=%e %c
# Django : 2014-07-21
# default: unset
# Folgende Parameter wurden aktiviert:
# %u         : User/Login-Namen 
# %m         : Authentication-Pethode
# %r         : Remote IP Adress
# %e         : Mail-Process-ID (imap/pop3) der post-login Verbindung
# %c         : "secured" String "SSL", "TLS" 
# %k         : SSL Protokoll und Cipher-Information  
# %{session} : Session-ID der Client-Verbindung
login_log_format_elements = user=<%u> method=%m rip=%r mpid=%e %c %k session=<%{session}>
 
# Login log format. %s contains login_log_format_elements string, %$ contains
# the data we want to log.
#login_log_format = %$: %s
 
# Log prefix for mail processes. See doc/wiki/Variables.txt for list of
# possible variables you can use.
#mail_log_prefix = "%s(%u): "
 
# Format to use for logging mail deliveries. You can use variables:
#  %$ - Delivery status message (e.g. "saved to INBOX")
#  %m - Message-ID
#  %s - Subject
#  %f - From address
#  %p - Physical size
#  %w - Virtual size
#deliver_log_format = msgid=%m: %$

Wollen wir noch detailierte Debug-Meldungen zu SSL im Logfile sehen, können wir diese mit der Option verbose_ssl = yes in der /etc/dovecot/conf.d/10-logging.conf bei Bedarf aktivieren.

# Show protocol level SSL errors.
#verbose_ssl = no
# Django : 2014-07-21
# SSL-Debugmode aktivieren. 
verbose_ssl = yes
 # tail -f /var/log/maillog
Jul 22 21:23:19 vml000070 dovecot: imap-login: Debug: SSL: elliptic curve secp384r1 will be used for ECDH and ECDHE key exchanges
Jul 22 21:23:19 vml000070 dovecot: imap-login: Debug: SSL: elliptic curve secp384r1 will be used for ECDH and ECDHE key exchanges
Jul 22 21:23:19 vml000070 dovecot: imap-login: Debug: SSL: where=0x10, ret=1: before/accept initialization [10.0.0.20]
Jul 22 21:23:19 vml000070 dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: before/accept initialization [10.0.0.20]
Jul 22 21:23:19 vml000070 dovecot: imap-login: Debug: SSL: where=0x2002, ret=-1: SSLv2/v3 read client hello A [10.0.0.20]
Jul 22 21:23:19 vml000070 dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: SSLv3 read client hello A [10.0.0.20]
Jul 22 21:23:19 vml000070 dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: SSLv3 write server hello A [10.0.0.20]
Jul 22 21:23:19 vml000070 dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: SSLv3 write certificate A [10.0.0.20]
Jul 22 21:23:19 vml000070 dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: SSLv3 write key exchange A [10.0.0.20]
Jul 22 21:23:19 vml000070 dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: SSLv3 write server done A [10.0.0.20]
Jul 22 21:23:19 vml000070 dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: SSLv3 flush data [10.0.0.20]
Jul 22 21:23:19 vml000070 dovecot: imap-login: Debug: SSL: where=0x2002, ret=-1: SSLv3 read client certificate A [10.0.0.20]
Jul 22 21:23:19 vml000070 dovecot: imap-login: Debug: SSL: where=0x2002, ret=-1: SSLv3 read client certificate A [10.0.0.20]
Jul 22 21:23:19 vml000070 dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: SSLv3 read client key exchange A [10.0.0.20]
Jul 22 21:23:19 vml000070 dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: SSLv3 read finished A [10.0.0.20]
Jul 22 21:23:19 vml000070 dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: SSLv3 write session ticket A [10.0.0.20]
Jul 22 21:23:19 vml000070 dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: SSLv3 write change cipher spec A [10.0.0.20]
Jul 22 21:23:19 vml000070 dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: SSLv3 write finished A [10.0.0.20]
Jul 22 21:23:19 vml000070 dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: SSLv3 flush data [10.0.0.20]
Jul 22 21:23:19 vml000070 dovecot: imap-login: Debug: SSL: where=0x20, ret=1: SSL negotiation finished successfully [10.0.0.20]
Jul 22 21:23:19 vml000070 dovecot: imap-login: Debug: SSL: where=0x2002, ret=1: SSL negotiation finished successfully [10.0.0.20]
Jul 22 21:23:19 vml000070 dovecot: imap-login: Login: user=<michael@nausch.org>, method=PLAIN, rip=10.0.0.20, mpid=22020, TLS, TLSv1 with cipher ECDHE-RSA-AES128-SHA (128/128 bits), session=<r4v8J83+SQAKAAAU>

Zum Aktivieren unserer Konfigurationsänderungen führen wir einen reload des Daemon durch.

 # systemctl reload dovecot.service

Im Maillog unseres Servers wird uns der reload entsprechend quittiert.

 Jul 23 16:21:53 vml000070.dmz.nausch.org systemd[1]: Reloaded Dovecot IMAP/POP3 email server.

Fragen wir den Status unseres Servers ab, sehen wir auch dort den erfolgreichen reload des Daemon.

 # systemctl status dovecot.service
dovecot.service - Dovecot IMAP/POP3 email server
   Loaded: loaded (/usr/lib/systemd/system/dovecot.service; enabled)
   Active: active (running) since Tue 2014-07-22 21:35:37 CEST; 18h ago
  Process: 23194 ExecReload=/bin/kill -HUP $MAINPID (code=exited, status=0/SUCCESS)
 Main PID: 22063 (dovecot)
   CGroup: /system.slice/dovecot.service
           ├─22063 /usr/sbin/dovecot -F
           ├─22065 dovecot/anvil [0 connections]
           ├─23196 dovecot/log
           └─23198 dovecot/config

Jul 22 21:43:14 vml000070.dmz.nausch.org dovecot[22066]: imap(michael@nausch.org): Debug: Namespace inbox: type=privat...hael
Jul 22 21:43:14 vml000070.dmz.nausch.org dovecot[22066]: imap(michael@nausch.org): Debug: maildir++: root=/var/spool/m...alt=
Jul 22 23:16:30 vml000070.dmz.nausch.org dovecot[22066]: imap-login: Debug: SSL alert: close notify [10.0.0.20]
Jul 22 23:16:30 vml000070.dmz.nausch.org dovecot[22066]: imap(michael@nausch.org): Disconnected: Disconnected in IDLE ...7903
Jul 23 16:21:53 vml000070.dmz.nausch.org systemd[1]: Reloading Dovecot IMAP/POP3 email server.
Jul 23 16:21:53 vml000070.dmz.nausch.org dovecot[22063]: master: Warning: SIGHUP received - reloading configuration
Jul 23 16:21:53 vml000070.dmz.nausch.org systemd[1]: Reloaded Dovecot IMAP/POP3 email server.
Hint: Some lines were ellipsized, use -l to show in full.

openssl

Zum Testen der kompletten Konfigurationsänderungen greifen wir auf die Bibliothek openssl zurück. Im nachfolgendem Beispiel bauen wir eine Verbindung von einem entferneten Linux-Host im eigenen Netz auf. Somit haben wir auch gleich noch den Test, ob es ggf. nicht eine Firewall gibt, die unseren Verbindungsaufbauwunsch unter Umständen blockiert.

Nach Herstellen der Verbindung loggen wir uns einfach wieder vom System ab, in dem wir die Zeichenfolge 42 logout verwenden.

 $ openssl s_client -starttls imap -connect 10.0.0.70:143
CONNECTED(00000003)
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
verify return:1
depth=1 C = US, O = "GeoTrust, Inc.", CN = RapidSSL CA
verify return:1
depth=0 serialNumber = 3S7x2lcbYiAccKZPoha0MSwP5hNsuSTP, OU = GT49447951, OU = See www.rapidssl.com/resources/cps (c)13, OU = Domain Control Validated - RapidSSL(R), CN = *.nausch.org
verify return:1
---
Certificate chain
 0 s:/serialNumber=3S7x2lcbYiAccKZPoha0MSwP5hNsuSTP/OU=GT49447951/OU=See www.rapidssl.com/resources/cps (c)13/OU=Domain Control Validated - RapidSSL(R)/CN=*.nausch.org
   i:/C=US/O=GeoTrust, Inc./CN=RapidSSL CA
 1 s:/C=US/O=GeoTrust, Inc./CN=RapidSSL CA
   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIFKjCCBBKgAwIBAgIDEdPpMA0GCSqGSIb3DQEBCwUAMDwxCzAJBgNVBAYTAlVT
MRcwFQYDVQQKEw5HZW9UcnVzdCwgSW5jLjEUMBIGA1UEAxMLUmFwaWRTU0wgQ0Ew
HhcNMTQwNDA4MDMyNTAyWhcNMTYwNjAyMDEzODU0WjCBuzEpMCcGA1UEBRMgM1M3
eDJsY2JZaUFjY0taUG9oYTBNU3dQNWhOc3VTVFAxEzARBgNVBAsTCkdUNDk0NDc5
NTExMTAvBgNVBAsTKFNlZSB3d3cucmFwaWRzc2wuY29tL3Jlc291cmNlcy9jcHMg
KGMpMTMxLzAtBgNVBAsTJkRvbWFpbiBDb250cm9sIFZhbGlkYXRlZCAtIFJhcGlk
U1NMKFIpMRUwEwYDVQQDDAwqLm5hdXNjaC5vcmcwggEiMA0GCSqGSIb3DQEBAQUA
A4IBDwAwggEKAoIBAQDRhxUen7499yElJr2cOIPdg4u/E93rgFw3DhflaV54r8G3
oA1U+brU7XNpnRVA+QHk1aXTnROwGX46mlxacKOQPE0U9dXMRFrWfnCcOCgUqkjY
vQdivwKUOJqfJfef0Zun4C7LabfP/Gb5TkFUC7+Hq3jzoZnifleRuK+2MZXX05/E
+T5jKrVsanfh2bN6WKgzwvmPaurpelA1f5ciiaWcuXtTc8Hrshyko30IeyIxAJ2J
aj3zHKEjuTMNn/fsMOOFO0LG2T68Wc9gFRa0ds1LXFbuwOxi1i/dLRWDFhGZtplp
HOBlYBkwnEawpsHS+nQVEc2d7CFCBWr2MCSQLQQvAgMBAAGjggGzMIIBrzAfBgNV
HSMEGDAWgBRraT1qGEJK3Y8CZTn9NSSGeJEWMDAOBgNVHQ8BAf8EBAMCBaAwHQYD
VR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMCMGA1UdEQQcMBqCDCoubmF1c2No
Lm9yZ4IKbmF1c2NoLm9yZzBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vcmFwaWRz
c2wtY3JsLmdlb3RydXN0LmNvbS9jcmxzL3JhcGlkc3NsLmNybDAdBgNVHQ4EFgQU
HjMj1hUDkcufmSmgDVeMt7sdoAkwDAYDVR0TAQH/BAIwADB4BggrBgEFBQcBAQRs
MGowLQYIKwYBBQUHMAGGIWh0dHA6Ly9yYXBpZHNzbC1vY3NwLmdlb3RydXN0LmNv
bTA5BggrBgEFBQcwAoYtaHR0cDovL3JhcGlkc3NsLWFpYS5nZW90cnVzdC5jb20v
cmFwaWRzc2wuY3J0MEwGA1UdIARFMEMwQQYKYIZIAYb4RQEHNjAzMDEGCCsGAQUF
BwIBFiVodHRwOi8vd3d3Lmdlb3RydXN0LmNvbS9yZXNvdXJjZXMvY3BzMA0GCSqG
SIb3DQEBCwUAA4IBAQACZLmO7zRHC4zEXyXCHpIgZ/TIo8sdvGzDH2koZgU0ZlCR
psebPpulKDr2Q6JYVPsS6z7sqw9SNCmVjeRngIgCpuih7DGUzrc7YzPw4vmGTgND
KTCQ8B3TqjYak3pG3LUUwsSIL1//oSuYKkdClmpNgFgYJegVdXrE3+EjuoLq5wwb
xsGzO1KW5olUX7J4IwZbnE5ZRrhF+UIRtj1yPx2fqXOBGuqGdhZ4pTrsY20e6mJJ
4ZOK0RY0MFy1JN3cWAsL5mR3wZwLeUYXnwSHKqWHE0TjJcy5X6sLZP5IoOt61vu1
7Zv1GcT4i3a/8uGGAGINouL3WmdqQ5Uj5qyhceli
-----END CERTIFICATE-----
subject=/serialNumber=3S7x2lcbYiAccKZPoha0MSwP5hNsuSTP/OU=GT49447951/OU=See www.rapidssl.com/resources/cps (c)13/OU=Domain Control Validated - RapidSSL(R)/CN=*.nausch.org
issuer=/C=US/O=GeoTrust, Inc./CN=RapidSSL CA
---
No client certificate CA names sent
---
SSL handshake has read 4179 bytes and written 447 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: 896E8EF61DEA02CFA8CE2111E0E92FA63460737C5CFD411F7DCB1386469BBED1
    Session-ID-ctx: 
    Master-Key: 2F1EAEE914B52ADAABE8F9A78075F63E7E8CEAE15851CCFF0D2AA9C187FF2AD7889E1021443B3930CDC92F132FF940F0
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:
    0000 - 75 98 30 ea 14 96 0c ad-60 2b fe 0d 85 d5 e0 cd   u.0.....`+......
    0010 - 86 83 24 10 3a d9 6d 5d-09 a6 d1 fd e4 3d 34 11   ..$.:.m].....=4.
    0020 - ac 83 fb bd 3c 48 84 7a-02 dd 27 83 b9 84 94 2b   ....<H.z..'....+
    0030 - db e9 62 ea 0c b3 61 a2-6c 07 cc 55 1b 7b 4d 65   ..b...a.l..U.{Me
    0040 - ab 3f 93 21 6e da b6 df-e3 a3 08 c4 52 f5 54 6e   .?.!n.......R.Tn
    0050 - 06 8d 4f 71 52 8e c4 79-fa e6 3f 18 26 2f 35 50   ..OqR..y..?.&/5P
    0060 - 86 75 c5 2c e7 39 3e 49-e5 a0 ef 29 44 10 de 7b   .u.,.9>I...)D..{
    0070 - c8 42 93 c3 cc a0 a6 61-db 71 f2 ff fb f2 85 42   .B.....a.q.....B
    0080 - 8e 25 6c 60 3a 07 4d f6-a3 ca 39 d6 c4 a5 b7 45   .%l`:.M...9....E
    0090 - fc 7f 1c 81 ac 4a 74 a4-ba 9e ff 41 dd 12 d1 1d   .....Jt....A....

    Start Time: 1406125765
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---
. OK Pre-login capabilities listed, post-login capabilities have more.
 42 logout
closed

Im Maillog unseres Dovecot-Servers findet sich entsprechend unsere Verbindungstest. Bei aktivierten SSL-Debug-Meldungen, also gesetzter Option verbose_ssl = yes, erhalten wir sehr ausfürliche Informatinen zu unserer Testverbindung.

 # less /var/log/maillog
Jul 23 16:36:15 vml000070 dovecot: imap-login: Debug: SSL: elliptic curve secp384r1 will be used for ECDH and ECDHE key exchanges
Jul 23 16:36:15 vml000070 dovecot: imap-login: Debug: SSL: elliptic curve secp384r1 will be used for ECDH and ECDHE key exchanges
Jul 23 16:36:15 vml000070 dovecot: imap-login: Debug: SSL: where=0x10, ret=1: before/accept initialization [10.0.0.20]
Jul 23 16:36:15 vml000070 dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: before/accept initialization [10.0.0.20]
Jul 23 16:36:15 vml000070 dovecot: imap-login: Debug: SSL: where=0x2002, ret=-1: SSLv2/v3 read client hello A [10.0.0.20]
Jul 23 16:36:15 vml000070 dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: SSLv3 read client hello A [10.0.0.20]
Jul 23 16:36:15 vml000070 dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: SSLv3 write server hello A [10.0.0.20]
Jul 23 16:36:15 vml000070 dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: SSLv3 write certificate A [10.0.0.20]
Jul 23 16:36:15 vml000070 dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: SSLv3 write key exchange A [10.0.0.20]
Jul 23 16:36:15 vml000070 dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: SSLv3 write server done A [10.0.0.20]
Jul 23 16:36:15 vml000070 dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: SSLv3 flush data [10.0.0.20]
Jul 23 16:36:15 vml000070 dovecot: imap-login: Debug: SSL: where=0x2002, ret=-1: SSLv3 read client certificate A [10.0.0.20]
Jul 23 16:36:15 vml000070 dovecot: imap-login: Debug: SSL: where=0x2002, ret=-1: SSLv3 read client certificate A [10.0.0.20]
Jul 23 16:36:15 vml000070 dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: SSLv3 read client key exchange A [10.0.0.20]
Jul 23 16:36:15 vml000070 dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: SSLv3 read finished A [10.0.0.20]
Jul 23 16:36:15 vml000070 dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: SSLv3 write session ticket A [10.0.0.20]
Jul 23 16:36:15 vml000070 dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: SSLv3 write change cipher spec A [10.0.0.20]
Jul 23 16:36:15 vml000070 dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: SSLv3 write finished A [10.0.0.20]
Jul 23 16:36:15 vml000070 dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: SSLv3 flush data [10.0.0.20]
Jul 23 16:36:15 vml000070 dovecot: imap-login: Debug: SSL: where=0x20, ret=1: SSL negotiation finished successfully [10.0.0.20]
Jul 23 16:36:15 vml000070 dovecot: imap-login: Debug: SSL: where=0x2002, ret=1: SSL negotiation finished successfully [10.0.0.20]
Jul 23 16:36:21 vml000070 dovecot: imap-login: Aborted login (no auth attempts in 6 secs): user=<>, rip=10.0.0.20, TLS, TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits), session=<LauKQ93+ZAAKAAAU>
Jul 23 16:36:21 vml000070 dovecot: imap-login: Debug: SSL alert: close notify [10.0.0.20]

Ohne gesetzter Option verbose_ssl = yes, also verbose_ssl = no fällt die Rückmeldung im maillog entsprechend spartanisch aus.

 # tail -f /var/log/maillog
 Jul 23 16:39:08 vml000070 dovecot: imap-login: Aborted login (no auth attempts in 5 secs): user=<>, rip=10.0.0.20, TLS, TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits), session=<FCSBTd3+sQAKAAAU>

Wollen wir unser Produktiv-System überprüfen, nutzen wir einen der folgenden Aufrufe:

  • IMAP und START/TLS:
     $ openssl s_client -starttls imap -connect imap.nausch.org:143
  • IMAP und SSL:
     $ openssl s_client -connect imap.nausch.org:993
  • POP3 und SSL:
     $ openssl s_client -connect imap.nausch.org:995

Finden wir in der Ausgabe eine der nachfolgenden Angaben, ist alles bestens, der IMAP-Server unterstützt Perfect Forward Secrecy

  • Protocol :
    TLSv1.2
     
  • Cipher :
    ECDHE-RSA-AES256-GCM-SHA384
    DHE-RSA-AES256-GCM-SHA384

Wichtig:
Nicht der Server definiert letztendlich, welcher Cipher bei der Absicherung der Übertragung verwendet wird, sondern der Mailclient! Und hier kann man durchaus sehr interessante Aha-Erlebnisse haben, wenn man mit den einschlägigen teuren Clientlösungen Verbindungen testet. m(

cipherscan

Zum Überprüfen welche Chiffren vom Server angeboten und unterstützt werden, greifen wir auf das Tool cipherscan von Julien Vehent und Hubert Kario zurück. Das Projekt basiert auf den openssl-Bibliotheken und wird auf GitHub zur Verfügung gestellt.

Mit nachfolgendem Aufruf kann überprüft werden, welche Ciphers angeboten werden.

 # /usr/local/src/cipherscan-master/cipherscan -o /usr/local/src/cipherscan-master/openssl --curves -starttls imap imap.nausch.org:143
.....................................
Target: imap.nausch.org:143

prio  ciphersuite                  protocols              pfs                 curves
1     ECDHE-RSA-AES256-GCM-SHA384  TLSv1.2                ECDH,P-256,256bits  prime256v1,secp384r1,secp521r1
2     ECDHE-RSA-AES128-GCM-SHA256  TLSv1.2                ECDH,P-256,256bits  prime256v1,secp384r1,secp521r1
3     ECDHE-RSA-AES256-SHA384      TLSv1.2                ECDH,P-256,256bits  prime256v1,secp384r1,secp521r1
4     ECDHE-RSA-AES128-SHA256      TLSv1.2                ECDH,P-256,256bits  prime256v1,secp384r1,secp521r1
5     ECDHE-RSA-AES256-SHA         TLSv1,TLSv1.1,TLSv1.2  ECDH,P-256,256bits  prime256v1,secp384r1,secp521r1
6     ECDHE-RSA-AES128-SHA         TLSv1,TLSv1.1,TLSv1.2  ECDH,P-256,256bits  prime256v1,secp384r1,secp521r1
7     DHE-RSA-AES256-GCM-SHA384    TLSv1.2                DH,4096bits         None
8     DHE-RSA-AES256-SHA256        TLSv1.2                DH,4096bits         None
9     DHE-RSA-AES256-SHA           TLSv1,TLSv1.1,TLSv1.2  DH,4096bits         None
10    DHE-RSA-CAMELLIA256-SHA      TLSv1,TLSv1.1,TLSv1.2  DH,4096bits         None
11    DHE-RSA-AES128-GCM-SHA256    TLSv1.2                DH,4096bits         None
12    DHE-RSA-AES128-SHA256        TLSv1.2                DH,4096bits         None
13    DHE-RSA-AES128-SHA           TLSv1,TLSv1.1,TLSv1.2  DH,4096bits         None
14    DHE-RSA-SEED-SHA             TLSv1,TLSv1.1,TLSv1.2  DH,4096bits         None
15    DHE-RSA-CAMELLIA128-SHA      TLSv1,TLSv1.1,TLSv1.2  DH,4096bits         None

Certificate: trusted, 4096 bit, sha512WithRSAEncryption signature
TLS ticket lifetime hint: 300
OCSP stapling: not supported
Cipher ordering: server
Curves ordering: server
Curves fallback: False

Die Bewertung der einzelnen Chiffren müssen wir hier immer noch selbst vornehmen; hilfreiche Informationen hierzu findet man z.B. im Buch BULLETPROOF SSL AND TLS von Ivan Ristić.

Links


1) , 11)
Perfect Forward Secrecy
2)
Secure Sockets Layer
3)
Transport Layer Security
4)
Sammlung von standardisierten kryptographischer Algorithmen
5)
Ausgabe in formatierter Tabelle
6)
Diffie Hellmann
7)
Elliptic Curve Diffie Hellmann
8)
Certificate Signing Request
9)
Certification Authority
10)
Certificate Signing Request
Cookies helfen bei der Bereitstellung von Inhalten. Durch die Nutzung dieser Seiten erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Rechner gespeichert werden. Weitere Information
  • centos/mail_c7/dovecot_4.txt
  • Zuletzt geändert: 22.07.2019 14:48.
  • von django