我正在使用openssl建立到gmail.com:25的安全smtp连接。这样我就可以成功连接到服务器并发送命令STARTTLS(我收到220 2.0.0准备启动TLS)。然后执行以下代码而不断开连接:
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:
为什么?我做错了什么?
最佳答案
昨天我遇到了同样的问题。这是我解决的方法:
-首先创建一个普通的TCP套接字,然后将其连接到smtp.gmail.com:587
-发送“ehlo [127.0.0.1]\r\n”命令
-从服务器获取答案(注意:到目前为止,一切都清楚了)
-发送“STARTTLS\r\n”命令
-获得答案(即“220 Ready for TLS”)
-此时,创建您的ssl包装器(方法,ctx等),然后使用“SSL_set_fd”和“SSL_connect”将其激活
-发送新的“ehlo [127.0.0.1]\r\n”命令,但使用SSL套接字
从现在开始,将“SSL_write”和“SSL_read”与SSL套接字一起使用以发送身份验证信息和电子邮件。
请意识到,此方法仅加密您的数据,而不使用SSL证书对您自己(或服务器)进行身份验证。但是对我来说,它解决了获取“未知协议(protocol)”的问题。
希望这可以帮助...
菲尔