下表顯示了電子郵件傳輸的每個步驟中可以使用的協定/連接埠。表格也postfix
透過用 ✘ 或 ✔ 標記來指示我想要在伺服器設定上使用的協定/連接埠。
n | 手術 | 寄件人 | 接收者 | 可能的協定/端口 |
---|---|---|---|---|
1 | 「郵件提交」 | 穆阿 | MSA | (✘) SMTP 25 (✘) SMTP 25 和STARTTLS (✘) SMTP 587 和STARTTLS (✔) SMTPS 465 和隱式 TLS |
2 | “伺服器內部” | MSA | MTA | / |
3… | “郵件中繼” | MTA | MTA | (✘) SMTP 25 (✘) SMTP 25 & STARTTLS (✔) SMTP 25 & STARTTLS & DANE |
n -2 | “伺服器內部” | MTA | 丙二醛 | / |
n - 1 | “伺服器內部” | 丙二醛 | 多發性硬化症 | / |
n | “郵箱訪問” | 多發性硬化症 | 穆阿 | (✘) POP3110 和STARTTLS (✘) POP3S 995 和隱式 TLS(✘) IMAP 143 和STARTTLS (✔) IMAPS 993 和隱式 TLS |
在我繼續之前,我想請您同意或不同意以下兩個假設:
假設A:
我假設從這Postfix 的舊答案服務 465
smtps
沿途被重命名為某個地方。因此我正在使用服務 smtps
為了聽「郵件提交」SMTPS 連接埠465
。
假設B:
我的文件頂部/etc/postfix/master.cf
如下所示:
# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (no) (never) (100)
# ==========================================================================
smtp inet n - y - - smtpd
smtps inet n - y - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_security_level=encrypt
-o smtpd_use_tls=yes
-o smtpd_tls_wrappermode=yes
-o smtpd_tls_protocols=!SSLv2,!SSLv3,!TLSv1,!TLSv1.1
-o smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
-o smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
...
我讀這裡那:
postfix/smtpd
- 是 SMTP 守護程式“接收郵件”並將其路由到適當的內部位置。
postfix/smtp
- 是 SMTP 守護程式“外發郵件”走向世界。
所以現在我假設postfix/smtpd
正在監聽端口465
“收到的電子郵件”25
來自本地用戶和連接埠“收到電子郵件”來自其他地方。我還假設正在使用它發送的postfix/smtp
端口25
“外發電子郵件”。
問題:
當我在某個地方配置 Postfix 時,我禁用了內部的整個 TLS 部分,/etc/postfix/main.cf
因為我不希望全域設定與我在內部設定的各個服務的設定混淆/etc/postfix/master.cf
。
正如您所看到的,我沒有使用任何-o
服務選項,smtp
而我使用了很多-o
服務選項smtps
。最讓我困惑的是,在官方文件中/etc/postfix/main.cf
我可以找到很多幾乎重複的選項,例如:
根據引用的文字我應該使用:
smtp_
以for開頭的“外發郵件”smtpd_
以for開頭的“收到的郵件”。
如果我的理念是正確的,那麼我目前的設定應該可行。部分原因是因為我可以openssl
在另一台電腦上使用指令實作 TLS 1.3 握手,如下所示:
┌───┐
│ $ │ ziga > ziga--workstation > ~
└─┬─┘
└─> openssl s_client -connect pis.eu:465 -tls1_3
CONNECTED(00000003)
depth=0 CN = tek-eu
verify error:num=18:self signed certificate
verify return:1
depth=0 CN = tekpi-eu
verify return:1
---
Certificate chain
0 s:CN = tek-eu
i:CN = tek-eu
---
Server certificate
-----BEGIN CERTIFICATE-----
< REMOVED FOR CLARITY >
-----END CERTIFICATE-----
subject=CN = tek-eu
issuer=CN = tek-eu
---
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 1286 bytes and written 313 bytes
Verification error: self signed certificate
---
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: 18 (self signed certificate)
---
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
Protocol : TLSv1.3
Cipher : TLS_AES_256_GCM_SHA384
Session-ID: 45F832A32F5F27CEAA41B271F28545ECA98DC1AC61F51A484123DD28B2535C30
Session-ID-ctx:
Resumption PSK: 3175AD1641D8D77511FD5C76508D339D01F5D1CE02DBF90F33FEBD334A7E76FD44B52808A846C281616469143977B6F1
PSK identity: None
PSK identity hint: None
SRP username: None
TLS session ticket lifetime hint: 7200 (seconds)
TLS session ticket:
< REMOVED FOR CLARITY >
Start Time: 1607602078
Timeout : 7200 (sec)
Verify return code: 18 (self signed certificate)
Extended master secret: no
Max Early Data: 0
---
read R BLOCK
220 mail.pis.eu -------> "HELLO!"
上面我使用了一個-tls1_3
應該有效的參數,因為我的設定參數-o smtpd_tls_protocols=!SSLv2,!SSLv3,!TLSv1,!TLSv1.1
應該禁止 TLS 1.2 和 TLS 1.3 之外的任何握手。但是如果將參數更改-tls1_3
為-tls1
嘗試 TLS 1 握手,它會成功!
┌───┐
│ $ │ ziga > ziga--workstation > ~
└─┬─┘
└─> openssl s_client -connect pis.eu:465 -tls1
CONNECTED(00000003)
depth=0 CN = tek-eu
verify error:num=18:self signed certificate
verify return:1
depth=0 CN = tek-eu
verify return:1
---
Certificate chain
0 s:CN = tek-eu
i:CN = tek-eu
---
Server certificate
-----BEGIN CERTIFICATE-----
< REMOVED FOR CLARITY >
-----END CERTIFICATE-----
subject=CN = tek-eu
issuer=CN = tek-eu
---
No client certificate CA names sent
Peer signing digest: MD5-SHA1
Peer signature type: RSA
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 1385 bytes and written 227 bytes
Verification error: self signed certificate
---
New, TLSv1.0, Cipher is ECDHE-RSA-AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1
Cipher : ECDHE-RSA-AES256-SHA
Session-ID: C1E39786A475DA48ED222EAB5247CCE57D49875AE9A442A73027FBE1F9BB7C4D
Session-ID-ctx:
Master-Key: 5900F37B79A7949871008A827904F2BA907F42EE8BBC73328CD49DF7E37AF2687C06B316922D7D76DDC36FA1DF912E7A
PSK identity: None
PSK identity hint: None
SRP username: None
TLS session ticket lifetime hint: 7200 (seconds)
TLS session ticket:
< REMOVED FOR CLARITY >
Start Time: 1607602884
Timeout : 7200 (sec)
Verify return code: 18 (self signed certificate)
Extended master secret: yes
---
220 mail.pis.eu -------> "HELLO!"
怎麼會成功呢?我究竟做錯了什麼?目前我的設定只有-o smtpd_
選項。我還應該使用-o smtp_
選項嗎?我該把這些放在哪裡?
正如你所看到的,我很困惑......