Ssl

SSL 錯誤:找不到從葉證書到任何根的路徑。可能缺少中間證書

  • October 2, 2020

我已經使用 postfix、postfix-saslauth、courier(mysqlauthd、imap、pop)以及 SPF、DKIM 和 DMARC 等一些良好實踐設置了個人郵件伺服器。

這種設置在過去 10 年中一直執行良好,今天,我第一次嘗試通過需要有效 POP3 服務的 GMail 添加其中一個帳戶的訪問權限。我可以通過埠 110 上的 POP3 服務(無安全性和/或加密)成功添加帳戶。

當我嘗試將 GMail 配置為通過 995 埠上的 POP3 服務訪問帳戶時出現問題,使用安全性。這樣做時,我從 GMAIL 收到以下錯誤:

SSL error: No path found from the leaf certificate to any root. Maybe an intermediate certificate is missing

我已經下載了 Mozilla Thunderbird,我可以通過埠 995 上的 POP3 服務毫無問題地下載電子郵件,所以我的問題是:有誰知道如何用 GMail 解決這個問題?

以下是我的 courier-pop3d-ssl 配置:

SSLPORT=995
SSLADDRESS=0
SSLPIDFILE=/run/courier/pop3d-ssl.pid
SSLLOGGEROPTS="-name=pop3d-ssl"
POP3DSSLSTART=YES
POP3_STARTTLS=YES
POP3_TLS_REQUIRED=0
COURIERTLS=/usr/bin/couriertls
TLS_STARTTLS_PROTOCOL="$TLS_PROTOCOL"
TLS_CIPHER_LIST="TLSv1:HIGH:!LOW:!MEDIUM:!EXP:!NULL:!aNULL@STRENGTH"
TLS_STARTTLS_PROTOCOL="$TLS_PROTOCOL"
TLS_CERTFILE=/etc/courier/certificates/certificate.pem
TLS_PRIVATE_KEYFILE=/etc/courier/certificates/tls_private_keyfile.pem
TLS_DHPARAMS=/etc/courier/certificates/dhparams.pem
TLS_TRUSTCERTS=/etc/ssl/certs/ca-certificates.crt
TLS_VERIFYPEER=NONE
TLS_CACHEFILE=/var/lib/courier/couriersslimapcache
TLS_CACHESIZE=524288
MAILDIRPATH=Maildir

這是一些 SSL 證書資訊:

## Letsencrypt CRT + Key cert files
cat /etc/letsencrypt/live/mydomain.com/cert.pem /etc/letsencrypt/live/mydomain.com/privkey.pem >> /etc/courier/certificates/letsencrypt-mydomain_com_crt_key.pem

ls -la /etc/courier/certificates/certificate.pem
lrwxrwxrwx 1 root courier 60 Oct  2 20:24 /etc/courier/certificates/certificate.pem -> /etc/courier/certificates/letsencrypt-mydomain_com_key.pem

ls -la /etc/courier/certificates/tls_private_keyfile.pem
lrwxrwxrwx 1 root courier 47 Oct  1 17:45 /etc/courier/certificates/tls_private_keyfile.pem -> /etc/letsencrypt/live/mydomain.com/privkey.pem

我的 SSL 證書是通過 Letsencrypt 生成的:

ls -la /etc/letsencrypt/live/mydomain.com/
total 12
drwxr-xr-x 2 root root 4096 Oct  2 14:35 .
drwx------ 8 root root 4096 Oct  2 14:35 ..
lrwxrwxrwx 1 root root   37 Oct  2 14:35 cert.pem -> ../../archive/mydomain.com/cert1.pem
lrwxrwxrwx 1 root root   38 Oct  2 14:35 chain.pem -> ../../archive/mydomain.com/chain1.pem
lrwxrwxrwx 1 root root   42 Oct  2 14:35 fullchain.pem -> ../../archive/mydomain.com/fullchain1.pem
lrwxrwxrwx 1 root root   40 Oct  2 14:35 privkey.pem -> ../../archive/mydomain.com/privkey1.pem
-rw-r--r-- 1 root root  692 Oct  2 14:35 README

這是我在/var/log/mail.logGMail 嘗試通過埠 995 上的 POP3 服務連接時看到的錯誤:

Oct  2 21:12:15 we pop3d-ssl: Connection, ip=[::ffff:74.120.14.35]
Oct  2 21:12:16 we pop3d-ssl: ip=[::ffff:74.120.14.35], Unexpected SSL connection shutdown.
Oct  2 21:12:16 we pop3d-ssl: Disconnected, ip=[::ffff:74.120.14.35]

我應該在某處連接中間體和葉(伺服器)證書嗎?如何?按什麼順序?

提前致謝

解決方案:

根據 courier-mta.org,生成的 TLS_CERTFILE 包括證書和私鑰。文件名不能是世界可讀的,並且必須在沒有密碼的情況下可以訪問,即它不能被加密。

所以要解決這個問題,我必須按照這個嚴格的順序連接 Letsencrypt CRT + CHAIN + KEY:

cat /etc/letsencrypt/live/mydomain.com/cert.pem /etc/letsencrypt/live/mydomain.com/chain.pem /etc/letsencrypt/live/mydomain.com/privkey.pem >> /etc/courier/certificates/certificate.pem.mydomain.com

TLS_CERTFILE=/etc/courier/certificates/certificate.pem

該文件應該是 cert.pem 和 chain.pem 的組合 - 這應該與 fullchain.pem 相同。雖然尚不完全清楚您真正在做什麼(您使用的文件名存在一些不匹配,可能是拼寫錯誤),但看起來您正在組合證書和私鑰。

引用自:https://serverfault.com/questions/1036179