Postfix“ warning: ไม่สามารถรับ RSA ไพรเวตคีย์จากไฟล์”


14

ฉันเพิ่งทำตามบทช่วยสอนนี้เพื่อตั้งค่าเซิร์ฟเวอร์อีเมล postfix ด้วย dovecot และ mysql เป็นแบ็กเอนด์สำหรับผู้ใช้เสมือน

ตอนนี้ฉันได้งานส่วนใหญ่มาแล้วฉันสามารถเชื่อมต่อกับ POP3 (S) และ IMAP (S) ได้

การใช้

echo TEST-MAIL | mail myaccount@hotmail.com

ทำงานได้ดีเมื่อฉันเข้าสู่บัญชี Hotmail ของฉันมันจะแสดงอีเมล

มันทำงานในสิ่งที่ตรงกันข้ามดังนั้นรายการ MX ของฉันสำหรับexample.comจึงถูกเผยแพร่ในที่สุดดังนั้นฉันจึงสามารถรับอีเมลที่ส่งจากmyaccount@hotmail.comไปยังmyvirtualuser@example.comและดูพวกเขาใน Thunderbird โดยใช้ STARTTLS ผ่าน IMAP

ทำวิจัยเพิ่มเติมอีกเล็กน้อยหลังจากที่ฉันได้รับข้อความแสดงข้อผิดพลาด " 5.7.1: การเข้าถึงรีเลย์ถูกปฏิเสธ " เมื่อพยายามส่งอีเมลไปที่myaccount@hotmail.comโดยใช้ Thunderbird ที่ถูกล็อกอินเข้าสู่myvirtualuser@example.comฉันคิดว่าเซิร์ฟเวอร์ของฉันทำหน้าที่ ในฐานะ "Open Mail Relay" ซึ่ง - ของหลักสูตร - เป็นสิ่งที่ไม่ดี

การขุดเข้าไปในส่วนเพิ่มเติมของบทช่วยสอนเช่นความคิดเห็นนี้และป้อมปราการอื่น ๆฉันตัดสินใจทำตามขั้นตอนเหล่านี้เช่นกันเพื่อให้สามารถส่งอีเมลผ่านmyvirtualuser@example.comผ่าน Mozilla Thunderbird ไม่ได้รับข้อความแสดงข้อผิดพลาด " 5.7.1 : การเข้าถึงรีเลย์ถูกปฏิเสธ "อีกต่อไป (เนื่องจากผู้ให้บริการอีเมลทั่วไปปฏิเสธอีเมลที่เปิดรีเลย์)

แต่ตอนนี้ฉันพบข้อผิดพลาดในการพยายามให้ postfix ทำงานกับ SMTPS ใน/var/log/mail.logอ่าน

Sep 28 17:29:34 domain postfix/smtpd[20251]: warning: cannot get RSA private key from file /etc/ssl/certs/postfix.pem: disabling TLS support
Sep 28 17:29:34 domain postfix/smtpd[20251]: warning: TLS library problem: 20251:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:650:Expecting: ANY PRIVATE KEY:
Sep 28 17:29:34 domain postfix/smtpd[20251]: warning: TLS library problem: 20251:error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib:ssl_rsa.c:669:

ข้อผิดพลาดนั้นถูกบันทึกทันทีที่ฉันลองส่งเมลจากเมลเซิร์ฟเวอร์ที่ติดตั้งใหม่โดยใช้ SMTP SSL / TLS ผ่านพอร์ต 465 ใน Thunderbird ทันเดอร์เบิร์ดบอกฉันว่าหมดเวลาแล้ว

Google มีผลลัพธ์เล็กน้อยเกี่ยวกับปัญหานั้น แต่ฉันไม่สามารถทำงานกับสิ่งเหล่านี้ได้ ฉันจะเชื่อมโยงบางส่วนของพวกเขาที่นี่ แต่ในฐานะผู้ใช้ใหม่ฉันได้รับอนุญาตให้ใช้การเชื่อมโยงหลายมิติสองแห่งเท่านั้น

/etc/postfix/master.cfของฉันดูเหมือนว่า

smtp      inet  n       -       -       -       -       smtpd
smtps     inet  n       -       -       -       -       smtpd
   -o smtpd_tls_wrappermode=yes
   -o smtpd_sasl_auth_enable=yes

และnmapบอกฉัน

PORT     STATE SERVICE
[...]
465/tcp  open  smtps
[...]

/etc/postfix/main.cfของฉันดูเหมือน

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
append_dot_mydomain = no
readme_directory = no
#smtpd_tls_cert_file = /etc/ssl/certs/postfix.pem            #default postfix generated
#smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key #default postfix generated
smtpd_tls_cert_file = /etc/ssl/certs/postfix.pem
smptd_tls_key_file = /etc/ssl/private/postfix.pem
smtpd_use_tls = yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smptd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

myhostname = example.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = localhost.com, localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
mailbox_command = /usr/lib/dovecot/deliver

ไฟล์ * .pem ถูกสร้างขึ้นตามที่อธิบายไว้ในบทช่วยสอนด้านบนโดยใช้

Postfix
To create a certificate to be used by Postfix use:

openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/postfix.pem -keyout /etc/ssl/private/postfix.pem

Do not forget to set the permissions on the private key so that no unauthorized people can read it:

chmod o= /etc/ssl/private/postfix.pem

You will have to tell Postfix where to find your certificate and private key because by default it will look for a dummy certificate file called "ssl-cert-snakeoil":

postconf -e smtpd_tls_cert_file=/etc/ssl/certs/postfix.pem
postconf -e smtpd_tls_key_file=/etc/ssl/private/postfix.pem

ฉันคิดว่าฉันไม่จำเป็นต้องรวม/etc/dovecot/dovecot.confที่นี่เนื่องจากการเข้าสู่ระบบผ่าน imaps และ pop3s ทำงานได้ดีตามบันทึก ปัญหาเท่านั้นที่ทำให้ postfix ใช้ใบรับรองที่สร้างขึ้นเองและลงนามเองอย่างถูกต้อง

ความช่วยเหลือใด ๆ ชื่นชม!

แก้ไข: ฉันเพิ่งลองบทช่วยสอนต่าง ๆ นี้เกี่ยวกับการสร้างใบรับรองแบบลงนามด้วยตนเองสำหรับ postfix แต่ยังคงได้รับข้อผิดพลาดเดียวกัน ฉันไม่รู้จะทดสอบอะไรอีก

ฉันตรวจสอบห้องสมุด SSL ด้วย แต่ดูเหมือนว่าจะใช้ได้ทั้งหมด:

  root@domain:~# ldd /usr/sbin/postfix
    linux-vdso.so.1 =>  (0x00007fff91b25000)
    libpostfix-global.so.1 => /usr/lib/libpostfix-global.so.1 (0x00007f6f8313d000)
    libpostfix-util.so.1 => /usr/lib/libpostfix-util.so.1 (0x00007f6f82f07000)
    libssl.so.0.9.8 => /usr/lib/libssl.so.0.9.8 (0x00007f6f82cb1000)
    libcrypto.so.0.9.8 => /usr/lib/libcrypto.so.0.9.8 (0x00007f6f82910000)
    libsasl2.so.2 => /usr/lib/libsasl2.so.2 (0x00007f6f826f7000)
    libdb-4.8.so => /usr/lib/libdb-4.8.so (0x00007f6f8237c000)
    libnsl.so.1 => /lib/libnsl.so.1 (0x00007f6f82164000)
    libresolv.so.2 => /lib/libresolv.so.2 (0x00007f6f81f4e000)
    libc.so.6 => /lib/libc.so.6 (0x00007f6f81beb000)
    libdl.so.2 => /lib/libdl.so.2 (0x00007f6f819e7000)
    libz.so.1 => /usr/lib/libz.so.1 (0x00007f6f817d0000)
    libpthread.so.0 => /lib/libpthread.so.0 (0x00007f6f815b3000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f6f83581000)

หลังจากทำตามคำแนะนำของAnsgar Wiechersในที่สุดก็ทำงานได้

postconf -nมีเส้นตามที่ควร การตรวจสอบใบรับรอง / คีย์ผ่าน openssl แสดงว่าทั้งสองไฟล์นั้นถูกต้อง

ดังนั้นมันจึงเป็นปัญหาสิทธิ์! ไม่ทราบว่า chown'ing ไฟล์ /etc/ssl/*/postfix.pem ไปยัง postfix: postfix นั้นไม่เพียงพอที่ postfix จะอ่านไฟล์

คำตอบ:


16

เนื้อหาของmain.cfไม่จำเป็นต้องแสดงถึงการกำหนดค่า Postfix ที่ใช้งานอยู่ของคุณ ตรวจสอบผลลัพธ์ของpostconf -nพารามิเตอร์ทั้งสองต่อไปนี้:

smtpd_recipient_restrictions = 
  permit_mynetworks, 
  permit_sasl_authenticated, 
  reject_unauth_destination
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128

หาก$mynetworksถูก จำกัด ไว้ที่ localhost และ$smtpd_recipient_restrictionsแสดงpermit_mynetworks, permit_sasl_authenticated, reject_unauth_destinationเป็นข้อ จำกัด สามข้อแรกแสดงว่าคุณไม่ได้เป็นรีเลย์แบบเปิด

ตรวจสอบว่า/etc/ssl/private/postfix.pemมีรหัสที่ถูกต้องและ/etc/ssl/certs/postfix.pemมีใบรับรองที่ถูกต้อง:

openssl rsa -in /etc/ssl/private/postfix.pem -check -noout
openssl x509 -in /etc/ssl/certs/postfix.pem -text -noout

คุณต้องตรวจสอบว่า Postfix สามารถเข้าถึงไฟล์ได้หรือไม่ บนเซิร์ฟเวอร์ของฉันการอนุญาต/etc/ssl/privateคือ

drwx--x---  2 root ssl-cert  4096 Aug 03 01:55 private/

ดังนั้นเพียงแค่chownนำไฟล์คีย์ไปใช้จะไม่ทำให้คุณดีนักเนื่องจากสิทธิ์ของไดเรกทอรีทำให้ Postfix ไม่สามารถเข้าถึงไฟล์ใด ๆ ในนั้นได้

ลองทำให้การตั้งค่าของคุณง่ายขึ้น ใส่ใบรับรองและรหัสลงในไฟล์เดียว:

cat /etc/ssl/*/postfix.pem > /etc/postfix/server.pem
chmod 640 /etc/postfix/server.pem
chown postfix:postfix /etc/postfix/server.pem

และเปลี่ยนของคุณmain.cfเช่นนี้:

smtpd_tls_cert_file = /etc/postfix/server.pem
smtpd_tls_key_file = $smtpd_tls_cert_file

รีสตาร์ท Postfix และดูว่าเซิร์ฟเวอร์สามารถเข้าถึงคีย์ได้หรือไม่


นั่นคงมันขอบคุณมากที่คุณทั้งสองLadadadadaและAnsgar Wiechers
phew

ขอบคุณสำหรับpostconf -nตอนนี้ คัดลอกและวางส่งผลให้หนึ่งไฟล์ใบรับรองและคีย์ที่ไม่เกี่ยวข้องและมุ่งเน้นไปที่ผลลัพธ์ของนั้นให้ฉันเห็นการพิมพ์ผิดในไฟล์ config ที่ฉันได้ตรวจสอบแล้ว แต่พลาด ...
Adam Kerz

2

คำแนะนำเหล่านั้นมีchmod o= /etc/ssl/private/postfix.pemแต่ไม่พูดอะไรเกี่ยวกับผู้ใช้ที่เป็นเจ้าของไฟล์

ในกล่องของฉันsmtpdกระบวนการทำงานในฐานะpostfixผู้ใช้ ตรวจสอบว่าผู้ใช้สามารถเข้าถึงกระป๋องpostfix หรืออาจจะเป็นเพียงแค่/etc/ssl/private/postfix.pemchown postfix:postfix /etc/ssl/private/postfix.pem

ปัญหาที่ชัดเจนอื่น ๆ คือสิ่งที่ข้อความข้อผิดพลาดระบุว่า: ไม่มีคีย์ RSA ที่ถูกต้องในไฟล์นั้น เข้าไปดู/etc/ssl/private/postfix.pemและตรวจสอบให้แน่ใจว่ามันมีบางอย่างที่ดูเหมือนกุญแจ RSA อย่าวางลงในคำถามของคุณ

อันที่จริงผมเพิ่งสังเกตเห็นว่าเกิดข้อผิดพลาดสำหรับการไม่ได้/etc/ssl/certs/postfix.pem /etc/ssl/private/postfix.pemตรวจสอบความเป็นเจ้าของสิทธิ์และเนื้อหาของ/etc/ssl/certs/postfix.pemเช่นกัน


ข้อความแสดงข้อผิดพลาดนั้นสับสนเล็กน้อย มันบอกว่าแต่คีย์ส่วนตัวควรจะอยู่ในcannot get RSA private key from file /etc/ssl/certs/postfix.pem /etc/ssl/private/postfix.pemฉันมีประสบการณ์ไม่เพียงพอกับ Postfix ที่ใช้ TLS เพื่อทราบว่านี่เป็นข้อผิดพลาด Postfix หรือข้อผิดพลาดในการกำหนดค่าของคุณ


ฉัน chown'ed ทั้งสองไฟล์เป็น postfix: postfix จากนั้นเริ่ม postfix ใหม่ แต่การพยายามส่งอีเมลยังคงทำซ้ำข้อผิดพลาดใน /var/log/mail.log
phew

root @ domain: / etc / ssl / certs # ls -l postfix.pem -rw-r - r-- 1 postfix postfix 1363 Sep 28 16:36 postfix.pemและดูเหมือนว่าจะมีเนื้อหาใบรับรองเริ่มต้นด้วย- --- BEGIN CERTIFICATE -----บรรจุข้อมูลจนถึง----- END CERTIFICATE -----
phew

ฉันก็สงสัยเช่นกันดังนั้นฉันจึงลองสลับไฟล์ แต่นั่นไม่มีเหตุผลที่ไฟล์ใน / certs / ประกอบด้วยส่วนหัวของใบรับรอง "---- BEGIN CERTIFICATE -----" ขอบคุณสำหรับความช่วยเหลือของคุณอย่างไรก็ตาม
Phew

1

Cert ต้องจับคู่กุญแจในกรณีของฉันไม่มีส่วนเกี่ยวข้องกับสิทธิ์

สร้างใบรับรองที่ลงนามด้วยตนเองและคีย์https://msol.io/blog/tech/create-a-self-signed-ssl-certificate-with-openssl/

หวังว่านี่จะช่วยได้


จะดีกว่าไหมถ้าจะใช้ใบรับรองที่เข้ารหัสฟรี
ลูกไก่

ขอบคุณ! คัดลอกและวางส่งผลให้หนึ่งไฟล์ใบรับรองและคีย์ที่ไม่เกี่ยวข้อง
Adam Kerz

0

ตรวจสอบว่าคีย์ไม่มีข้อความรหัสผ่าน คุณสามารถลบออกได้ด้วย

openssl rsa -in key.pem -out newkey.pem

หากพวกเขาใช้ร่วมกัน

openssl rsa -in mycert.pem -out newcert.pem
openssl x509 -in mycert.pem >>newcert.pem

ข้อความรหัสผ่านจะคายคำเตือนในบันทึกที่บอกว่าไม่สามารถรับคีย์ส่วนตัว RSAA ซึ่งจะปิดใช้งานการสนับสนุน TLS หวังว่านี่จะช่วยใครซักคน!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.