首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SMTPS: OpenSSL - SSL routines:SSL23_GET_SERVER_HELLO:unknown协议s23_clnt.c:787:

SMTPS: OpenSSL - SSL routines:SSL23_GET_SERVER_HELLO:unknown协议s23_clnt.c:787:
EN

Stack Overflow用户
提问于 2014-03-17 08:47:47
回答 3查看 4.2K关注 0票数 3

我使用OpenSSL来加密硬件发送的一些电子邮件。但是,每当我试图调用SSL_connect()时,我就会得到: SSL routines:SSL23_GET_SERVER_HELLO:unknown协议

在发送"EHLO“和"STARTTLS”之后,我调用以下函数:

代码语言:javascript
运行
复制
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 routines:SSL23_GET_SERVER_HELLO:unknown协议s23_clnt.c:787:
  • smtp.live.com : 25 -> SSL routines:SSL23_GET_SERVER_HELLO:unknown协议s23_clnt.c:787:
  • smtp.gmail.com : 587 -> SSL routines:SSL23_GET_SERVER_HELLO:unknown协议s23_clnt.c:787:
  • smtp.gmail.com : 465 ->服务器完全没有响应!
  • smtp.gmail.com : 25 -> SSL routines:SSL23_GET_SERVER_HELLO:unknown 协议s23_clnt.c:787:

我尝试过不同的端口,因为有一些类似的问题表明,这样的错误通常与为SSL使用错误端口有关。

我是不是漏掉了什么?

更新:

所有其他方法(即TLSv1_1_method()、SSLv3_method() .)导致SSL3_GET_RECORD:wrong版本号

更新:

我在wireshark上观察到了以下情况:

“埃洛”

“为您效劳”

“科学和技术”

“准备接受starttls”

->现在我调用上面的函数

不可读请求(加密)

不可读的答复(加密)

->错误

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-07 05:52:33

下面的套牢是非阻塞的。通过使用select并等待TLS握手完成,解决了这个问题。

票数 0
EN

Stack Overflow用户

发布于 2014-03-17 13:16:15

端口587和25上的SMTP服务器通常是纯文本,只有在初始SMTP对话框和来自客户端的STARTTLS命令之后才会切换到TLS。在纯文本套接字上尝试SSL_connect将失败。

票数 3
EN

Stack Overflow用户

发布于 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等等,并且可以专注于程序的核心功能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22449946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档