리턴 메일(메시지) : Not complied TLS minimum version

    ◈ 리턴 메시지

    Status: 554 5.7.1 Not complied TLS minimum version

    「번역」 TLS 최소 버전을 준수하지 않습니다.

    → 이게 어떤 상황이냐면 발송자의 메일서버는 최신 「TLSv1.3」이 적용된 업체였습니다. 그럼에도 메일 발송 시 TLS 최소 버전을 준수하지 않습니다라는 리턴메시지를 받은 상태입니다. 알고 보니 수신 측이 발송서버에서 SMTP 통신을 할 때 EHLO요청을 받으면 발송 서버의 TLS 적용되어 있는 모든 버전을 체크하는 것으로 보입니다. 메일서버가 TLS 프로토콜을 강제로 지정을 하지 않았다면 대체로 기본값으로 「TLSv1, TLSv1.1, TLSv1.2, TLSv1.3」 전부 활성화가 되어 있습니다. 현재 권장 프로토콜은 최소 「TLSv1.2」 이상입니다. 발송서버가 TLS 프로토콜을 「TLSv1.2, TLSv1.3」으로만 통신할 수 있도록 강제로 지정을 해야 메일을 받을 수 있을 것으로 추측됩니다. (이제 슬슬 강제로 적용하는 업체가 나오기 시작하네요.)

     

    웹 브라우저 제공 업체들은 이미 2020년부터 「TLSv1 , TLSv1.1」 지원을 종료하였습니다. 브라우저는 구글「Chrome」, MS「Edge」등을 말하며 웹은 눈에 보이기 때문에 금방 사용자/관리자들에게 전파가 되고 있지만 메일 발송을 처리하는 SMTP SSL/TLS 쪽은 아직도 생소하게 느끼시는 분들이 많을 겁니다.

    ▣ 잠시 추가 설명을 드리자면 메일은 메일 전송 프로토콜「SMTP」 「25 / 587 / 465 포트」 약속된 고정 포트를 이용하여 메일을 발송합니다. 처음에는 25 포트를 이용하여 평문 전송으로 시작되었습니다. 하지만 사용자가 많아지면서 평문 통신이 네트워크 취약점에 노출이 되면서 악용되는 사례가 많이 나오기 시작합니다. 그래서 처음부터 신뢰할 수 있는 네트워크 통신을 위한 SSL(Secure Sockets Layer) 프로토콜 버전이 나오게 됩니다. 신뢰할 수 있는 인증서를 적용하고 나면 처음부터 보안연결로 통신하기 위해 465 포트를 사용합니다.

     

    그러나 시대의 흐름에 따라 SSL프로토콜도 취약점이 많아지면서 이를 대폭 개선한 TLS(Transport Layer Security) 프로토콜이 새로 나오게 됩니다. 이때 25 포트를 대체하기 위한 587 포트도 같이 나오는데 메일 오픈소스인 Sendmail/Postfix 같은 환경설정을 보면 서브미션(포트)「Submission」라고도 합니다. 의외로 465보다 587 포트가 나중에 나왔습니다. 추가로 평문 발송을 시도하는 25/587 포트에도 암호화를 사용하기 위해 「STARTTLS」라는 기술이 적용됩니다.

    SSL/TLS가 많이 혼동될 수 있는데 둘은 태생이 같다고 생각하시면 편합니다. 즉 취약점을 보완 및 업그레이드하면서 SSL에서 TLS로 이름이 변경된 부분입니다. 순서로 보면 SSLv1 → SSLv2 → SSLv3 → TLSv1.0 → TLSv1.1 → TLSv1.2 → TLSv1.3 (2018년 8월 RFC8446 게시)」로 업그레이드 되었습니다. 사실상 「SSL, TLSv1.0, TLSv1.1」까지 대부분의 비중 있는 기업들은 2020년 말부터 지원을 중단했다고 봐도 됩니다. 그래서 아직까지는 안전한 최소 「TLSv1.2」 이상을 사용하라고 권고를 하고 있습니다. 하지만 TLSv1.2도 언제 도태될지 알 수 없으므로 최근 서버를 새로 구축을 한다면 무조건 「TLSv1.3」을 적용하는 게 좋습니다.


    다시 본론으로 들어와서, 그럼 수신 측으로 메일을 보내기 위해 TLSv1.2 최소 버전 이상으로 어떻게 해야 할까요? 먼저 본인의 메일서버가 TLS를 사용한다면 어떤 버전을 사용하고 있는지 확인해 보겠습니다.

     

    ◈ OpenSSL 명령어를 이용

    ※ OpenSSL(> 1.1.1) 일정버전 이상으로 TLSv1.3까지 지원해야 확인 가능

    ▣ 버전별 확인 [결과 스크린샷 참고]

    [root@mail postfix]# openssl s_client -connect localhost:587(or 25) -starttls smtp -tls1

    [root@mail postfix]# openssl s_client -connect localhost:587 -starttls smtp -tls1_1

    [root@mail postfix]# openssl s_client -connect localhost:587 -starttls smtp -tls1_2

    [root@mail postfix]# openssl s_client -connect localhost:587 -starttls smtp -tls1_3

     

    아래와 같이 응답을 하면 해당 TLS 버전이 활성화되어 있다고 보면 됩니다.


    ◈ 최소 TLSv1_2, TLSv1_3 설정 「Postfix 오픈솔루션 예시」

    ※ 개인 클라우드서버 Postfix로 구성된 메일서버에서 테스트하였습니다.

    ※ Postfix 공식 홈페이지 문서 : How Postfix TLS support works

     

    ▣ 문서에서는 사용하지 않는 값만 등록하면 된다고 합니다. (제외할 프로토콜이 아닌 포함할 프로토콜을 나열하는 것은 지원되지만 권장하지는 않습니다) 필자는 테스트해 보니 특별히 문제는 없어서 눈에 보이는 게 가독성이 좋으므로 위와 같이 등록

     

    ※ 예시

    # Preferred syntax with Postfix ≥ 3.6    [3.6 버전 이상] 선호 구문

    smtpd_tls_protocols = >=TLSv1, <=TLSv1.3    [TLSv1 이상 TLSv1.3 이하]

    smtpd_tls_protocols = >=TLSv1.2, <=TLSv1.3    [TLSv1.2 이상 TLSv1.3 이하 (권장)]

     

    # Legacy syntax    [이전 버전 구문, 테스트 버전 : 3.5.8]

    smtpd_tls_protocols = !SSLv2, !SSLv3    [TLSv1 이상만 사용]

    smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1    [TLSv1.2 이상만 사용 (권장)]

    프로그래밍 소스에서 느낌표는 반대의 개념으로, !붙으면 사용 안 함(false)으로 보면 된다.

     

    PS.

    smtpd_tls_protocols = 기회주의적(선택적) TLS 암호화
    smtpd_tls_mandatory_protocols = 필수(의무적인) TLS 암호화 (※ 수신 측이 이런 옵션을 적용했을 확률이 높음)


    아 마지막으로 STARTTLS 통신할 때는 양쪽 모두가 최신 TLSv1.3으로 적용되어 있어야 같은 버전으로 통신합니다. 만약 수신 측 메일서버가 TLSv1.1로 적용되어 있다면 TLSv1.1로 통신하게 됩니다. 이것도 선택적 TLS로 설정되어 있으면 다행이지만 강제로 적용되어 있다면 메일을 거부할 수 있습니다.

     

    흠.. 이렇게 길게 적을게 아니었던 것 같은데 자료수집을 하다 보니 내용이 길어졌네요. RoundCube 쪽 Postfix설정을 하게 되면 다시 한번 정리해서 포스팅을 해봐야겠습니다. 대략 이론적으로만 설명을 했는데 내용 전달이 될지 모르겠네요. 요즘 이상하게 밤에 잠이 잘 안 와서 이 시간 때에 포스팅을 하는 경우가 잦네요.

    Designed by JB FACTORY