Hay varios pasos al utilizar OpenSSL. Debe tener un certificado SSL hecho que pueda contener el certificado con la clave privada asegúrese de especificar la ubicación exacta del certificado (este ejemplo lo tiene en la raíz). Hay muchos buenos tutoriales por ahí.
Algunos incluyen:
#include <openssl/applink.c>
#include <openssl/bio.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
Necesitará inicializar OpenSSL:
void InitializeSSL()
{
SSL_load_error_strings();
SSL_library_init();
OpenSSL_add_all_algorithms();
}
void DestroySSL()
{
ERR_free_strings();
EVP_cleanup();
}
void ShutdownSSL()
{
SSL_shutdown(cSSL);
SSL_free(cSSL);
}
Ahora, la mayor parte de la funcionalidad. Es posible que desee agregar un bucle while en las conexiones.
int sockfd, newsockfd;
SSL_CTX *sslctx;
SSL *cSSL;
InitializeSSL();
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd< 0)
{
//Log and Error
return;
}
struct sockaddr_in saiServerAddress;
bzero((char *) &saiServerAddress, sizeof(saiServerAddress));
saiServerAddress.sin_family = AF_INET;
saiServerAddress.sin_addr.s_addr = serv_addr;
saiServerAddress.sin_port = htons(aPortNumber);
bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
listen(sockfd,5);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
sslctx = SSL_CTX_new( SSLv23_server_method());
SSL_CTX_set_options(sslctx, SSL_OP_SINGLE_DH_USE);
int use_cert = SSL_CTX_use_certificate_file(sslctx, "/serverCertificate.pem" , SSL_FILETYPE_PEM);
int use_prv = SSL_CTX_use_PrivateKey_file(sslctx, "/serverCertificate.pem", SSL_FILETYPE_PEM);
cSSL = SSL_new(sslctx);
SSL_set_fd(cSSL, newsockfd );
//Here is the SSL Accept portion. Now all reads and writes must use SSL
ssl_err = SSL_accept(cSSL);
if(ssl_err <= 0)
{
//Error occurred, log and close down ssl
ShutdownSSL();
}
Luego podrá leer o escribir usando:
SSL_read(cSSL, (char *)charBuffer, nBytesToRead);
SSL_write(cSSL, "Hi :3\n", 6);
La actualización seSSL_CTX_new
debe llamar con el método TLS que mejor se adapte a sus necesidades para admitir las versiones más recientes de seguridad, en lugar de SSLv23_server_method()
. Ver:
OpenSSL SSL_CTX_new descripción
TLS_method (), TLS_server_method (), TLS_client_method ().
Estos son los métodos SSL / TLS de versión flexible de uso general . La versión real del protocolo utilizada se negociará con la versión más alta que el cliente y el servidor admitan mutuamente. Los protocolos admitidos son SSLv3, TLSv1, TLSv1.1, TLSv1.2 y TLSv1.3.