Inhaltsverzeichnis

SSL/TLS - Postfixverbindungen 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 Postfix-Mailserver, wie auch zwischen fremden Postfix 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.

OpenSSL

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.0.1e-16.el6_5

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                      Relocations: (not relocatable)
Version     : 1.0.1e                            Vendor: CentOS
Release     : 16.el6_5                      Build Date: Tue 03 Dec 2013 09:22:10 PM CET
Install Date: Wed 04 Dec 2013 01:06:18 PM CET      Build Host: c6b10.bsys.dev.centos.org
Group       : System Environment/Libraries   Source RPM: openssl-1.0.1e-16.el6_5.src.rpm
Size        : 4201414                          License: OpenSSL
Signature   : RSA/SHA1, Tue 03 Dec 2013 11:53:57 PM CET, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
URL         : http://www.openssl.org/
Summary     : A 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
/etc/pki/tls/certs
/etc/pki/tls/certs/Makefile
/etc/pki/tls/certs/make-dummy-cert
/etc/pki/tls/certs/renew-dummy-cert
/etc/pki/tls/misc
/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
/etc/pki/tls/openssl.cnf
/etc/pki/tls/private
/usr/bin/openssl
/usr/lib64/.libcrypto.so.1.0.1e.hmac
/usr/lib64/.libcrypto.so.10.hmac
/usr/lib64/.libssl.so.1.0.1e.hmac
/usr/lib64/.libssl.so.10.hmac
/usr/lib64/libcrypto.so.1.0.1e
/usr/lib64/libcrypto.so.10
/usr/lib64/libssl.so.1.0.1e
/usr/lib64/libssl.so.10
/usr/lib64/openssl
/usr/lib64/openssl/engines
/usr/lib64/openssl/engines/lib4758cca.so
/usr/lib64/openssl/engines/libaep.so
/usr/lib64/openssl/engines/libatalla.so
/usr/lib64/openssl/engines/libcapi.so
/usr/lib64/openssl/engines/libchil.so
/usr/lib64/openssl/engines/libcswift.so
/usr/lib64/openssl/engines/libgmp.so
/usr/lib64/openssl/engines/libnuron.so
/usr/lib64/openssl/engines/libpadlock.so
/usr/lib64/openssl/engines/libsureware.so
/usr/lib64/openssl/engines/libubsec.so
/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-Hellmann

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-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
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-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
DES-CBC3-SHA                  SSLv3   Kx=RSA        Au=RSA   Enc=3DES(168)     Mac=SHA1
PSK-3DES-EDE-CBC-SHA          SSLv3   Kx=PSK        Au=PSK   Enc=3DES(168)     Mac=SHA1
KRB5-DES-CBC3-SHA             SSLv3   Kx=KRB5       Au=KRB5  Enc=3DES(168)     Mac=SHA1
KRB5-DES-CBC3-MD5             SSLv3   Kx=KRB5       Au=KRB5  Enc=3DES(168)     Mac=MD5 
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
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
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
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
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
KRB5-IDEA-CBC-SHA             SSLv3   Kx=KRB5       Au=KRB5  Enc=IDEA(128)     Mac=SHA1
KRB5-IDEA-CBC-MD5             SSLv3   Kx=KRB5       Au=KRB5  Enc=IDEA(128)     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 
EDH-RSA-DES-CBC-SHA           SSLv3   Kx=DH         Au=RSA   Enc=DES(56)       Mac=SHA1
EDH-DSS-DES-CBC-SHA           SSLv3   Kx=DH         Au=DSS   Enc=DES(56)       Mac=SHA1
DES-CBC-SHA                   SSLv3   Kx=RSA        Au=RSA   Enc=DES(56)       Mac=SHA1
KRB5-DES-CBC-SHA              SSLv3   Kx=KRB5       Au=KRB5  Enc=DES(56)       Mac=SHA1
KRB5-DES-CBC-MD5              SSLv3   Kx=KRB5       Au=KRB5  Enc=DES(56)       Mac=MD5 
EXP-EDH-RSA-DES-CBC-SHA       SSLv3   Kx=DH(512)    Au=RSA   Enc=DES(40)       Mac=SHA1 export
EXP-EDH-DSS-DES-CBC-SHA       SSLv3   Kx=DH(512)    Au=DSS   Enc=DES(40)       Mac=SHA1 export
EXP-DES-CBC-SHA               SSLv3   Kx=RSA(512)   Au=RSA   Enc=DES(40)       Mac=SHA1 export
EXP-RC2-CBC-MD5               SSLv3   Kx=RSA(512)   Au=RSA   Enc=RC2(40)       Mac=MD5  export
EXP-KRB5-RC2-CBC-SHA          SSLv3   Kx=KRB5       Au=KRB5  Enc=RC2(40)       Mac=SHA1 export
EXP-KRB5-DES-CBC-SHA          SSLv3   Kx=KRB5       Au=KRB5  Enc=DES(40)       Mac=SHA1 export
EXP-KRB5-RC2-CBC-MD5          SSLv3   Kx=KRB5       Au=KRB5  Enc=RC2(40)       Mac=MD5  export
EXP-KRB5-DES-CBC-MD5          SSLv3   Kx=KRB5       Au=KRB5  Enc=DES(40)       Mac=MD5  export
EXP-RC4-MD5                   SSLv3   Kx=RSA(512)   Au=RSA   Enc=RC4(40)       Mac=MD5  export
EXP-KRB5-RC4-SHA              SSLv3   Kx=KRB5       Au=KRB5  Enc=RC4(40)       Mac=SHA1 export
EXP-KRB5-RC4-MD5              SSLv3   Kx=KRB5       Au=KRB5  Enc=RC4(40)       Mac=MD5  export

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

Bei der Postfix-Installation werden zwei vordefinierte Schlüssel mitgeliefert, die jedoch bei den Installation mit diesem Paket gleich sind. Also werden wir uns nun erst eimal zwei Diffie-Hellmann-Schlüssel, einen 1024-bit (non-export ciphers) sowie einen 512-bit (export ciphers), erzeugen.

 # openssl dhparam -out /etc/postfix/dh_512.pem -2 512
Generating DH parameters, 512 bit long safe prime, generator 2
This is going to take a long time
...+.................+.+..................+.............+............................+.......+.................................+......................++.........................+..........................................+.....................+......+.......................+....+................+.................+...............................................+...........+...............+.........+.........................................+.....+.....+..................+..........+.......+..........+...............+....................++*++*++*++*++*++*
 # openssl dhparam -out /etc/postfix/dh_1024.pem -2 1024
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
...........+..............................................................+.................+........................................................................................................................................................................................................................+...................................................................+..................................................................+...........................+....................................................................................................................+........+.................+.................................................................................................+...........+...................+.......................................................................................................+++...................................+....+................................................+.....................................+...............+.....+.............................+.+.........................+.........................+....................................+...................................................................................+..................+............+...............................+.........................................................................................+..............+.................................+.............+................................................................+.....+..............+.........+.............+..............................................+..............+................................++*++*++*

Zertifikatserstellung

Für die Verschlüsselung unserer Kommunikation nutzen wir ein selbstsigniertes Zertifikat. Hierzu benötigen wir:

  1. unseren Private Key, den wir hüten wie unseren Augapfel
  2. unseren Public Key, den wir von einer CA8) signieren, in unserem Falle unsere eigene CA, und
  3. den Public Key der unterschreibenden CA, um deren Unterschrift zu prüfen.

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

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 20
drwxr-xr-x. 2 root root 4096 May 29 19:20 certs
drwxr-xr-x. 2 root root 4096 May 29 19:20 crl
-rw-r--r--  1 root root    0 Jun  5 00:20 index.txt
drwxr-xr-x. 2 root root 4096 May 29 19:20 newcerts
drwx------. 2 root root 4096 May 29 19:20 private
-rw-r--r--  1 root root    3 Jun  5 00:19 serial

Erstellen unserer eigenen CA

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

 # openssl req -new -x509 -newkey rsa:2048 -keyout cakey.pem -out cacert.pem -days 9125
Generating a 2048 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) [GB]:DE
State or Province Name (full name) [Berkshire]:Bayern
Locality Name (eg, city) [Newbury]:Pliening
Organization Name (eg, company) [My Company Ltd]:Nausch
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:

 # ll *.pem
  1. rw-r–r– 1 root root 1716 26. Mär 21:37 cacert.pem
  2. rw-r–r– 1 root root 1751 26. Mär 21:37 cakey.pem

Vorsichtshalber ä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: (2048 bit)
modulus:
    00:d9:6d:c1:4f:c3:e4:e6:f4:14:64:60:57:ae:76:
    68:40:ab:77:20:18:ae:fa:7c:ec:0c:1e:74:7f:ac:
    a3:2b:74:8c:10:59:0c:63:03:46:04:a1:08:70:0c:
    a1:04:62:10:2d:23:67:08:3f:f0:ec:36:eb:67:c4:
    24:81:97:38:bc:e9:1f:80:51:61:19:e4:56:22:07:
    54:88:6e:14:f8:d8:c2:67:c7:e9:96:e8:9d:11:f7:
    68:40:ab:77:20:18:ae:fa:7c:ec:0c:1e:74:7f:ac:
    58:84:b3:86:cb:4a:fe:52:20:fa:49:b9:3b:8c:07:
    25:22:9e:9b:2e:ee:7f:72:95:d1:3a:af:f5:9c:8e:
    24:81:97:38:bc:e9:1f:80:51:61:19:e4:56:22:07:
    54:88:6e:14:f8:d8:c2:67:c7:e9:96:e8:9d:11:f7:
 ...

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

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 2048 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:

 # openssl genrsa -out serverkey.pem -aes256 2048 -days 7300
Generating RSA private key, 2048 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, damit unser Postfix-Server, den Schlüssel ohne manuellen Eingriff laden und öffnen können muß! Schließlich wollen wir ja beim Systemstart nicht immer manuell die Passphrase eingeben müssen.

 # openssl rsa <serverkey.pem >serverkey_2.pem

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
 # chmod 400 serverkey.pem

Certificate Signing Request erzeugen

Im folgenden Schritt zu unserem eigenen Zertifikat erzeugen wir einen CSR9), den wir dann in einem weiteren Schritt von unserer eigenen CA signieren lassen werden.

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

 # 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) [GB]:DE
State or Province Name (full name) [Berkshire]:Bayern
Locality Name (eg, city) [Newbury]:Pliening
Organization Name (eg, company) [My Company Ltd]:Nausch
Organizational Unit Name (eg, section) []:Postoffice
Common Name (eg, your name or your server's hostname) []:mx1.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 []:

Serverzertifikat signieren

Bevor wir nun unser eigenes Zertifikat signieren können, passen wir in der OpenSSL-Konfigurationsdatei die Laufzeit an, da wir diese nicht auf der Komandozeile übergeben können.

 # vim /etc/pki/tls/openssl.cnf
...
####################################################################
[ 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
 
default_days    = 7300                  # how long to certify for
default_crl_days= 30                    # how long before next CRL
default_md      = sha1                  # which md to use.
preserve        = no                    # keep passed DN ordering
 
...

Außerdem verschieben wir den privaten Schlüssel unserer CA nach /etc/pki/CA/private/.

 # mv /etc/pki/CA/cakey.pem /etc/pki/CA/private/

Kommen wir zum krönenden Abschluss - wir signieren nun das Server-Zertifikat durch unsere CA:

 # 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:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 0 (0x0)
        Validity
            Not Before: Mar 26 21:59:14 2009 GMT
            Not After : Mar 21 21:59:14 2029 GMT
        Subject:
            countryName               = DE
            stateOrProvinceName       = Bayern
            organizationName          = Nausch
            organizationalUnitName    = Postoffice
            commonName                = mx1.nausch.org
            emailAddress              = postmaster@nausch.org
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                E7:13::9F:D0:C2:62:39:AE:B6:A1:73:70:95:D0:C2:62:CB:AD:46:15:BA:00
            X509v3 Authority Key Identifier: 
                keyid:7D:3E:16:7D:D7:76:73:11:F4:74:34:EF:82:62:E8:75:75:0F:98:83

Certificate is to be certified until Mar 21 21:59:14 2029 GMT (7300 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

Schlüsseldateien ablegen

Für unsere Postfix-Installation legen wir uns am besten einen eigenen Unterordner unter /etc/pki an.

 # mkdir /etc/pki/postfix

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

  1. unseren Serverzertifikat : servercert.pem
  2. unseren Serverschlüssel : serverkey.pem und
  3. das CA-Zertifikat : cacert.pem

und schützen diese Dateien mit den Dateirechten 400:

 # mv /etc/pki/CA/servercert.pem /etc/pki/postfix/
 # mv /etc/pki/CA/serverkey.pem /etc/pki/postfix/
 # cp /etc/pki/CA/cacert.pem /etc/pki/postfix/
 # chmod 400 /etc/pki/postfix/*.pem

Postfix Konfigurieren

SSL/TLS für den Mailempfang

Für den verschlüsselten Empfangsmodus erweitern wir unsere Postfix-Konfigurationsdatei wie folgt:

 #
 # SSL/TLS - Schutz durch verschlüsselte Verbindungen    (Kapitel 20.2)
 # eingetragen am 24.03.09
 #
 # Pfade zu den Keys für den Mailempfang
 smtpd_tls_key_file = /etc/pki/postfix/serverkey.pem
 smtpd_tls_cert_file = /etc/pki/postfix/servercert.pem
 smtpd_tls_CAfile = /etc/pki/postfix/cacert.pem
 
 # Aktiviert STARTTLS für den Mailempfang
 smtpd_use_tls = yes

SSL/TLS für den Mailversand

Ähnlich trivial gestaltet sich die Geschichte für den Mailversand:

 # Aktiviert STARTTLS für den Mailversand
 smtp_use_tls = yes

Perfect Forward Secrecy

Unsere bereits generierten Diffie Hellmann Schlüssel binden wir nun in unserer Postfix-Konfigurationsdatei ein.

# Aktivierung der "Ephemeral-Diffie-Hellmann" Schlüssel
smtpd_tls_dh1024_param_file = /etc/postfix/dh_1024.pem
smtpd_tls_dh512_param_file = /etc/postfix/dh_512.pem
#
# Aktivierung des "Ephemeral Elliptic Curve Diffie-Hellman" (EECDH) Schlüsselaustausches
smtpd_tls_eecdh_grade = ultra
#
# Setzen des präferierten standardisierten kryptographischen Algorithmus's. (erst ab Postfix Version 2.8)
tls_preempt_cipherlist = yes

SSL/TLS - Logging im Maillog

Für die Dokumentation der Verschlüsselung tragen wir in der main.cf noch folgende Zeilen nach:

 # Logged in den Received-Zeilen
 smtpd_tls_received_header = yes
 smtp_tls_loglevel = 1
 smtpd_tls_loglevel = 1

Abschließend starten wir nun unseren Postfix einmal durch, damit unsere Änderungen aktiv werden.

 # service postfix restart

Postfix Verbindungstest

erster Test

Als erstes kontrollieren wir, ob unser MX nun STARTTLS als ESMTP-Komando anbietet:

# telnet mx01.nausch.org 25
Trying 217.91.103.190...
Connected to mx1.nausch.org (217.91.103.190).
Escape character is '^]'.
220 mx1.nausch.org ESMTP Postfix
EHLO test
250-mx01.nausch.org
250-PIPELINING
250-SIZE 52428800
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN DIGEST-MD5
250-AUTH=PLAIN LOGIN DIGEST-MD5
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
QUIT
221 2.0.0 Bye
Connection closed by foreign host.

zweiter Verbindungstest

Als nächstes verbinden wir uns unter Einbeziehung von OpenSSL mit unserem Mailserver via telnet auf Port 25:

 $ openssl s_client -starttls smtp -connect mx01.nausch.org:25
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 = 2trISjzDJTPJcm3fBbxM-aRvSFL9RMfj, 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=2trISjzDJTPJcm3fBbxM-aRvSFL9RMfj/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-----
MIIFKjCCBBKgAwIBAgIDDFfLMA0GCSqGSIb3DQEBBQUAMDwxCzAJBgNVBAYTAlVT
MRcwFQYDVQQKEw5HZW9UcnVzdCwgSW5jLjEUMBIGA1UEAxMLUmFwaWRTU0wgQ0Ew
HhcNMTMwNTMwMTYzNDM3WhcNMTYwNjAxMTEzNzI5WjCBuzEpMCcGA1UEBRMgMnRy
SVNqekRKVFBKY20zZkJieE0tYVJ2U0ZMOVJNZmoxEzARBgNVBAsTCkdUNDk0NDc5
NTExMTAvBgNVBAsTKFNlZSB3d3cucmFwaWRzc2wuY29tL3Jlc291cmNlcy9jcHMg
KGMpMTMxLzAtBgNVBAsTJkRvbWFpbiBDb250cm9sIFZhbGlkYXRlZCAtIFJhcGlk
U1NMKFIpMRUwEwYDVQQDDAwqLm5hdXNjaC5vcmcwggEiMA0GCSqGSIb3DQEBAQUA
A4IBDwAwggEKAoIBAQCs1+zIxqVHU5Jpf3S0MYleIQAJZoIYwxFcS4IoIFULxpPi
KOTXHH1XSZRDk7OVAPGKVt9VzE0CNcWKiiS4eyWCAVOb4wf778yGG1FhKVAb2EFh
99SJdzfN0Iqte44N01IjqVNNurV+lu74GoPP0/3iJUcgRABBXYQgWDnQnPTGOBkN
vYYSxbggsD+eNLtsjSzI7Etnnr0IUfoOG5i0HEN297pzMfEckDu/eUh3Vwi6CtNx
l8BPd5/Ui7bmxZiD/9MPYUrFoh1ShTFFLD7dE4pEVVm1gVLANtS0b1DPcp9/Q7w2
DuH3fa87nBo/qkV1RMTpyzctVQ8tNtnj+mA35YTRAgMBAAGjggGzMIIBrzAfBgNV
HSMEGDAWgBRraT1qGEJK3Y8CZTn9NSSGeJEWMDAOBgNVHQ8BAf8EBAMCBaAwHQYD
VR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMCMGA1UdEQQcMBqCDCoubmF1c2No
Lm9yZ4IKbmF1c2NoLm9yZzBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vcmFwaWRz
c2wtY3JsLmdlb3RydXN0LmNvbS9jcmxzL3JhcGlkc3NsLmNybDAdBgNVHQ4EFgQU
UBbZzOI29235UZ6jDjt2csIGeD8wDAYDVR0TAQH/BAIwADB4BggrBgEFBQcBAQRs
MGowLQYIKwYBBQUHMAGGIWh0dHA6Ly9yYXBpZHNzbC1vY3NwLmdlb3RydXN0LmNv
bTA5BggrBgEFBQcwAoYtaHR0cDovL3JhcGlkc3NsLWFpYS5nZW90cnVzdC5jb20v
cmFwaWRzc2wuY3J0MEwGA1UdIARFMEMwQQYKYIZIAYb4RQEHNjAzMDEGCCsGAQUF
BwIBFiVodHRwOi8vd3d3Lmdlb3RydXN0LmNvbS9yZXNvdXJjZXMvY3BzMA0GCSqG                                                                                                                                                                             
SIb3DQEBBQUAA4IBAQCvDzskGubI84Y33jxleOMOJpJaFbXI1jNlvxzKLfut1qm9                                                                                                                                                                             
/otTkCw03rvtpfAsPBwa9y+dmmk8DAqltIVo1h2psMQwOrSXMKtFrIPEImXrEZru                                                                                                                                                                             
3Ev7yPGmm6BGop46a1aF/o9kJH7iVTh2yObwVvtB/bmOGAL/JmZLSI97EnUtCcHe                                                                                                                                                                             
RmUf7u8Y8LKDG4h/1Fd3e1C7PkNQjFyfF80TmN64GmegfpKnUZD2mOZSgZxmyDvw                                                                                                                                                                             
rrOZDFwuuEHGFWQo8Cjm6FpQrj7+gJ+8UI4I17wE5x3KBX9f1jOQiScyHNpq+3+p                                                                                                                                                                             
Aexjfd4miyGq0cP+4qELK85mwU3kHpbhaD9H9o7B                                                                                                                                                                                                     
-----END CERTIFICATE-----                                                                                                                                                                                                                    
subject=/serialNumber=2trISjzDJTPJcm3fBbxM-aRvSFL9RMfj/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 4277 bytes and written 490 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: C876A758E505A5CF08071FD93648FDE2EA2D327D08B792C2FDDE16E0725AF164                                                                                                                                                             
    Session-ID-ctx: 
    Master-Key: B0CBC53B75E0795B52A903AF8BF6BD723B452BD312E64FF7102009049151EBF878239E5CE9B5FABA49DE3F6638F9018E
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    TLS session ticket lifetime hint: 3600 (seconds)
    TLS session ticket:
    0000 - 77 d0 1c ae d7 dd c2 c8-46 b4 c0 28 7b 4d e3 06   w.......F..({M..
    0010 - 77 04 74 9e e5 e9 78 53-a9 0c 36 95 09 0f d8 97   w.t...xS..6.....
    0020 - 6c 4e 17 05 38 5d 9f 1c-16 85 80 05 01 7c fe 19   lN..8].......|..
    0030 - ba 76 8d 7d 99 cc f2 e5-ee f3 94 a2 47 23 3e 03   .v.}........G#>.
    0040 - de 7f 3a 21 e7 f6 8e 36-d6 10 14 2b 5e 41 94 4b   ..:!...6...+^A.K
    0050 - 3e 31 e4 5b 69 19 0b 51-47 fd 42 8f e1 8e 6a 45   >1.[i..QG.B...jE
    0060 - c5 a6 6e ac b9 d5 e3 a3-d0 f8 45 10 cc 1b 2b 16   ..n.......E...+.
    0070 - c4 a0 5e 21 c6 7a ec f2-6d 8a 2b 20 12 4b 63 d5   ..^!.z..m.+ .Kc.
    0080 - 95 5c 68 82 f7 29 36 16-19 de 8b 65 11 b2 94 78   .\h..)6....e...x
    0090 - ff a6 db 80 b9 08 1e 5f-b2 64 d8 29 3d c8 db 68   ......._.d.)=..h

    Start Time: 1387489519
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---
250 DSN
quit
221 2.0.0 Bye
closed

Im obigen Beispiel sehen wir, dass:

verwendet wurden.

Die Verbindung wurde uns im Maillog entsprechend positiv quittiert:

Jun 15 22:46:21 vml000080 postfix/smtpd[9047]: connect from vml000020.dmz.nausch.org[10.0.0.20]
Jun 15 22:46:21 vml000080 postfix/smtpd[9047]: setting up TLS connection from vml000020.dmz.nausch.org[10.0.0.20]
Jun 15 22:46:21 vml000080 postfix/smtpd[9047]: Anonymous TLS connection established from vml000020.dmz.nausch.org[10.0.0.20]: TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)
Jun 15 22:46:22 vml000080 postfix/smtpd[9047]: disconnect from vml000020.dmz.nausch.org[10.0.0.20]

eMail-Verkehr

Der verschlüsselte Transportweg wird in der Headerzeilen einer eMail entsprechend vermerkt:

Received: from mx1.tachtler.net (mx1.tachtler.net [88.217.171.167]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested)
	   by mx1.nausch.org (Postfix) with ESMTP for <michael@nausch.org>; Thu, 26 Mar 2009 09:30:36 +0100 (CET)

Auch im Maillog wird die gesicherte Kommunikation protokolliert:

Mar 26 23:40:40 nss postfix/smtp[18519]: setting up TLS connection to mx1.tachtler.net
Mar 26 23:40:40 nss postfix/smtp[18519]: TLS connection established to mx1.tachtler.net: TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)
Mar 26 23:40:52 nss postfix/smtp[18519]: ECC0E1158526: to=<root@tachtler.net>, relay=mx1.tachtler.net[88.217.171.167]:25, delay=13, delays=0.01/0.14/0.81/12, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as D7C7141582)

Links

1)
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)
Certification Authority
9)
Certificate Signing Request