%EB%A1%9C%EB%B6%80%ED%84%B0%20%EC%9D%B4%EB%A9%94%EC%9D%BC%EC%9D%84%20%EB%B0%9B%EC%9D%84%20%EC%88%98%20%EC%97%86%EC%A7%80%EB%A7%8C%20%EB%8B%A4%EB%A5%B8%20%EA%B2%83%EB%93%A4%EC%9D%80%20%EA%B4%9C%EC%B0%AE%EC%8A%B5%EB%8B%88%EB%8B%A4.%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
저는 Postfix 2.6.6을 실행하는 CentOS 6 서버를 살펴보아야 했습니다. 이 서버는 모든 사람에게 이메일을 보낼 수 있었지만 수신 TLS 협상 문제로 인해 GMail(및 기타 몇몇 MTA)에서 이메일을 받을 수 없었습니다.
.google.com
SMTP 서버(예: GMail) 에서 연결하면 다음과 같은 결과가 발생합니다.
Aug 23 19:34:29 server1 postfix/smtpd[7659]: connect from mail-lf1-f44.google.com[209.85.167.44]
Aug 23 19:34:29 server1 postfix/smtpd[7659]: setting up TLS connection from mail-lf1-f44.google.com[209.85.167.44]
Aug 23 19:34:29 server1 postfix/smtpd[7659]: SSL_accept error from mail-lf1-f44.google.com[209.85.167.44]: -1
Aug 23 19:34:29 server1 postfix/smtpd[7659]: warning: TLS library problem: 7659:error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher:s3_srvr.c:1387:
Aug 23 19:34:29 server1 postfix/smtpd[7659]: lost connection after STARTTLS from mail-lf1-f44.google.com[209.85.167.44]
Aug 23 19:34:29 server1 postfix/smtpd[7659]: disconnect from mail-lf1-f44.google.com[209.85.167.44]
TLS 로깅의 자세한 정도를 높입니다.
Aug 23 21:56:15 server1 postfix/smtpd[18103]: initializing the server-side TLS engine
Aug 23 21:56:15 server1 postfix/smtpd[18103]: connect from mail-lf1-f47.google.com[209.85.167.47]
Aug 23 21:56:15 server1 postfix/smtpd[18103]: setting up TLS connection from mail-lf1-f47.google.com[209.85.167.47]
Aug 23 21:56:15 server1 postfix/smtpd[18103]: mail-lf1-f47.google.com[209.85.167.47]: TLS cipher list "ALL:+RC4:@STRENGTH:!aNULL:!LOW:!EXP:!MEDIUM:!ADH:!AECDH:!MD5:!DSS:!ECDSA:!CAMELLIA128:!3DES:!CAMELLIA256:!RSA+AES:!eNULL"
Aug 23 21:56:15 server1 postfix/smtpd[18103]: SSL_accept:before/accept initialization
Aug 23 21:56:15 server1 postfix/smtpd[18103]: SSL3 alert write:fatal:handshake failure
Aug 23 21:56:15 server1 postfix/smtpd[18103]: SSL_accept:error in SSLv3 read client hello C
Aug 23 21:56:15 server1 postfix/smtpd[18103]: SSL_accept error from mail-lf1-f47.google.com[209.85.167.47]: -1
Aug 23 21:56:15 server1 postfix/smtpd[18103]: warning: TLS library problem: 18103:error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher:s3_srvr.c:1387:
Aug 23 21:56:15 server1 postfix/smtpd[18103]: lost connection after STARTTLS from mail-lf1-f47.google.com[209.85.167.47]
Aug 23 21:56:15 server1 postfix/smtpd[18103]: disconnect from mail-lf1-f47.google.com[209.85.167.47]
공유 암호가 없나요?!
자체 서명된 서버 인증서를 사용하여 TLS가 이미 활성화되었습니다. 클라이언트가 SASL을 사용하여 IMAP/POP를 통해 메일을 보내고 받기 위해 성공적으로 연결되었습니다.
접미사 오류 의 일반적인 원인을 읽었 1408A0C1
지만 이 시나리오에 적용되는 것은 없는 것 같습니다. 내가 실행한 일부 검사 결과는 내가 기대했던 것과 모순되는 것 같았습니다.
postconf -d | grep cipherlist
다음과 같은 상당히 짧은 제외 목록이 있었습니다.
tls_export_cipherlist = ALL:+RC4:@STRENGTH
tls_high_cipherlist = ALL:!EXPORT:!LOW:!MEDIUM:+RC4:@STRENGTH
tls_low_cipherlist = ALL:!EXPORT:+RC4:@STRENGTH
tls_medium_cipherlist = ALL:!EXPORT:!LOW:+RC4:@STRENGTH
tls_null_cipherlist = eNULL:!aNULL
TLS 프로토콜은 상당히 관대했습니다.
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3
smtpd_tls_protocols = !SSLv2, !SSLv3
smtp_tls_protocols = !SSLv2, !SSLv3
그렇다면 왜 암호를 협상할 수 없었을까요?
OpenSSL 1.0.1e-fips 11 Feb 2013
나는 먼저 OpenSSL(을 통해 사용 가능한 최신 버전 yum
) 업데이트를 시작했습니다 . 내가 그랬어이 글에서 지시한 대로결과적으로 상자가 실행됩니다 OpenSSL 1.0.2p 14 Aug 2018
.
하지만 여전히 Gmail 수신 문제는 계속되었습니다..
가능한 모든 TLS 변형이 성공할 수 있는 기회를 주기 위해 이를 그대로 두고 암호를 더 자세히 연구했습니다.
비활성화 중모두암호 제외에 대해 내 Gmail에서 테스트 이메일을 보냈는데 놀랍게도 이메일이 다음과 같이 전달되었습니다.
Aug 23 23:39:52 server1 postfix/smtpd[6036]: connect from mail-lj1-f171.google.com[209.85.208.171]
Aug 23 23:39:52 server1 postfix/smtpd[6036]: setting up TLS connection from mail-lj1-f171.google.com[209.85.208.171]
Aug 23 23:39:52 server1 postfix/smtpd[6036]: mail-lj1-f171.google.com[209.85.208.171]: TLS cipher list "ALL:+RC4:@STRENGTH"
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:before/accept initialization
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 read client hello B
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 write server hello A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 write certificate A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 write server done A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 flush data
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 read client key exchange A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 read finished A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 write session ticket A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 write change cipher spec A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 write finished A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 flush data
Aug 23 23:39:52 server1 postfix/smtpd[6036]: Anonymous TLS connection established from mail-lj1-f171.google.com[209.85.208.171]: TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)
Aug 23 23:39:52 server1 postfix/smtpd[6036]: 66BB15DC6: client=mail-lj1-f171.google.com[209.85.208.171]
Aug 23 23:39:52 server1 postfix/cleanup[6424]: 66BB15DC6: message-id=<CAK9Gk9r+6gt7g_U987A0XaGdKJGY=80n0rK595mqrmfGaL5LKQ@mail.gmail.com>
Aug 23 23:39:52 server1 opendkim[6890]: 66BB15DC6: mail-lj1-f171.google.com [209.85.208.171] not internal
Aug 23 23:39:52 server1 opendkim[6890]: 66BB15DC6: not authenticated
Aug 23 23:39:52 server1 opendkim[6890]: 66BB15DC6: DKIM verification successful
Aug 23 23:39:52 server1 postfix/qmgr[6032]: 66BB15DC6: from=<gmailaddress>, size=3988, nrcpt=1 (queue active)
Aug 23 23:39:52 server1 postfix/smtpd[6036]: disconnect from mail-lj1-f171.google.com[209.85.208.171]
Aug 23 23:39:52 server1 postfix/pipe[6425]: 66BB15DC6: to=<myinbox>, relay=dovecot, delay=0.48, delays=0.29/0.01/0/0.18, dsn=2.0.0, status=sent (delivered via dovecot service)
그렇다면 GMail이 AES128-GCM-SHA256
TLSv1.2를 통해 협상했다면 왜 이전에는 작동하지 않았을까요? 특히 그들의 암호 목록은 마지막에 RC4와 함께 강도 순으로 정렬되어 일치하는 것으로 나타납니다.
테스트하기 위해 특정 암호 목록을 선택하고 앞에 AES128 해시 깊이(이탤릭체)(ECDHE 및 DHE 메서드)를 추가하고 이를 후위에서 명시적으로 선언했습니다. 이는 작동했습니다.
tls_high_cipherlist=ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256: DHE-DSS-AES128-GCM-SHA256:EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL: !LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA
하지만 암호 목록 레시피를 지속적으로 업데이트하고 싶지 않았기 때문에 tls_high_cipherlist
선언을 주석 처리했습니다.
그 후 나는 몇 가지 일을 했습니다.
postfix에서는 권장대로 smtpd 섹션에 master.cf
추가했습니다 .-o smtp_tls_mandatory_protocols=TLSv1
다음의 선언을 사용하여 TLS 프로토콜을 개선하고 싶었습니다.https://blog.kruyt.org/postfix-and-tls-encryption/, 이전 버전을 제외하기 전에 TLSv1.2 및 TLSv1.1을 명시적으로 승인합니다. 그러나 postfix 2.6.6에서는 이것이 작동하지 않습니다. 다시 로드/다시 시작한 후 얼마 지나지 않아 로그에서 다음을 확인했습니다.
warning: Invalid TLS protocol list "TLSv1.2, TLSv1.1, !TLSv1, !SSLv2, !SSLv3": disabling TLS support
제외 규칙과 포함 규칙을 혼합하면 이런 일이 발생하므로 명시적 제외 형식으로 되돌립니다.
smtpd_tls_protocols = !TLSv1, !SSLv2, !SSLv3
smtp_tls_protocols = !TLSv1, !SSLv2, !SSLv3
smtp_tls_ciphers = high
smtpd_tls_ciphers = high
smtpd_tls_mandatory_protocols = !TLSv1, !SSLv2, !SSLv3
smtp_tls_mandatory_protocols = !TLSv1, !SSLv2, !SSLv3
smtp_tls_mandatory_ciphers = high
smtpd_tls_mandatory_ciphers = high
그리고 이것은 postfix에 의해 받아들여졌습니다.
기회주의적 TLS를 다음과 같이 설정했습니다.
smtp_tls_security_level = may
smtpd_tls_security_level = may
GMail 전달 문제를 해결한 후에도 몇몇 다른 MTA가 여전히 실패하고 있음을 발견했습니다.
server1 postfix/smtpd[28167]: connect from mta3.email.secretescapes.com[198.245.84.110]
server1 postfix/smtpd[28167]: setting up TLS connection from mta3.email.secretescapes.com[198.245.84.110]
server1 postfix/smtpd[28167]: mta3.email.secretescapes.com[198.245.84.110]: TLS cipher list "ALL:!EXPORT:!LOW:!MEDIUM:+RC4:@STRENGTH:!MD5:!DES:!ADH:!RC4:!PSD:!SRP:!3DES:!eNULL:!aNULL"
server1 postfix/smtpd[28167]: SSL_accept:before/accept initialization
server1 postfix/smtpd[28167]: SSL_accept:error in SSLv2/v3 read client hello A
server1 postfix/smtpd[28167]: SSL_accept error from mta3.email.secretescapes.com[198.245.84.110]: -1
server1 postfix/smtpd[28167]: warning: TLS library problem: 28167:error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol:s23_srvr.c:647:
server1 postfix/smtpd[28167]: lost connection after STARTTLS from mta3.email.secretescapes.com[198.245.84.110]
server1 postfix/smtpd[28167]: disconnect from mta3.email.secretescapes.com[198.245.84.110]
-
server1 postfix/smtpd[1451]: initializing the server-side TLS engine
server1 postfix/smtpd[1451]: connect from mta.email.bbc.com[198.245.84.99]
server1 postfix/smtpd[1451]: setting up TLS connection from mta.email.bbc.com[198.245.84.99]
server1 postfix/smtpd[1451]: mta.email.bbc.com[198.245.84.99]: TLS cipher list "ALL:!EXPORT:!LOW:!MEDIUM:+RC4:@STRENGTH:!MD5:!aDSS:!kECDH:!kDH:!SEED:!IDEA:!DES:!ADH:!RC2:!RC4:!RC5:!PSD:!SRP:!3DES:!eNULL:!aNULL"
server1 postfix/smtpd[1451]: SSL_accept:before/accept initialization
server1 postfix/smtpd[1451]: SSL_accept:error in SSLv2/v3 read client hello A
server1 postfix/smtpd[1451]: SSL_accept error from mta.email.bbc.com[198.245.84.99]: -1
server1 postfix/smtpd[1451]: warning: TLS library problem: 1451:error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol:s23_srvr.c:647:
server1 postfix/smtpd[1451]: lost connection after STARTTLS from mta.email.bbc.com[198.245.84.99]
server1 postfix/smtpd[1451]: disconnect from mta.email.bbc.com[198.245.84.99]
server1 postfix/smtpd[1451]: connect from unknown[107.174.30.57]
server1 postfix/smtpd[1451]: 4F6D0629C: client=unknown[107.174.30.57]
그런 다음 tls_high_cipherlist의 몇 가지 순열을 시도한 후 사용을 종료했습니다.bettercrypto.org 추천 목록:
tls_high_cipherlist=EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA256:EECDH:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!IDEA:!ECDSA:kEDH:CAMELLIA128-SHA:AES128-SHA
서버는 다음을 포함한 다양한 SSL 테스터로 테스트되었습니다.TLS 확인(100% 결과),럭스키(A+ 결과),htbridge의 SSL 테스터(좋은 성적) 그리고SSL 도구.
나가는 연결을 정책 매핑할 수 있다는 것을 알고 있지만 특정 MTA에 대한 제외를 선택적으로 비활성화하고 협상 중인 암호를 알아낸 다음 제시하는 암호 목록을 조정할 수 있도록 동등한 것을 찾고 있습니다. .
현재 postfix TLS 구성에서는 어떤 중대한 결함도 발견할 수 없습니다. 다른 MTA는 잘 관리하는데 특정 MTA는 TLS 암호를 협상할 수 없는 이유가 무엇인지 알 수 없습니다. 까다로운 GMail도 이제 괜찮습니다.
어떤 아이디어가 있나요?:-)
메모 했어Google이 암호화를 선호하는 이유에 대한 SE 질문입니다., 흥미로운 독서를하게 만들었습니다.
의례이 Postfix 사용자 포럼 스레드, 사용 가능한 모든 암호에서 얼마나 많은 TLS 연결이 성공적으로 이루어졌는지 빠르게 확인할 수 있는 유용한 방법을 찾았습니다.
egrep "TLS connection established from.*with cipher" /var/log/maillog* | awk '{printf("%s %s %s %s\n", $12, $13, $14, $15)}' | sort | uniq -c | sort -
답변1
궁극적으로 이 문제는 일부 발신자가 여전히 SSLv3만 협상할 수 있기 때문에 발생하는 것 같습니다. 이것은 나쁜 일이지만 이메일을 받지 못하는 것도 좋지 않습니다.
정말 그렇게 간단합니다. 만족스럽지는 않지만 MTA 전송이 TLS에 대한 재협상을 거부하고 SSLv3을 사용하여 영원히 재시도한다면 지금으로서는 할 수 있는 일이 많지 않습니다.
그래서 당분간은 수신 이메일이 SSLv3로 암호화되도록 허용했지만 서버의 모든 클라이언트는 여전히 TLS를 통해 인증해야 했습니다.
나는 다음에서 프로토콜 부정자를 완화하여 이를 달성했습니다 main.cf
.
smtpd_tls_mandatory_protocols = !TLSv1, !SSLv2
smtpd_tls_protocols = !TLSv1, !SSLv2
정의는 smtp_tls_
이 서버에서 전송되는 메일에 대한 것이므로 클라이언트 연결과 관련되므로 원하는 만큼 엄격하게 정의할 수 있습니다(모든 사람에게 이메일 클라이언트 설정 방법을 기꺼이 설명하려는 경우).
smtp_tls_mandatory_protocols = !TLSv1, !SSLv2, !SSLv3
smtp_tls_protocols = !TLSv1, !SSLv2, !SSLv3
보내는 MTA가 TLS를 협상할 수 없고 SSLv3를 예상하는 경우 일반적으로 메일 로그에 다음과 같은 내용이 표시됩니다.
warning: TLS library problem: 364:error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol:s23_srvr.c:647:
로깅 수준을 높이면 다음과 같은 추가 메시지와 함께 TLS 협상이 실패하는 것을 볼 수 있습니다.
postfix/smtpd[26234]: SSL_accept:before/accept initialization
postfix/smtpd[26234]: SSL_accept:error in SSLv2/v3 read client hello A
postfix/smtpd[26234]: SSL_accept error from 201-62-89-201.life.com.br[201.62.89.201]: -1
저는 SSLv3 연결을 허용하지 않는 것을 주기적으로 테스트해왔으므로(필연적으로 MTA는 여러 날 동안 재시도함) 로그에 몇 가지 오류가 발생하도록 허용한 다음 이를 분석할 수 있습니다.
이 bash 스크립트는 어떤 서버가 SSLv3을 사용하려고 하는지 분석하는 데 도움이 됩니다.
#!/bin/sh
egrep "SSL_accept error" /var/log/maillog | awk '{printf("%s %s %s\n", $9, $10, $11)}' | sort | uniq -c | sort -`
이 변형은 협상된 암호를 보여줍니다. 따라서 SSLv3을 다시 활성화한 후에는 잠시 그대로 둔 다음 MTA가 SSLv3을 사용하고 있는지 확인할 수 있습니다.
#!/bin/sh
egrep "TLS connection established from.*with cipher" /var/log/maillog | awk '{printf("%s %s %s %s\n", $12, $13, $14, $15)}' | sort | uniq -c | sort -
아직 더 나은 답변을 찾지 못했습니다. 저는 좀 더 미묘한 접근 방식을 취하고 싶습니다. maillog
. 모든 의견/제안을 환영합니다.