Ein Let’s Encrypt TLS-Zertifikat für Postfix statt ein selbstsigniertes Zertifikat

Ich betreibe auf dem Server auch eine Nextcloud-Installation als Groupwarelösung. D.h. mein Kalender ist über mehrere Geräte abrufbar und auch teilbar, Emails können über ein Webmailer (Rainloop) versandt werden – leider ohne vernünftigen Unterstützung von GPG da man dazu den privaten Schlüssel auf dem Server hinterlegen müsste und ich einen Yubikey benutze welcher nicht unterstützt wird. Nun wollte ich für Nextcloud die Emailfunktion einrichten damit ich per Email an Termine erinnert werden kann. Trotz korrekter Verbindungsdaten funktionierte dies nicht und /var/log/mail.log quitierte die Testmail mit folgender Fehlermeldung:

postfix/smtps/smtpd[25336]: warning: TLS library problem: error:14094418:SSL routines:ssl3_read_bytes:tlsv1 alert unknown ca:../ssl/record/rec_layer_s3.c:1544:SSL alert number 48:

Nach einer Recherche stellte sich heraus, dass sich Nextcloud an dem selbst-signierten TLS-Zertifikat stört. Andere Mailer K-9 und Thunderbird scheint das nicht zu stören da Email ansonsten funktioniert. Seit einer Weile kann man von Let’s Encrypt kostenlose Zertifikate bekommen, was ich auch reichlich auf Websites benutze. Nun gilt es das TLS-Zertifikat von Postfix auf eines von Let’s Encrypt umzustellen. Dazu muss zunächst einmal ein Zertifikat beantragt werden. Dies erfolgt mit dem Client certbot der jedoch mit apt-get install certbot installiert werden muss.

Zunächst muss der Webserver mit service apache2 stop beendet werden. Das Zertifikat wird nun für den Mailserver mit dem FQDN (Fully-Qualified Domain Name) mail.example.com durch:

certbot certonly --standalone  --rsa-key-size 2048 -d  mail.example.com

beantragt und im Verzeichnis /etc/letsencrypt/live/mail.example.com/ gespeichert. Der Webserver kann nun wieder mit service apache2 start gestartet werden. Nun ein gültiges Zertifikat existiert muss dies nun Postfix und Dovecot bekannt gemacht werden. Dazu werden für Postfix in /etc/postfix/main.cf folgende Zeilen bearbeitet:

smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem

und für Dovecot in /etc/dovecot/dovecot.conf:

ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem

Nun werden beide Dienste mit:

service postfix restart && service dovecot restart

neu gestartet.

Der Test der Änderung kann mit openssl durch openssl s_client -connect mail.example.com:465 erfolgen:

openssl s_client -connect mail.example.com:465 
CONNECTED(00000003)
depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = R3
verify return:1
depth=0 CN = mail.example.com
verify return:1
---
Certificate chain
0 s:CN = mail.example.com
i:C = US, O = Let's Encrypt, CN = R3
1 s:C = US, O = Let's Encrypt, CN = R3
i:O = Digital Signature Trust Co., CN = DST Root CA X3
---
Server certificate
-----BEGIN CERTIFICATE-----
NIIFHTCCBAWgAwIBAgISA4YQjFvSw2lOYNSldMKCU1YtMA0GCSqGSIb3DQEBCwUA
MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD
EwJSMzAeFw0yMTAxMTMyMTM4NTFaFw0yMTA0MTMyMTM4NTFaMBcxFTATBgNVBAMT
DG1haWwuY29kYy5ldTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALPr
qO7K4ZpsnzsocqMP5SOAJUR7uRJWdQs+QjgBmsCwf6fm+ooXTSdA976euYRUjPd3
ZpSRR3GPsqbcm4hKgpSXuAUwUem3oL08zXgUjM5bs9sJEXtZLt/2Z8zeNmuW6oVx
4UW8BQK3peT3KGOPI/hhV0F4kkwSxgQDjq9SIsVg/NPlp6TI3GiCdnEvx1tF+bIg
eTEuDX5LVTwkKnPICdch/ugdRJucukU+yNB9W5XoEa+E6IlIyhCDvLL2XcIAdMW9
QbE42cy5AT79YjG9kDvE25fcq2dS/ryG1cUaNrpr6nm5qRMVzpgCgvDck4L+WVcz
4v2jrcWrpRcbzfjqLx8CAwEAAaOCAkYwggJCMA4GA1UdDwEB/wQEAwIFoDAdBgNV
HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4E
FgQUGIoJE5DXh1wvxrXIZ46lFz2SV8AwHwYDVR0jBBgwFoAUFC6zF7dYVsuuUAlA
5h+vnYsUwsYwVQYIKwYBBQUHAQEESTBHMCEGCCsGAQUFBzABhhVodHRwOi8vcjMu
by5sZW5jci5vcmcwIgYIKwYBBQUHMAKGFmh0dHA6Ly9yMy5pLmxlbmNyLm9yZy8w
FwYDVR0RBBAwDoIMbWFpbC5jb2RjLmV1MEwGA1UdIARFMEMwCAYGZ4EMAQIBMDcG
CysGAQQBgt8TAQEBMCgwJgYIKwYBBQUHAgEWGmh0dHA6Ly9jcHMubGV0c2VuY3J5
cHQub3JnMIIBAwYKKwYBBAHWeQIEAgSB9ASB8QDvAHUAb1N2rDHwMRnYmQCkURX/
dxUcEdkCwQApBo2yCJo32RMAAAF2/ebSwQAABAMARjBEAiBcqUbSxY48cdc28jdJ
nVf2nAZEINcux8FVECpAon/WcAIgfUe1ZIZW3RkQ+0Nlx3lU5HySLTCXiYxPNpCS
3ZMJBvAAdgB9PvL4j/+IVWgkwsDKnlKJeSvFDngJfy5ql2iZfiLw1wAAAXb95tLb
AAAEAwBHMEUCICbMRYYGaLKQdB1T6zIB3avB7v8K9HZT7NEwXlwQe+y4AiEAyYvY
xQBxUy1YupnIl/5OyxYwlCYTrYGEmKYLjcBzqVgwDQYJKoZIhvcNAQELBQADggEB
AIaqunre9ljffMllQCsaWh2sxkjeR1zvc3n8d1V5bseu27VV+d7TLHY4hzPlW0At
PVQc1BOq2AglvuyDGeXUzJBmcWRVWBPeVP3b9ReCXCRk7vLr/I5MK17c1SPjNpjY
IhTlL+EBtbBkKvS8V+SAIBIkXoZh3lRlHjeYHXoj7wwdNAwVu8VA+ZwxRSjb7DVD
jC5vvg9M4+KxSY0cLMfACs62iYJ2W2KzxQYWwRDrYkBTXERlfCyfmTnlQkdXxCpR
HPARfhSE6oz4OHYAapocm9IoSONgxYbK0qxU/uMLnOQfsEP/WpNnnfDU+hAkA7QU
/UrxwIgkpW9s55sSvu8fQW5=
-----END CERTIFICATE-----
subject=CN = mail.example.com

issuer=C = US, O = Let's Encrypt, CN = R3

---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 3003 bytes and written 384 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
Protocol : TLSv1.3
Cipher : TLS_AES_256_GCM_SHA384
Session-ID: 50B7B0F9EF120708F68A3AFA7C5FAFC4B32C1A190C0F9E5F780329425502F9FE
Session-ID-ctx: 
Resumption PSK: 59238839BEF70DBB21326C5F2505737F442537B5E157A792A0FEC089BA003C870B28321624669C8F259FA83E8E667C02
PSK identity: None
PSK identity hint: None
SRP username: None
TLS session ticket lifetime hint: 7200 (seconds)
TLS session ticket:
0000 - eb 00 90 5d eb 7f d6 e5-72 9c 4f e9 d1 a5 4d b9 ...]....r.O...M.
0010 - 65 07 ba ed 3f 1d ef 3d-1b 2b b6 d3 29 27 01 ac e...?..=.+..)'..
0020 - a7 6b e1 29 10 e3 5d 54-25 0b 0d 21 19 5a 12 ff .k.)..]T%..!.Z..
0030 - 3d 55 3b f2 63 08 cf 98-7e 16 84 e2 5a a8 a0 e6 =U;.c...~...Z...
0040 - 26 43 16 3d 3e 6f 9f 7e-b8 61 8e f3 d4 d4 ac 0f &C.=>o.~.a......
0050 - 8f 92 19 31 1b 62 3d 56-1c 13 20 e6 71 a6 9d 26 ...1.b=V.. .q..&
0060 - c5 33 c6 54 e7 f2 c5 9f-dd 42 a8 51 04 97 7d e0 .3.T.....B.Q..}.
0070 - 41 43 65 d6 ef 02 ee 52-70 67 95 e7 c6 19 19 dc ACe....Rpg......
0080 - d6 ed 3e 08 8e 4b a2 3c-99 e6 37 68 56 dd 7f a0 ..>..K.<..7hV...
0090 - 7a 95 f9 48 33 b0 4f 34-7b 22 0a 72 46 21 da 3d z..H3.O4{".rF!.=
00a0 - 08 7e 8f 6d ae aa 93 5a-98 7c 6b 72 e4 5b 86 ca .~.m...Z.|kr.[..
00b0 - 41 5a 52 5c 25 85 77 a6-c5 87 bf 9b 63 79 32 5e AZR\%.w.....cy2^
00c0 - 90 b9 eb e9 3c 79 0b d5-24 b9 17 82 af 75 9b eb ....<y..$....u..

Start Time: 1610637705
Timeout : 7200 (sec)
Verify return code: 0 (ok)
Extended master secret: no
Max Early Data: 0
---
read R BLOCK
220 mail.example.com ESMTP Postfix (Debian/GNU)
421 4.4.2 mail.example.com Error: timeout exceeded
closed

und mit openssl s_client -connect mail.example.com:993:

openssl s_client -connect mail.example.com:993           
CONNECTED(00000003)
depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = R3
verify return:1
depth=0 CN = mail.example.com
verify return:1
---
Certificate chain
 0 s:CN = mail.example.com
   i:C = US, O = Let's Encrypt, CN = R3
 1 s:C = US, O = Let's Encrypt, CN = R3
   i:O = Digital Signature Trust Co., CN = DST Root CA X3
---
Server certificate
-----BEGIN CERTIFICATE-----
NIIFHTCCBAWgAwIBAgISA4YQjFvSw2lOYNSldMKCU1YtMA0GCSqGSIb3DQEBCwUA
MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD
EwJSMzAeFw0yMTAxMTMyMTM4NTFaFw0yMTA0MTMyMTM4NTFaMBcxFTATBgNVBAMT
DG1haWwuY29kYy5ldTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALPr
qO7K4ZpsnzsocqMP5SOAJUR7uRJWdQs+QjgBmsCwf6fm+ooXTSdA976euYRUjPd3
ZpSRR3GPsqbcm4hKgpSXuAUwUem3oL08zXgUjM5bs9sJEXtZLt/2Z8zeNmuW6oVx
4UW8BQK3peT3KGOPI/hhV0F4kkwSxgQDjq9SIsVg/NPlp6TI3GiCdnEvx1tF+bIg
eTEuDX5LVTwkKnPICdch/ugdRJucukU+yNB9W5XoEa+E6IlIyhCDvLL2XcIAdMW9
QbE42cy5AT79YjG9kDvE25fcq2dS/ryG1cUaNrpr6nm5qRMVzpgCgvDck4L+WVcz
4v2jrcWrpRcbzfjqLx8CAwEAAaOCAkYwggJCMA4GA1UdDwEB/wQEAwIFoDAdBgNV
HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4E
FgQUGIoJE5DXh1wvxrXIZ46lFz2SV8AwHwYDVR0jBBgwFoAUFC6zF7dYVsuuUAlA
5h+vnYsUwsYwVQYIKwYBBQUHAQEESTBHMCEGCCsGAQUFBzABhhVodHRwOi8vcjMu
by5sZW5jci5vcmcwIgYIKwYBBQUHMAKGFmh0dHA6Ly9yMy5pLmxlbmNyLm9yZy8w
FwYDVR0RBBAwDoIMbWFpbC5jb2RjLmV1MEwGA1UdIARFMEMwCAYGZ4EMAQIBMDcG
CysGAQQBgt8TAQEBMCgwJgYIKwYBBQUHAgEWGmh0dHA6Ly9jcHMubGV0c2VuY3J5
cHQub3JnMIIBAwYKKwYBBAHWeQIEAgSB9ASB8QDvAHUAb1N2rDHwMRnYmQCkURX/
dxUcEdkCwQApBo2yCJo32RMAAAF2/ebSwQAABAMARjBEAiBcqUbSxY48cdc28jdJ
nVf2nAZEINcux8FVECpAon/WcAIgfUe1ZIZW3RkQ+0Nlx3lU5HySLTCXiYxPNpCS
3ZMJBvAAdgB9PvL4j/+IVWgkwsDKnlKJeSvFDngJfy5ql2iZfiLw1wAAAXb95tLb
AAAEAwBHMEUCICbMRYYGaLKQdB1T6zIB3avB7v8K9HZT7NEwXlwQe+y4AiEAyYvY
xQBxUy1YupnIl/5OyxYwlCYTrYGEmKYLjcBzqVgwDQYJKoZIhvcNAQELBQADggEB
AIaqunre9ljffMllQCsaWh2sxkjeR1zvc3n8d1V5bseu27VV+d7TLHY4hzPlW0At
PVQc1BOq2AglvuyDGeXUzJBmcWRVWBPeVP3b9ReCXCRk7vLr/I5MK17c1SPjNpjY
IhTlL+EBtbBkKvS8V+SAIBIkXoZh3lRlHjeYHXoj7wwdNAwVu8VA+ZwxRSjb7DVD
jC5vvg9M4+KxSY0cLMfACs62iYJ2W2KzxQYWwRDrYkBTXERlfCyfmTnlQkdXxCpR
HPARfhSE6oz4OHYAapocm9IoSONgxYbK0qxU/uMLnOQfsEP/WpNnnfDU+hAkA7QU
/UrxwIgkpW9s55sSvu8fQW5=
-----END CERTIFICATE-----
subject=CN = mail.example.com

issuer=C = US, O = Let's Encrypt, CN = R3

---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 3007 bytes and written 384 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_256_GCM_SHA384
    Session-ID: 3B829B6A111C83986FC8678EDF1A0219C6FAA6CD2A362FCD5133CFC06E3DD00D
    Session-ID-ctx: 
    Resumption PSK: ABC26A5832B85510FE1503CA8E3523D1491655CFBB3D89ACA2680C6882F1F1579C446C01568636C537E5D84B0D2B64FE
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 7200 (seconds)
    TLS session ticket:
    0000 - eb 69 b6 3e ce 7a 12 e4-76 2d 3c 81 0e 11 78 61   Ji.>.z..v-<...xa
    0010 - 54 68 e1 f5 2f cf 5b 86-c8 04 c1 5e 8e ff 2c 9c   Th../.[....^..,.
    0020 - b5 7c 2d 64 12 64 a4 a2-f3 fb 23 84 36 e2 0a ab   .|-d.d....#.6...
    0030 - 6f 08 df aa 84 a9 d2 53-e8 93 4f 31 87 bd c6 d6   o......S..O1....
    0040 - 08 d0 e9 1f 9d 5e b3 59-0c aa df 78 f5 67 62 4a   .....^.Y...x.gbJ
    0050 - e4 64 99 20 f1 3f 83 08-64 95 bd 06 52 13 d5 a2   .d. .?..d...R...
    0060 - 49 b5 78 9e bb a7 63 31-0c 70 58 06 4f 69 10 03   I.x...c1.pX.Oi..
    0070 - 9c 64 1c 10 a9 72 36 50-09 70 2f 47 3c c7 37 69   .d...r6P.p/G<.7i 0080 - fa 24 92 ad a6 d6 03 fe-70 0e 9c de e8 17 bc c5 .$......p....... 0090 - 37 8e f8 3a d6 e5 3b 08-e6 53 63 66 6f ca 5b 42 7..:..;..Scfo.[B 00a0 - 5b 44 e3 c6 11 5e 44 40-a0 f3 45 00 27 5f d0 ed [D...^D@..E.'_.. 00b0 - 3b 46 63 e5 7b 32 83 6b-e0 46 18 68 cb 4f de 13 ;Fc.{2.k.F.h.O.. 00c0 - bb dd 36 48 5d 80 f0 f5-6b 4f 50 7a 1d 7c ee b6 ..6H]...kOPz.|.. Start Time: 1610638387 Timeout : 7200 (sec) Verify return code: 0 (ok) Extended master secret: no Max Early Data: 0 --- read R BLOCK --- Post-Handshake New Session Ticket arrived: SSL-Session: Protocol : TLSv1.3 Cipher : TLS_AES_256_GCM_SHA384 Session-ID: E119A3838D06788059C020BBC49A7A96C5429BD0DE15E3516C25C68A93A478FE Session-ID-ctx: Resumption PSK: A3DFD3B79A4B30E6ED6FB2E0A966F1EBD7D616F462A76094A0F51B4A21F08F5D281B8BC7575A1E2F64FBE75A92562F93 PSK identity: None PSK identity hint: None SRP username: None TLS session ticket lifetime hint: 7200 (seconds) TLS session ticket: 0000 - 4a 69 b6 3e ce 7a 12 e4-76 2d 3c 81 0e 11 78 61 Ji.>.z..v-<...xa 0010 - 95 22 40 76 d1 9e 38 93-0c 7e 74 b1 f5 58 15 70 ."@v..8..~t..X.p 0020 - 37 69 d7 9f 23 5c a6 bc-85 21 06 ad 0b 60 36 68 7i..#\...!...`6h 0030 - ba b3 31 69 6d ac 7a 72-14 c5 bd ac a3 5b 6c 50 ..1im.zr.....[lP 0040 - 54 de 24 a9 50 4c a6 7b-87 61 45 21 db 0c 6b 45 T.$.PL.{.aE!..kE 0050 - ad cd 10 ca b8 6d fe 12-b2 df 61 5e 9d d6 91 c3 .....m....a^.... 0060 - a1 00 c7 fd c5 7b 39 76-6c 55 65 29 b3 55 2d 2b .....{9vlUe).U-+ 0070 - f9 15 52 2c 61 e7 1e 69-bd c7 57 63 b0 4f b9 8d ..R,a..i..Wc.O.. 0080 - 43 73 d6 77 56 3e 46 c6-91 3c 5e 6a 91 da 2e 7a Cs.wV>F..<^j...z
    0090 - 2d c2 68 12 38 f1 ba a2-44 af 4a c1 3d 5a 71 94   -.h.8...D.J.=Zq.
    00a0 - a9 f8 5d 2c 09 6c ca 14-b5 2f 34 ac 62 ab c6 c4   ..],.l.../4.b...
    00b0 - e6 f8 cb b3 26 8a 76 63-49 f0 8f 03 6d 62 85 42   ....&.vcI...mb.B
    00c0 - 28 0c b1 ea 40 d2 f9 e8-a0 17 c9 8e 81 76 92 e6   (...@........v..

    Start Time: 1610638387
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no
    Max Early Data: 0
---
read R BLOCK
* OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SEPCIAL-USE XLIST LITERAL+ AUTH=PLAIN AUTH=LOGIN] Dovecot (Debian) ready.
* BYE Disconnected for inactivity.
closed

Zur Erneuerung des Zertifikats wird, sofern er nicht schon existiert die Zeile: 0 1,13 * * * root /usr/bin/certbot renew –post-hook „systemctl reload dovecot; systemctl reload postfix“ > /dev/null 2>&1 in /etc/crontab angelegt:

echo "0 1,13 * * * root /usr/bin/certbot renew --post-hook \"systemctl reload dovecot; systemctl reload postfix\" > /dev/null 2>&1" >> /etc/crontab

Mit dieser Modifikation funktioniert nun auch die Mailfunktion von Nextcloud problemlos.

kais-universum.de