2010-04-01 93 views
3

我使用openssl建立到gmail.com:25的安全smtp連接。因此,我可以成功連接到服務器併發送一條命令STARTTLS(我收到220 2.0.0準備啓動TLS)。然後無需斷開執行以下代碼:C:上的SMTP:STARTTLS通過OpenSSL

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後,我得到一個錯誤:

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

如果我使用SSLv3_client_method我得到一個錯誤:

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

而且如果TLSv1_client_method :

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

爲什麼?我做錯了什麼?

回答

1

嘗試使用SSLv3_client_method或TLSv1_client_method而不是SSLv23_client_method。我不認爲Gmail支持SSLv23。

+0

如果我使用SSLv3_client_method我得到一個錯誤: 18143:錯誤:1408F10B:SSL例程:SSL3_GET_RECORD:錯誤的版本號:s3_pkt.c:284。 而如果TLSv1_client_method: 21293:錯誤:1408F10B:SSL例程:SSL3_GET_RECORD:錯誤的版本號:s3_pkt.c:284: 滑稽:) – Jackell 2010-04-02 06:34:56

0

在啓動TLS之前,您是否正在讀取界定服務器的響應末尾的\r(回車)和\n(換行符)字符?

2

昨天我跑了同樣的問題。下面是我如何解決它:
- 開始創建一個正常的TCP套接字,並將其連接到smtp.gmail.com:587
- 發送一個「ehlo [127.0.0.1] \ r \ n」命令
- get (注意:到目前爲止一切都已清楚)
- 發送一個「STARTTLS \ r \ n」命令
- 得到答案(即「220準備TLS」)
- 此時,創建你的ssl包裝器(方法,ctx等),並使用「SSL_set_fd」和「SSL_connect」來激活它。
- 發送一個新的「ehlo [127.0.0.1] \ r \ n」命令,但使用SSL套接字

從現在開始,使用SSL套接字的「SSL_write」和「SSL_read」發送您的驗證信息和電子郵件。

請認識到此方法僅對您的數據進行加密,但不會使用SSL證書對自己(或服務器)進行身份驗證。但對我來說,它解決了獲取「未知協議」的問題。

希望這有助於...
菲爾

+0

是啊,非常感謝! – Jackell 2010-04-12 14:03:29

+2

實際上並不需要使用端口587 - smtp.gmail.com接受25上的STARTTLS就好了,正如您通過運行'openssl s_client -connect smtp.gmail.com:25 -starttls smtp'所看到的那樣。 – 2011-12-22 01:37:28

+0

如果您在此命令後未收到回覆,請在最後加上-crlf。 – n0rm1e 2012-07-24 14:49:34