我使用OpenSSL来加密硬件发送的一些电子邮件。但是,每当我试图调用SSL_connect()时,我就会得到: SSL routines:SSL23_GET_SERVER_HELLO:unknown协议
在发送"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;
}
}
我试着连接到:
我尝试过不同的端口,因为有一些类似的问题表明,这样的错误通常与为SSL使用错误端口有关。
我是不是漏掉了什么?
更新:
所有其他方法(即TLSv1_1_method()、SSLv3_method() .)导致SSL3_GET_RECORD:wrong版本号
更新:
我在wireshark上观察到了以下情况:
“埃洛”
“为您效劳”
“科学和技术”
“准备接受starttls”
->现在我调用上面的函数
不可读请求(加密)
不可读的答复(加密)
->错误
发布于 2014-04-07 05:52:33
下面的套牢是非阻塞的。通过使用select
并等待TLS握手完成,解决了这个问题。
发布于 2014-03-17 13:16:15
端口587和25上的SMTP服务器通常是纯文本,只有在初始SMTP对话框和来自客户端的STARTTLS命令之后才会切换到TLS。在纯文本套接字上尝试SSL_connect将失败。
发布于 2014-03-18 17:50:11
解决此问题的另一种方法可能是在Scott的sslclient
(参见http://www.superscript.com/ucspi-ssl/sslclient.html)下运行C程序。sslclient将生成程序并打开到服务器的tcp连接,并将程序的stdout传输到服务器,并将输出从服务器输送到程序的stdin。他为TLS提供了一个补丁版本,该版本将以纯文本启动连接,然后,一旦双方就STARTTLS达成一致,您的程序就可以通过将命令写入文件描述符,从而向SSL发出信号,在连接上启用SSL加密。这样做的好处是,您可以让sslclient完成所有的繁重工作,比如设置套接字和ssl等等,并且可以专注于程序的核心功能。
https://stackoverflow.com/questions/22449946
复制相似问题