Replikation über SSL: Received invalid SSL certificate: unable to get local issuer certificate

Lukas lukas.meuerer at gmail.com
Sa Jul 14 12:44:11 CEST 2018


Hallo,

ich versuche die Replikation über TCP mit SSL zwischen zwei Dovecot 2.2.10
Servern auf RHEL 7.5 zum Laufen zu bekommen.

Sobald die Replikation beginnt oder ich sie z. B. versuche mittels "doveadm
replicator replicate lukas" anzustoßen, wird auf dem Server auf dem ich den
Befehl ausführe folgendes geloggt:

Jul 14 08:57:40 server1 dovecot: doveadm(lukas): Received invalid SSL
certificate: unable to get local issuer certificate: /CN=server2.domain.tld
Jul 14 08:57:40 server1 dovecot: doveadm(lukas): Error: doveadm server
disconnected before handshake: Received invalid SSL certificate: unable to
get local issuer certificate: /CN=server2.domain.tld
Jul 14 08:57:40 server1 dovecot: doveadm(lukas): Error: sync: Disconnected
from remote: Received invalid SSL certificate: unable to get local issuer
certificate: /CN=server2.domain.tld

Das Problem liegt wohl in der Zertifikat-Chain. Wenn ich mit openssl auf
den dsync Port 12345 connecte sehe ich dass nur das Zertifikat für den
Host, nicht aber die volle Chain geliefert wird:

# openssl s_client -connect server1.domain.tld:12345
CONNECTED(00000003)
depth=0 CN = server1.domain.tld
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = server1.domain.tld
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
 0 s:/CN=server1.domain.tld
   i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
---

Beide Server haben jedoch in "ssl_client_ca_file" den Pfad zum
Zertifikatsbundle von RHEL. Testweise habe ich das IdenTrust cross-signed
Intermediate Zertifikat von https://letsencrypt.org/certificates/
runtergeladen und "ssl_client_ca_file" auf die Datei gesetzt. Dann ändert
sich der Fehler auf:
doveadm(lukas): Received invalid SSL certificate: unable to get issuer
certificate: /C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3

Auf der anderen Seite kann openssl die Chain wohl prüfen wenn ich sie mit
dem lets-encrypt-x3-cross-signed.pem.txt Intermediate Zertifikat prüfe:

# openssl s_client -connect server1.domain.tld:12345 -CAfile
/etc/dovecot/lets-encrypt-x3-cross-signed.pem.txt
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 = Let's Encrypt Authority X3
verify return:1
depth=0 CN = server1.domain.tld
verify return:1
---
Certificate chain
 0 s:/CN=server1.domain.tld
   i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
---

Beide Server verwenden die unten stehende dovecot.conf Datei. Sie
unterscheiden sich nur in den Pfaden zu den jeweils eigenen SSL Keys und
Zertifikaten, sowie im "mail_replica" Parameter, der auf den jeweils
anderen Host zeigt.

Ich habe schon mehrfach alles mit dem Artikel über Replikation im Wiki und
anderen Webseiten abgegleichen, aber finde leider keine Lösung.

Grüße
Lukas




# 2.2.10: /etc/dovecot/dovecot.conf
# OS: Linux 3.10.0-862.6.3.el7.x86_64 x86_64 Red Hat Enterprise Linux
Server release 7.5 (Maipo) xfs
auth_mechanisms = plain login
auth_username_format = %n
doveadm_password = ein_langes_sicheres_passwort
doveadm_port = 12345
first_valid_uid = 97
mail_gid = dovecot
mail_home = /var/spool/dovecot/%u
mail_location = sdbox:/var/spool/dovecot/%u
mail_plugins = " notify replication"
mail_uid = dovecot
namespace inbox {
  inbox = yes
  location =
  mailbox Drafts {
    auto = subscribe
    special_use = \Drafts
  }
  mailbox Sent {
    auto = subscribe
    special_use = \Sent
  }
  mailbox Spam {
    auto = subscribe
  }
  mailbox Trash {
    auto = subscribe
    special_use = \Trash
  }
  prefix =
}
passdb {
  args = scheme=SSHA512 username_format=%n /etc/dovecot/passwd
  driver = passwd-file
}
plugin {
  mail_replica = tcps:server2.domain.tld:12345
  replication_sync_timeout = 2
}
service auth {
  unix_listener auth-userdb {
    mode = 0600
  }
}
service doveadm {
  inet_listener {
    port = 12345
    ssl = yes
  }
}
service imap-login {
  inet_listener imap {
    port = 0
  }
  inet_listener imaps {
    address = 62.x.x.x,2a03:x:x:x:x:x:x:x
    port = 993
  }
}
service lmtp {
  inet_listener lmtp {
    address = localhost
    port = 7124
  }
}
service pop3-login {
  inet_listener pop3 {
    port = 0
  }
  inet_listener pop3s {
    address = 62.x.x.x,2a03:x:x:x:x:x:x:x
    port = 995
  }
}
service replicator {
  process_min_avail = 1
  unix_listener replicator-doveadm {
    mode = 0660
  }
}
ssl = required
ssl_cert = </etc/letsencrypt/live/server1.domain.tld/fullchain.pem
ssl_cipher_list =
ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384
ssl_client_ca_file = /etc/pki/tls/cert.pem
ssl_key = </etc/letsencrypt/live/server1.domain.tld/privkey.pem
ssl_prefer_server_ciphers = yes
ssl_protocols = !SSLv3 !SSLv2
userdb {
  args = username_format=%n /etc/dovecot/passwd
  driver = passwd-file
  result_failure = return-fail
  result_internalfail = return-fail
}
-------------- nächster Teil --------------
Ein Dateianhang mit HTML-Daten wurde abgetrennt...
URL: <https://listen.jpberlin.de/pipermail/dovecot/attachments/20180714/5ee74a40/attachment.html>


Mehr Informationen über die Mailingliste Dovecot