smtpd와 관련된 TLS 오류를 해결하는 방법은 무엇입니까?

smtpd와 관련된 TLS 오류를 해결하는 방법은 무엇입니까?

로그에서 다음을 발견했습니다.

sssd_kcm[425899]: Starting up
postfix/submission/smtpd[425910]: initializing the server-side TLS engine
postfix/submission/smtpd[425910]: connect from unknown[::1]
postfix/submission/smtpd[425910]: warning: connect to Milter service unix:/run/spamass-milter/spamass-milter.sock: No such file or directory
postfix/submission/smtpd[425910]: setting up TLS connection from unknown[::1]
postfix/submission/smtpd[425910]: unknown[::1]: TLS cipher list "aNULL:-aNULL:HIGH:MEDIUM:+RC4:@STRENGTH"
postfix/submission/smtpd[425910]: SSL_accept:before SSL initialization
postfix/submission/smtpd[425910]: SSL_accept:before SSL initialization
postfix/submission/smtpd[425910]: SSL_accept:SSLv3/TLS read client hello
postfix/submission/smtpd[425910]: SSL_accept:SSLv3/TLS write server hello
postfix/submission/smtpd[425910]: SSL_accept:SSLv3/TLS write change cipher spec
postfix/submission/smtpd[425910]: SSL_accept:TLSv1.3 write encrypted extensions
postfix/submission/smtpd[425910]: SSL_accept:SSLv3/TLS write certificate
postfix/submission/smtpd[425910]: SSL_accept:TLSv1.3 write server certificate verify
postfix/submission/smtpd[425910]: SSL_accept:SSLv3/TLS write finished
postfix/submission/smtpd[425910]: SSL_accept:TLSv1.3 early data
postfix/submission/smtpd[425910]: SSL3 alert read:fatal:bad certificate
postfix/submission/smtpd[425910]: SSL_accept:error in error
postfix/submission/smtpd[425910]: SSL_accept error from unknown[::1]: -1
postfix/submission/smtpd[425910]: warning: TLS library problem: error:0A000412:SSL routines::sslv3 alert bad certificate:ssl/record/rec_layer_s3.c:1586:SSL alert number 42:
postfix/submission/smtpd[425910]: lost connection after STARTTLS from unknown[::1]
postfix/submission/smtpd[425910]: disconnect from unknown[::1] ehlo=1 starttls=0/1 commands=1/2

이 두 줄은 사용자가 사용자 인증 양식에서 "비밀번호 재설정" 버튼을 누를 때마다 나타납니다. 이는 현재 VPS에서 호스팅되는 모든 Django 프로젝트에서 발생합니다. 따라서 서버는 재설정을 시작하기 위해 이메일을 보내지 않습니다. 대신 사용자의 브라우저에 '서버 오류(500)'가 표시됩니다. 이 현상은 새로운 것입니다. 이 페이지는 몇 달 동안 작동해 왔습니다.

로그 항목을 보면 인증서가 잘못되었음을 나타내는 것 같습니다. 문제를 해결하기 위해 이 서버의 모든 인증서를 업데이트했지만 문제가 지속됩니다. 원격 및 로컬 클라이언트를 통한 메일 제출은 제대로 작동합니다.

이 상황을 해결하는 방법에 대한 지침을 받고 싶습니다.

# 회의 후 grep 인증서 |

smtp_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt
smtp_tls_CApath = /etc/pki/tls/certs
smtp_tls_cert_file =
smtp_tls_dcert_file =
smtp_tls_dkey_file = $smtp_tls_dcert_file
smtp_tls_eccert_file =
smtp_tls_eckey_file = $smtp_tls_eccert_file
smtp_tls_fingerprint_cert_match =
smtp_tls_key_file = $smtp_tls_cert_file
smtp_tls_scert_verifydepth = 9
smtp_tls_secure_cert_match = nexthop, dot-nexthop
smtp_tls_verify_cert_match = hostname
smtpd_tls_ask_ccert = no
smtpd_tls_ccert_verifydepth = 9
smtpd_tls_cert_file = /etc/letsencrypt/live/site.com/fullchain.pem
smtpd_tls_dcert_file =
smtpd_tls_dkey_file = $smtpd_tls_dcert_file
smtpd_tls_eccert_file =
smtpd_tls_eckey_file = $smtpd_tls_eccert_file
smtpd_tls_req_ccert = no
tlsproxy_client_cert_file = $smtp_tls_cert_file
tlsproxy_client_dcert_file = $smtp_tls_dcert_file
tlsproxy_client_eccert_file = $smtp_tls_eccert_file
tlsproxy_client_scert_verifydepth = $smtp_tls_scert_verifydepth
tlsproxy_tls_ask_ccert = $smtpd_tls_ask_ccert
tlsproxy_tls_ccert_verifydepth = $smtpd_tls_ccert_verifydepth
tlsproxy_tls_cert_file = $smtpd_tls_cert_file
tlsproxy_tls_dcert_file = $smtpd_tls_dcert_file
tlsproxy_tls_eccert_file = $smtpd_tls_eccert_file
tlsproxy_tls_req_ccert = $smtpd_tls_req_ccert

답변1

간결한 버전: 나는 항상 바보였습니다.

긴 버전: 문제의 원인은 바로 내 코 밑에 있었다. Django 프로젝트/settings.py 파일에 다음 할당이 있습니다.

EMAIL_HOST = "localhost"

개발 목적상 이는 이해할 수 있습니다. 이 값을 프로덕션 환경에 적용하는 것을 잊었습니다. 이상하게도 이것은 실제로 한동안 효과가 있었습니다. 관련 Django 셸에서 다음 스크립트를 실행할 때까지 할당으로 인해 TLS 핸드셰이크가 실패한다는 사실을 깨닫지 못했습니다.

from django.core.mail import send_mail

send_mail(
    "Test Subject",
    "Mr Elephant is tusking the microphone",
    "[email protected]",
    ["[email protected]"],
    fail_silently=False,
)

산출:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/srv/project/venv/lib64/python3.11/site-packages/django/core/mail/__init__.py", line 87, in send_mail
    return mail.send()
           ^^^^^^^^^^^
  File "/srv/project/venv/lib64/python3.11/site-packages/django/core/mail/message.py", line 298, in send
    return self.get_connection(fail_silently).send_messages([self])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/srv/project/venv/lib64/python3.11/site-packages/django/core/mail/backends/smtp.py", line 127, in send_messages
    new_conn_created = self.open()
                       ^^^^^^^^^^^
  File "/srv/project/venv/lib64/python3.11/site-packages/django/core/mail/backends/smtp.py", line 92, in open
    self.connection.starttls(context=self.ssl_context)
  File "/usr/lib64/python3.11/smtplib.py", line 790, in starttls
    self.sock = context.wrap_socket(self.sock,
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib64/python3.11/ssl.py", line 517, in wrap_socket
    return self.sslsocket_class._create(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib64/python3.11/ssl.py", line 1108, in _create
    self.do_handshake()
  File "/usr/lib64/python3.11/ssl.py", line 1379, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Hostname mismatch, certificate is not valid for 'localhost'. (_ssl.c:1006)

마지막 줄이 나를 위해 해냈습니다. 물론 이로 인해 로그에 정확한 항목이 트리거되었습니다. 나는 매우 미안 해요!

수리하다:

EMAIL_HOST = "mail.servername.com"

관련 정보