【发布时间】:2014-04-22 09:32:12
【问题描述】:
我正在使用 OpenSSL 来加密一些由硬件发送的电子邮件。但是,每当我尝试调用 SSL_connect() 时,我都会得到: SSL 例程:SSL23_GET_SERVER_HELLO:未知协议
发送“EHLO”和“STARTTLS”后,我调用以下函数:
SSL_CTX *ctx = NULL;
SSL *ssl = NULL;
void CreateTLSSession(int sockfd)
{
printf("///////////////creating TLS Session/////////////////////\n");
SSL_library_init();
SSL_load_error_strings();
OpenSSL_add_all_algorithms();
ctx = SSL_CTX_new(SSLv23_client_method());
if (ctx == NULL)
{
printf("failed to initialize context\n");
return;
}
SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2);
ssl = SSL_new(ctx);
if (!SSL_set_fd(ssl, sockfd))
{
printf("failed to bind to socket fd\n");
return;
}
if (SSL_connect(ssl) < 1)
{
ERR_print_errors_fp(stdout);
fflush(stdout);
printf("SSL_connect failed\n");
return;
}
}
我已经尝试连接到:
- smtp.live.com : 587 --> SSL 例程:SSL23_GET_SERVER_HELLO:unknown 协议 s23_clnt.c:787:
- smtp.live.com : 25 --> SSL 例程:SSL23_GET_SERVER_HELLO:unknown protocol s23_clnt.c:787:
- smtp.gmail.com : 587 --> SSL 例程:SSL23_GET_SERVER_HELLO:unknown 协议 s23_clnt.c:787:
- smtp.gmail.com : 465 --> 服务器根本没有响应!
- smtp.gmail.com : 25 --> SSL 例程:SSL23_GET_SERVER_HELLO:unknown
协议 s23_clnt.c:787:
我尝试了不同的端口,因为关于此 SO 的一些类似问题表明,此类错误通常与使用错误的 SSL 端口有关。
我错过了什么吗?
更新:
所有其他方法(即 TLSv1_1_method()、SSLv3_method() ...)导致 SSL3_GET_RECORD:错误的版本号
更新:
我能够在wireshark上观察到以下内容:
“EHLO”
“为您服务”
“STARTTLS”
“准备开始”
-->现在我调用上面的函数
不可读的请求(加密)
不可读的回复(加密)
--> 错误
【问题讨论】:
-
@noloader 链接并没有真正回答我的问题。答案只是建议在未加密的情况下启动通信,然后在发出 STARTTLS 后加密数据。但正如我已经提到的,我已经在加密之前发送了我的“EHLO”和“STARTTLS”。