ฉันมี Postfix Ubuntu VM ที่ทำหน้าที่เป็นเซิร์ฟเวอร์ส่งต่อเมล ซึ่งรับเมลที่พอร์ต 25 และส่งต่อไปยัง Microsoft Exchange ทางออนไลน์เพื่อการจัดส่ง มันใช้งานได้ดีมาหลายเดือนแล้ว

ตอนนี้ฉันต้องอนุญาตให้ไคลเอ็นต์ SMTP ซึ่งต้องใช้ TLS เพื่อส่งอีเมลผ่านการส่งต่อด้วย ฉันได้เพิ่มสิ่งต่อไปนี้ใน Postfix main.cf ของฉันแล้ว:

smtpd_tls_security_level = may
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1
smtpd_tls_chain_files =
        ${cert_path}/cert.pem,
        ${cert_path}/chain.pem

อย่างไรก็ตามเมื่อฉันลอง swaks ด้วยแฟล็ก --tls-on-connect ฉันได้รับ "การเชื่อมต่อถูกปฏิเสธ" บนพอร์ต 465 และ 587 พอร์ตเก่าที่ไม่ได้เข้ารหัส 25 รายการยังคงใช้งานได้ ไฟล์ pem ถูกสร้างขึ้นโดย Let's Encrypt และส่วนเคาน์เตอร์คีย์ส่วนตัวทำงานเพื่อเข้ารหัสจดหมายขาออกไปยัง Exchange ออนไลน์ ฉันได้ตรวจสอบพวกเขาด้วย:

openssl verify -purpose sslserver  -partial_chain -CAfile /etc/letsencrypt/live/<server FQDN>/chain.pem /etc/letsencrypt/live/<server FQDN>/cert.pem

อย่างไรก็ตาม เมื่อฉันพยายามทำการเชื่อมต่อ TLS จากไคลเอนต์ SMTP สิ่งนี้จะปรากฏในบันทึก:

Mar 18 14:41:49 hermes postfix/smtpd[578652]: warning: error loading chain from /etc/letsencrypt/live/<server FQDN>/cert.pem: key not first
Mar 18 14:41:49 hermes postfix/smtpd[578652]: warning: error loading private keys and certificates from: /etc/letsencrypt/live/<server FQDN>/cert.pem,?/etc/letsencrypt/live/<server FQDN>/chain.pem: disabling TLS support

ฉันคิดว่าคำถามที่ฉันกำลังเผชิญคือวิธีใช้ใบรับรอง Let's Encrypt SSL เพื่อเปิดใช้งาน TLS บนเซิร์ฟเวอร์ส่งต่อเมลของฉัน

answer

ทั้ง Certbot chainและcertไฟล์ไม่มีคีย์ส่วนตัวของเซิร์ฟเวอร์ ข้อความแสดงข้อผิดพลาดทั้งสองเป็นเพียงการร้องเรียนเกี่ยวกับเรื่องนั้น คีย์มีอยู่ในprivkeyไฟล์เท่านั้น

หากคุณต้องการใช้ไฟล์เดียวที่มีทั้งคีย์และใบรับรอง คุณจะต้องต่อไฟล์ด้วยตนเอง (เช่น ในการโพสต์ฮุค) และตรวจดูให้แน่ใจว่าprivkeyเนื้อหาดำเนินการก่อน จากนั้นcertจึงchainเรียงลำดับตามนี้

สังเกตว่าfullchainไฟล์มีการต่อกันchainและcertอยู่ในลำดับที่ถูกต้องอยู่แล้ว เพียงชี้ไปที่ไฟล์ใบรับรองสำเร็จรูปนี้ นอกจากนี้ Postfix ไม่ต้องการให้ทุกอย่างอยู่ในไฟล์เดียว มีตัวเลือกเฉพาะให้ชี้ไปที่ไฟล์คีย์

ฉันใช้ certbot กับ Postfix ดังนี้:

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