원격 SMTP 서버의 TLS 인증서를 검사하는 방법은 무엇입니까?


63

Windows Server 2008에서 실행되는 Exchange 2007 서버가 있습니다. 클라이언트는 다른 공급 업체의 메일 서버를 사용합니다. 보안 정책에 따라 강제 TLS를 사용해야합니다. 이것은 최근까지 잘 작동했습니다.

이제 Exchange가 메일을 클라이언트의 서버로 배달하려고하면 다음을 기록합니다.

ourclient.com에 대한 TLS (Transport Layer Security) 인증서의 유효성 검사가 'UntrustedRoot'상태로 실패하여 '기본 외부 메일'커넥터에서 도메인 보안 도메인 'ourclient.com'에 안전하게 연결할 수 없습니다. 문제를 해결하려면 domain.client.com 관리자에게 문의하거나 도메인 보안 목록에서 도메인을 제거하십시오.

TLSSendDomainSecureList에서 ourclient.com을 제거하면 기회 적 TLS를 사용하여 메시지가 성공적으로 전달되지만 이는 일시적인 임시 해결책입니다.

클라이언트는 매우 크고 보안에 민감한 국제 회사입니다. IT 담당자는 TLS 인증서 변경 사항을 알지 못한다고 주장합니다. 유효성 검사 오류를 해결할 수 있도록 인증서를 생성 한 기관을 반복해서 확인하도록 요청했지만 지금까지는 답변을 제공 할 수 없었습니다. 내가 아는 한, 고객은 유효한 TLS 인증서를 사내 인증 기관의 인증서로 교체 할 수있었습니다.

웹 브라우저에서 원격 HTTPS 서버의 인증서에 대해 할 수있는 것처럼 원격 SMTP 서버의 TLS 인증서를 수동으로 검사하는 방법을 아는 사람이 있습니까? 인증서를 발급 한 사람을 확인하고 해당 정보를 Exchange 서버의 신뢰할 수있는 루트 인증서 목록과 비교하는 것이 매우 도움이 될 수 있습니다.

답변:


100

OpenSSL을 사용할 수 있습니다. 당신이 인증서를 확인해야하는 경우 STARTTLS, 그럼 그냥 할

openssl s_client -connect mail.example.com:25 -starttls smtp

또는 표준 보안 smtp 포트의 경우 :

openssl s_client -connect mail.example.com:465

아름다운. OpenSSL의 유사한 유효성 검사 오류이지만 훨씬 더 자세히 설명합니다. 이제 우리는 문제가 메일 서버에만 국한되지 않는다는 것을 알고 있습니다.
Skyhawk

1
@Miles : Windows에서이 작업을 시도 openssl하는 경우 Windows 인증서 저장소 사용을 지원하지 않으므로 항상 유효성 검사에 실패합니다.
grawity

3
서버 인증서 만료 날짜를 어떻게 확인할 수 있습니까?
nimrodm

9
@nimrodm : 인증서를 "openssl x509 -text"로 파이프
Dan Andreatta

2
@DanAndreatta @nimrodm 또는 openssl x509 -noout -dates더 짧은 출력 을 위해 파이프하십시오 .
Skippy le Grand Gourou

9

나는 이것이 오래된 질문이지만 이메일 서버에서 SSL 인증서의 유효성을 확인하려는 관리자에게 여전히 관련 질문입니다.

https://www.checktls.com을 방문 하여 무료로 테스트를 실행할 수 있습니다.


이것은 나를 위해 일했고, 명령 줄보다 더 읽기
쉽습니다

1
사이트에서 테스트를 찾는 데 문제가 있습니다. 어떤 포인터?
Zero3

1
'인터넷 보안 이메일은 쉽습니다'섹션에 'CheckTLS'버튼이 검은 색으로 표시되는 입력 상자가 있습니다.
Ketan Patel 2016

@KetanPatel Aaaand ... 'Internet Secure Email is easy'섹션은 어디에서 찾을 수 있습니까?
Zero3

부끄러운 일입니다. DNS에 나열된 SMTP 서버의 도메인을 확인하고 쿼리하는 것처럼 보이지만 서버를 직접 확인하고 싶었습니다.
kerridge0

4

OpenSSL이없는 경우이 Python 스 니펫을 사용할 수도 있습니다.

import smtplib
import ssl

connection = smtplib.SMTP() 
connection.connect('[hostname].')
connection.starttls()
print ssl.DER_cert_to_PEM_cert(connection.sock.getpeercert(binary_form=True))

여기서 [hostname]은 서버입니다.

출처 : https://support.google.com/a/answer/6180220

이것은 OpenSSL 라이브러리를 가져 오므로 설치가 조금 더 쉽습니다.


로부터 파이썬 SSL 모듈 문서 : "이 모듈에는 OpenSSL 라이브러리를 사용합니다." 따라서이 답변은 진행중인 상황에서 약간 오도됩니다.
fbmd

@fbmd 의견을 보내 주셔서 감사합니다. 이 편집이 더 낫습니까 (마지막 문장 참조)?
browly

예, 더 좋습니다.
fbmd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.