Bei Verwendung von OpenSSL gibt es mehrere Schritte. Sie müssen ein SSL-Zertifikat erstellen lassen, das das Zertifikat mit dem privaten Schlüssel enthalten kann. Geben Sie unbedingt den genauen Speicherort des Zertifikats an (in diesem Beispiel befindet es sich im Stammverzeichnis). Es gibt viele gute Tutorials.
Einige beinhalten:
#include <openssl/applink.c>
#include <openssl/bio.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
Sie müssen OpenSSL initialisieren:
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);
}
Nun zum Großteil der Funktionalität. Möglicherweise möchten Sie eine while-Schleife für Verbindungen hinzufügen.
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();
}
Sie können dann lesen oder schreiben mit:
SSL_read(cSSL, (char *)charBuffer, nBytesToRead);
SSL_write(cSSL, "Hi :3\n", 6);
Update
Das SSL_CTX_new
sollte mit der TLS-Methode aufgerufen werden, die Ihren Anforderungen am besten entspricht, um die neueren Sicherheitsversionen zu unterstützen SSLv23_server_method()
. Siehe:
OpenSSL SSL_CTX_neue Beschreibung
TLS_method (), TLS_server_method (), TLS_client_method ().
Dies sind die universellen Versionen, die flexibel sind SSL / TLS-Methoden. Die tatsächlich verwendete Protokollversion wird mit der höchsten Version ausgehandelt, die vom Client und vom Server gegenseitig unterstützt wird. Die unterstützten Protokolle sind SSLv3, TLSv1, TLSv1.1, TLSv1.2 und TLSv1.3.