Ci sono diversi passaggi quando si utilizza OpenSSL. È necessario disporre di un certificato SSL che possa contenere il certificato con la chiave privata, assicurarsi di specificare la posizione esatta del certificato (questo esempio lo ha nella radice). Ci sono molti buoni tutorial là fuori.
Alcuni includono:
#include <openssl/applink.c>
#include <openssl/bio.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
Avrai bisogno di inizializzare 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);
}
Ora per la maggior parte delle funzionalità. Potresti voler aggiungere un ciclo while sulle connessioni.
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();
}
Sarai quindi in grado di leggere o scrivere utilizzando:
SSL_read(cSSL, (char *)charBuffer, nBytesToRead);
SSL_write(cSSL, "Hi :3\n", 6);
Aggiorna
Il SSL_CTX_new
dovrebbe essere chiamato con il metodo TLS che meglio si adatta alle tue esigenze per supportare le versioni più recenti di sicurezza, invece di SSLv23_server_method()
. Vedi:
OpenSSL SSL_CTX_new descrizione
TLS_method (), TLS_server_method (), TLS_client_method ().
Questi sono i metodi SSL / TLS flessibili per la versione generici . La versione effettiva del protocollo utilizzata verrà negoziata con la versione più alta supportata reciprocamente dal client e dal server. I protocolli supportati sono SSLv3, TLSv1, TLSv1.1, TLSv1.2 e TLSv1.3.