2010-04-01 2 views
3

openssl을 사용하여 gmail.com:25에 대한 보안 smtp 연결을 구축하고 있습니다. 그래서 나는 성공적으로 서버에 연결하여 명령 STARTTLS를 보냅니다 (220 2.0.0 TLS를 시작할 준비가되었습니다). 그런 다음 분리하지 않고 다음 코드를 실행합니다C on SMTP : OpenSSL을 통한 STARTTLS

SSL_METHOD* method = NULL; 

SSL_library_init(); 
SSL_load_error_strings(); 

method = SSLv23_client_method(); 

ctx = SSL_CTX_new(method); 
if (ctx == NULL) 
{ 
    ERR_print_errors_fp(stderr); 
} 
SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2); 
ssl = SSL_new(ctx); 
if (!SSL_set_fd(ssl, socket)) 
{ 
     ERR_print_errors_fp(stderr); 
     return; 
} 
if (ssl) 
{ 

    if (SSL_connect((SSL*)ssl) < 1) 
    { 
     ERR_print_errors_fp(stderr); 
    } 
    // then i think i need to send EHLO 
} 

하지만 오류가 SSL_connect를 호출 한 후 :

18143:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number:s3_pkt.c:284. 

그리고 TLSv1_client_method 경우 : 내가 SSLv3_client_method를 사용하는 경우

24953:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:601: 

오류가 발생합니다 :

21293:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number:s3_pkt.c:284: 

왜? 내가 뭘 잘못 했니?

답변

1

SSLv23_client_method 대신 SSLv3_client_method 또는 TLSv1_client_method를 사용해보십시오. Gmail에서 SSLv23을 지원한다고 생각하지 않습니다.

+0

이 오류가 발생합니다 : 18143 : 오류 : 1408F10B : SSL 루틴 : SSL3_GET_RECORD : 잘못된 버전 번호 : s3_pkt.c : 284. 그리고 TLSv1_client_method 경우 : 21293 : 오류 : 1408F10B : SSL 루틴 : SSL3_GET_RECORD : 잘못된 버전 번호 : s3_pkt.c : 284 : 재미 :) – Jackell

0

TLS를 시작하기 전에 서버의 220 응답의 끝을 구분하는 \r (캐리지 리턴)과 \n (개행) 문자를 모두 읽으십니까?

2

어제 같은 문제가 발생했습니다. 여기에 내가 그것을 해결하는 방법입니다
- 일반 TCP 소켓을 생성하여 시작하고
을 smtp.gmail.com:587에 연결 - 보내 "EHLO [127.0.0.1] \ 연구 \ n"명령
- 수 서버로부터의 응답 (알림 : 지금까지 모든 것이 깨끗함)
- "STARTTLS \ r \ n"명령을 보내십시오.
- 대답을 얻으십시오 (예 : "220 TLS 준비")
- "SSL_set_fd"및 "SSL_connect"를 사용하여 SSL 래퍼 (메서드, ctx 등)를 만들고
- SSL 소켓을 사용하여 새 "ehlo [127.0.0.1] \ r \ n"명령을 보냅니다.

지금부터는 "SSL_write"와 "SSL_read"를 SSL 소켓과 함께 사용하여 인증 정보와 이메일을 보냅니다.

이 방법은 데이터를 암호화 만하지만 SSL 인증서로 사용자 (또는 서버)를 인증하지 않습니다. 그러나 나를 위해, 그것은 "알려지지 않은 프로토콜"을 얻는 문제를 해결했습니다. 내가 SSLv3_client_method를 사용하는 경우이 도움이

희망 ...

+0

네, 고마워요! – Jackell

+2

실제로 포트 587을 사용할 필요는 없습니다. smtp.gmail.com은'openssl s_client -connect smtp.gmail.com:25 -starttls smtp'를 실행하여 알 수 있듯이 STARTTLS를 25 번 받아 들일 수 있습니다. –

+0

이 명령 다음에 응답이 없으면 끝에 -crlf를 추가하십시오. – n0rm1e