#include <openssl/ssl.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <openssl/err.h>
unsigned char* buf;
int len;
SSL_CTX* InitServerCTX(void)
{
SSL_CTX* ctx;
OpenSSL_add_all_algorithms();
ctx = SSL_CTX_new(SSLv23_server_method());
SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1);
if (ctx == NULL) {
/*handle errors */
}
return ctx;
}
int OpenListener(int port)
{
/* Create server socket */
}
void func()
{
SSL_CTX* ctx;
int server, port;
int ret;
SSL_library_init();
ctx = InitServerCTX();
server = OpenListener(port);
while (1) {
struct sockaddr_in addr;
socklen_t len = sizeof(addr);
SSL* ssl;
int client = accept(server, (struct sockaddr*)&addr, &len);
printf("Connection: %s:%d\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
ssl = SSL_new(ctx);
SSL_set_fd(ssl, client);
ret = SSL_accept(ssl);
if (SSL_get_error(ssl, ret) <= 0)
/* Serve connection */;
else
SSL_free(ssl);
}
close(server);
SSL_CTX_free(ctx);
}
В этом примере InitServerCTX()
инициализирует контекстные ctx
для соединений TLS/SSL, но сертификат не загружен в ctx
. Когда SSL_accept
проверяет квитирование TLS/SLL для структуры SSL, созданной из ctx
нет доступного сертификата для проверки подлинности сервера.
Коррекция - перед созданием структуры SSL загрузите сертификат в контекстОдной из возможных коррекций является загрузка сертификата в контекст, созданный для соединений TLS/SSL, например с помощью SSL_CTX_use_certificate_file
.
#include <openssl/ssl.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <openssl/err.h>
unsigned char* buf;
int len;
SSL_CTX* InitServerCTX(void)
{
SSL_CTX* ctx;
OpenSSL_add_all_algorithms();
ctx = SSL_CTX_new(SSLv23_server_method());
SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1);
if (ctx == NULL) {
/*handle errors */
}
return ctx;
}
void LoadCertificates(SSL_CTX* ctx, char* CertFile, char* KeyFile)
{
if (SSL_CTX_use_certificate_file(ctx, CertFile, SSL_FILETYPE_PEM) <= 0) {
/* Handle errors */
}
}
int OpenListener(int port)
{
/* Create server socket */
}
void func()
{
SSL_CTX* ctx;
int server, port;
int ret;
SSL_library_init();
ctx = InitServerCTX();
LoadCertificates(ctx, "mycert.pem", "mycert.pem");
server = OpenListener(port);
while (1) {
struct sockaddr_in addr;
socklen_t len = sizeof(addr);
SSL* ssl;
int client = accept(server, (struct sockaddr*)&addr, &len);
printf("Connection: %s:%d\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
ssl = SSL_new(ctx);
SSL_set_fd(ssl, client);
ret = SSL_accept(ssl);
if (SSL_get_error(ssl, ret) <= 0)
/* Serve connection */;
else
SSL_free(ssl);
}
close(server);
SSL_CTX_free(ctx);
}