在本指南中,我們將展示如何在典型的 Postfix-Dovecot 郵件伺服器上為傳入和傳出連接啟用受信任的 SSL/TLS 加密的可能方法。
我們使用了 PositiveSSL 證書進行測試;不過,ZTABOX 提供的任何證書都能保護此類型的郵件伺服器。測試是在以下伺服器堆疊上進行的:
- Ubuntu 16.04
- Postfix 3.1.0
- Dovecot 2.2.22
如果您尚未為您的郵件伺服器主機名獲得有效的 SSL 證書,請隨時購買一個,生成 CSR 代碼並激活它。
當證書發出後,可以從 ZTABOX 電子郵件或由證書授權機構發送到證書管理聯繫電子郵件地址的履行電子郵件中下載。
在伺服器上上傳和串聯證書文件
- 證書文件 yourdomainname.crt 需要與 CA 包一起上傳到伺服器,CA 包可以是單個文件(yourdomainname.ca-bundle)或是分開的文件(COMODORSADomainValidationSecureServerCA.crt, COMODORSAAddTrustCA.crt, AddTrustExternalCARoot.crt,如我們的情況)。我們已將證書和 CA 包文件保存在/etc/ssl/certs/ 目錄中,並將相應的私鑰 (yourdomainname.key)保存在/etc/ssl/private/ 文件夾中。
- 使用以下命令之一串聯上傳的文件:
- 創建一個包含葉子(伺服器)證書和 CA 鏈的文件:- cat /etc/ssl/certs/yourdomainname.crt /etc/ssl/certs/yourdomainname.ca-bundle >> /etc/ssl/certs/certificate.crt
- cat /etc/ssl/certs/yourdomainname.crt /etc/ssl/certs/COMODORSADomainValidationSecureServerCA.crt /etc/ssl/certs/COMODORSAAddTrustCA.crt /etc/ssl/certs/AddTrustExternalCARoot.crt >> /etc/ssl/certs/certificate.crt
- Postfix 和 Dovecot 可以接受存儲在單個文件中的證書、CA 鏈和私鑰。使用以下命令之一來創建它:- cat /etc/ssl/certs/yourdomainname.crt /etc/ssl/certs/yourdomainname.ca-bundle /etc/ssl/private/yourdomainname.key >> /etc/ssl/certs/certificate_and_key.crt
- cat /etc/ssl/certs/yourdomainname.crt /etc/ssl/certs/COMODORSADomainValidationSecureServerCA.crt /etc/ssl/certs/COMODORSAAddTrustCA.crt /etc/ssl/certs/AddTrustExternalCARoot.crt /etc/ssl/private/yourdomainname.key >> /etc/ssl/certs/certificate_and_key.crt
要檢查新創建文件的內容,運行 cat /etc/ssl/certs/certificate.crt 或 cat /etc/ssl/certs/certificate_and_key.crt。確保輸出中證書和密鑰塊之間或內部不包含多餘的空白。如果您看到空格,可以在如 'vi' 或 'nano' 的文本編輯器中打開文件並手動刪除它們。
編輯 Postfix 和 Dovecot 配置文件以在特定端口啟用 SSL/TLS
通過互聯網發送和接收郵件依賴於一個複雜的端點和中介實例系統(郵件伺服器和客戶端軟件),根據其執行的功能被標記為郵件用戶代理 (MUA)、郵件提交代理 (MSA)、郵件傳輸代理 (MTA) 和郵件交付代理 (MDA)。通常,電子郵件會在上述每種類型的各方之間傳遞,並且在每一步都使用不同的傳輸協議,即提交協議、簡單郵件傳輸協議 (SMTP)、郵局協議 (POP3) 和互聯網消息訪問協議 (IMAP)。
以下表格指定了用於特定傳輸協議執行的端口。
| 協議 | 用途 | 明文/加密會話 | 僅加密會話 |
|---|---|---|---|
| POP3 | 傳入郵件 | 110 | 995 |
| IMAP | 傳入郵件 | 143 | 993 |
| SMTP | 傳出郵件 | 25 | 465 |
| 提交 | 傳出郵件 | 587 |
在明文(未加密)或安全(加密)模式下使用端口 25、110、143 和 587 的可能性來自於機會性 TLS 方法,根據該方法,當存在活動的明文會話時,將調用 STARTTLS 命令。
使用端口 465、993 和 995 的技術側面類似於 HTTP 協議在 SSL/TLS 上的使用:1) 安全端口與其 "未安全" 對應端口分開;2) 建立加密會話在任何數據交換之前進行。
注意:雖然端口 465 在 IANA 的文檔中並未正式標準化為 SMTPS 端口,但郵件伺服器管理員一直在使用和使用它來提供加密的傳出郵件流量。
事實上,這兩種描述的技術現在都廣泛應用於互聯網郵件系統中,良好的安全實踐是在您計劃使用的每個郵件端口上應用 SSL 證書。
現在讓我們繼續,為傳入和傳出郵件端口啟用 SSL 證書。
端口 25 (SMTP 與 STARTTLS)
打開 Postfix 的 main.cf 配置文件進行編輯。它通常存儲在 /etc/postfix/ 目錄中。找到 main.cf 內的 TLS 參數部分,並根據以下顯示的方式更改某些指令的值:
- 如果證書和私鑰保存在分開的文件中:
smtpd_tls_cert_file=/etc/ssl/certs/certificate.crt
smtpd_tls_key_file=/etc/ssl/private/yourdomainname.key - 如果證書和私鑰保存在單個文件中:
smtpd_tls_cert_file=/etc/ssl/certs/certificate_and_key.crt
smtpd_tls_key_file=$smtpd_tls_cert_file - 確保 smtpd_use_tls 指令設置為 yes:
smtpd_use_tls=yes
關閉 main.cf 文件並保存更改。

端口 587 (提交與 STARTTLS) 和 465 (SMTPS)
打開位於 /etc/postfix/ 目錄中的 Postfix 的 master.cf 文件,並取消註釋(如有需要可進行編輯)以下行:
- 為端口 587 打開和保護:
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=may
-o smtpd_sasl_auth_enable=yes - 為端口 465 打開和保護:
smtps inet n - y - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
現在可以關閉 master.cf 文件。

端口 110 (POP3 與 STARTTLS)、143 (IMAP 與 STARTTLS)、993 (IMAPS) 和 995 (POP3S)
要為 Dovecot 啟用 SSL 證書,打開 10-ssl.conf 文件,通常位於 /etc/dovecot/conf.d/ 目錄中,並編輯以下行:
- 如果證書和私鑰保存在分開的文件中:
ssl_cert = ssl_key = - 如果證書和私鑰保存在單個文件中:
ssl_cert = ssl_key = - ssl 指令應設置為 yes:
ssl = yes
現在您可以關閉 10-ssl.conf 文件並保存更改。完成了。應用上述更改後,證書已為所有傳入端口安裝。

如果您的 Dovecot 版本為 1.x,配置文件中的 SSL 指令略有不同:
- 確保 /etc/dovecot/dovecot.conf 有以下行:
protocols = imap pop3 imaps pop3s
- 按如下方式編輯 /etc/dovecot/conf.d/10-ssl.conf 文件:
ssl_disable = no
- 如果證書和私鑰保存在分開的文件中
ssl_cert_file = ssl_key_file =- 如果證書和私鑰保存在單個文件中
ssl_cert_file = ssl_key_file =
進階調整
這一部分簡要描述了一些額外的設置,對於微調您的郵件伺服器的 SSL/TLS 處理非常有用。隨意閱讀Postfix和Dovecot的官方文檔以了解更多相關信息。
- 可以在 Postfix 中使用 'wrapper' 模式的 STARTTLS 端口,通過 smtpd_tls_wrappermode 指令實現,這意味著從一開始就初始化安全連接,而不是宣佈支持 STARTTLS 並等待來自遠程客戶端的請求。該指令應添加到 /etc/postfix/master.cf(見下例):
smtps inet n - n - - smtpd
-o smtpd_tls_wrappermode=yes - 在 Dovecot 上,您可以將 ssl 指令設置為所需值 (ssl=required),這意味著在任何登錄嘗試之前強制進行 SSL 握手。因此,密碼將僅通過加密通道傳送,而使用 ssl = yes 時郵件客戶端不需要優先使用 SSL/TLS。此設置適用於明文和非明文身份驗證機制。
- 要禁用明文身份驗證機制,您可以使用 disable_plaintext_auth 指令 (/etc/dovecot/conf.d/10-auth.conf):
disable_plaintext_auth=yes
- 要消除由於加密強度低而最好不使用的密碼,您可以在 Dovecot 上設置以下指令 (/etc/dovecot/dovecot.conf):
ssl_dh_parameters_length = 2048
ssl_cipher_list = ALL:!LOW:!SSLv2:!EXP:!aNULL - 在 Postfix 中,smtpd_tls_ciphers 參數控制最低的密碼等級,默認設置為中等級別,足以提供穩健的安全性。如果需要排除某些密碼或協議以進行機會性(STARTTLS)或強制性(常規 SSL)加密,請在 /etc/postfix/main.cf 中使用以下指令並為它們分配相應的值:
- 針對強制 TLS
smtpd_tls_mandatory_exclude_ciphers = [cipher]
smtpd_tls_mandatory_protocols = ![protocol]- 針對機會性 TLS
smtpd_tls_exclude_ciphers = [cipher]
smtpd_tls_protocols = ![protocol] - 要優先使用服務器端的密碼列表而不是客戶端的,您可以使用以下指令:
- 在 Dovecot (/etc/dovecot/conf.d/10-ssl.conf)
ssl_prefer_server_ciphers = yes- 在 Postfix (/etc/postfix/main.cf)
tls_preempt_cipherlist = yes
檢查 SSL 安裝
使用 OpenSSL
OpenSSL 工具包允許檢查伺服器上的 SSL 證書安裝,可以遠程或本地進行。要檢查 STARTTLS 端口,運行以下命令,將 [port] 替換為端口號,將 [protocol] 替換為 smtp、pop3 或 imap 值(見以下示例):
openssl s_client -connect example.com:[port] -servername example.com -starttls [protocol]
同樣的命令但不加 -starttls 開關可用於檢查非 STARTTLS 端口:
openssl s_client -connect example.com:[port] -servername example.com

使用在線檢查工具
還有許多在線工具可以檢查您的郵件伺服器是否支持 SSL/TLS。您只需輸入伺服器主機名和端口號或現有的電子郵件帳戶,然後運行測試,通常只需幾分鐘即可完成。您可以在下面找到這些測試工具的鏈接:
SSL-Tools
CheckTLS
MXToolbox
High-Tech Bridge