Программа, которую я использовал для чтения электронной почты, перестала работать, когда мой провайдер обновил свои серверы.Теперь, когда я запускаю свою программу, я получаю эту ошибку, когда я вызываю BIO_do_connect()
:
error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:s3_pkt.c:1086:SSL alert number 40
Ошибка идентична для MacOS Yosemite и старого дистрибутива Linux.
Для сравнения:эта команда не терпит неудачу:
openssl s_client -connect mail.example.org:993
Для справки, вот минимальная программа, которая демонстрирует проблему (я скрыл свое имя сервера).
Есть ликакой параметр я пропускаю?
/*
* Under MacOS, compile with:
* cc -o tester -I/opt/local/include tester.c -L/opt/local/lib -lssl -lcrypto
*
* Under Linux, compile with:
* cc -o tester tester.c -lssl
*/
#define CERTS_DIR "/etc/ssl/certs/"
#include <stdio.h>
#include <stdlib.h>
#include <openssl/bio.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
int
main()
{
BIO *bio, *rbio;
SSL_CTX *ctx;
SSL *ssl;
const char *hostname = "mail.example.org";
int port = 993;
SSL_library_init();
ERR_load_BIO_strings();
SSL_load_error_strings();
OpenSSL_add_all_algorithms();
ctx = SSL_CTX_new(SSLv3_client_method());
if (ctx == NULL) {
ERR_print_errors_fp(stderr);
return 3;
}
/* load trusted certs with SSL_CTX_load_verify_locations()? */
if (!SSL_CTX_load_verify_locations(ctx, NULL, CERTS_DIR)) {
fprintf(stderr, "Unable to load trusted SSL certs\n");
}
bio = BIO_new_ssl_connect(ctx);
BIO_get_ssl(bio, &ssl);
SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
BIO_set_conn_hostname(bio, hostname);
BIO_set_conn_int_port(bio, &port);
// Here is the call that fails
if (BIO_do_connect(bio) <= 0) {
fprintf(stderr, "cannot connect to %s:%d\n", hostname, port);
ERR_print_errors_fp(stderr);
BIO_free_all(bio);
SSL_CTX_free(ctx);
return 3;
}
printf("Success\n");
return 0;
}