【问题标题】:SMTP on C: STARTTLS via OpenSSLC 上的 SMTP:通过 OpenSSL 的 STARTTLS
【发布时间】:2010-04-01 19:24:35
【问题描述】:

我正在使用 openssl 建立与 gmail.com:25 的安全 smtp 连接。这样我就可以成功连接到服务器并发送命令STARTTLS(我收到220 2.0.0 Ready to start 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:

为什么?我做错了什么?

【问题讨论】:

    标签: c linux smtp openssl ssl


    【解决方案1】:

    我昨天遇到了同样的问题。这是我解决它的方法:
    - 首先创建一个普通的 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 套接字的“SSL_write”和“SSL_read”来发送您的身份验证信息和电子邮件。

    请注意,此方法仅加密您的数据,但不会使用 SSL 证书对您(或服务器)进行身份验证。但对我来说,它解决了获取“未知协议”的问题。

    希望这会有所帮助...
    菲尔

    【讨论】:

    • 实际上不需要使用端口 587 - smtp.gmail.com 在 25 上接受 STARTTLS 就好了,正如您通过运行 openssl s_client -connect smtp.gmail.com:25 -starttls smtp 所看到的那样。
    • 如果执行此命令后没有响应,请在末尾添加 -crlf。
    【解决方案2】:

    尝试使用 SSLv3_client_method 或 TLSv1_client_method 而不是 SSLv23_client_method。我认为 Gmail 不支持 SSLv23。

    【讨论】:

    • 如果我使用 SSLv3_client_method 我得到一个错误:18143:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number:s3_pkt.c:284。如果 TLSv1_client_method: 21293:error:1408F10B:SSLroutines:SSL3_GET_RECORD:wrong version number:s3_pkt.c:284: Funny :)
    【解决方案3】:

    在启动 TLS 之前,您是否同时读取了分隔服务器 220 响应末尾的 \r(回车)和 \n(换行)字符?

    【讨论】:

      猜你喜欢
      • 2015-01-17
      • 2022-01-18
      • 1970-01-01
      • 2018-03-19
      • 1970-01-01
      • 2020-08-03
      • 2013-06-21
      • 1970-01-01
      • 2017-03-15
      相关资源
      最近更新 更多