socket example c linux sockets unix ssl

example - tcp server c#



Convierta un socket simple en un socket SSL (4)

Escribí programas C simples, que están usando sockets (''cliente'' y ''servidor''). (Uso de UNIX / Linux)

El lado del servidor simplemente crea un socket:

sockfd = socket(AF_INET, SOCK_STREAM, 0);

Y luego lo vincula a sockaddr:

bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));

Y escucha (y acepta y lee):

listen(sockfd,5); newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); read(newsockfd,buffer,255);

El cliente crea el socket y luego escribe en él.

Ahora, quiero convertir esta simple conexión en una conexión SSL, de la forma más sencilla, idílica, precisa y rápida.

Intenté agregar OpenSSL a mi proyecto, pero no puedo encontrar una manera fácil de implementar lo que quiero.


Aquí mi ejemplo ssl socket server threads (conexión múltiple) https://github.com/breakermind/CppLinux/blob/master/QtSslServerThreads/breakermindsslserver.cpp

#include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <string> #include <unistd.h> #include <iostream> #include <breakermindsslserver.h> using namespace std; int main(int argc, char *argv[]) { BreakermindSslServer boom; boom.Start(123,"/home/user/c++/qt/BreakermindServer/certificate.crt", "/home/user/c++/qt/BreakermindServer/private.key"); return 0; }


Hay varios pasos al usar OpenSSL. Debe tener un certificado SSL creado 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 para la mayor parte de la funcionalidad. Es posible que desee agregar un ciclo 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(); }

Entonces puede leer o escribir usando:

SSL_read(cSSL, (char *)charBuffer, nBytesToRead); SSL_write(cSSL, "Hi :3/n", 6);


OpenSSL es bastante difícil. Es fácil desperdiciar accidentalmente toda su seguridad al no hacer exactamente bien la negociación. (Diablos, un error me ha picado cuando Curl no estaba leyendo exactamente las alertas de OpenSSL, y no podía hablar con algunos sitios).

Si realmente quieres algo rápido y simple, pon el stud en frente de tu programa y llámalo un día. Tener SSL en un proceso diferente no lo hará perder velocidad: http://vincent.bernat.im/en/blog/2011-ssl-benchmark.html


Para otros como yo:

Si descarga la fuente SSL, hay un directorio demos/ssl/ con código de ejemplo en c ++: https://github.com/openssl/openssl/tree/master/demos/ssl

ACTUALIZACIÓN: han eliminado esa demostración. Ahora está disponible solo a través del historial: https://github.com/openssl/openssl/tree/691064c47fd6a7d11189df00a0d1b94d8051cbe0/demos/ssl Probablemente tendrá que encontrar una versión que funcione, originalmente publiqué esta respuesta el 6 de noviembre de 2015. Y tuve para editar la fuente, no mucho.

Certificados: .pem en demos/certs/apps/ : https://github.com/openssl/openssl/tree/master/demos/certs/apps