我遇到了openssl库的问题。发送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_connect
失败但不会打印任何错误!
这是我的代码的输出:(包括服务器的回复)
220 mx.google.com ESMTP x3sm39000551eep.17 - gsmtp
//////////////////////////EHLO//////////////////////////
250-mx.google.com at your service, [80.149.109.201]
250-SIZE 35882577
250-8BITMIME
250-STARTTLS
250-ENHANCEDSTATUSCODES
250 CHUNKING
//////////////////////////STARTTLS//////////////////////////
220 2.0.0 Ready to start TLS
///////////////creating TLS Session/////////////////////
SSL_connect failed
所以ERR_print_errors_fp(stdout)
没有做任何事情!
知道为什么会这样吗?
是的,我试图连接到smtp.gmail.com:587答案 0 :(得分:1)
我没有看到加载的私钥文件或证书文件。使用SSL_CTX_use_certificate_file和SSL_CTX_use_PrivateKey_file。
答案 1 :(得分:0)
我设法最终解决了这个问题。底层套接字是非阻塞的,因此SSL_connect不会立即连接。使用select
解决了问题