elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Conexión HTTPS con openssl C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Conexión HTTPS con openssl C++  (Leído 2,673 veces)
Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Conexión HTTPS con openssl C++
« en: 10 Noviembre 2015, 10:03 am »

Hola, estaba probando con openssl a realizar una conexión https visto que no conseguí curl, de hecho no me hace falta si se usar openssl que de momento no es el caso.

Lo primero una duda, cuando me conecto con google.com de la forma:

Código
  1. int sd;
  2. struct hostent *host;
  3. struct sockaddr_in addr;
  4.  
  5. host = gethostbyname("google.com"); /* convert hostname ‡ IP addr */
  6. sd = socket(PF_INET, SOCK_STREAM, 0);  /* create TCP socket */
  7. memset(&addr, 0, sizeof(addr));
  8. addr.sin_family = AF_INET;
  9. addr.sin_port = htons(80);     /* set the desired port */
  10. addr.sin_addr.s_addr = *(long*)(host->h_addr); /* and address */
  11. connect(sd, (struct sockaddr*)&addr, sizeof(addr));/* connect */
  12. //send .. recv..

Los datos que obtengo son descifrados, esto es porque me conecto a el puerto 80 que usa HTTP ¿verdad?, ¿pero google no forzaba a usar https?, no entiendo porque una conexión normal no me la cifra, ¿será que es la primera interacción?.

Me he puesto a probar una conexión https siguiendo un tutorial, que encontré aquí:

http://www.informit.com/articles/article.aspx?p=22078&seqNum=3

Muy bueno por cierto, porque hay poca documentación sobre openssl y ejemplos.

Código
  1. SSL_METHOD *method;
  2. SSL_CTX *ctx;
  3. OpenSSL_add_all_algorithms();   /* load & register cryptos */
  4. SSL_load_error_strings();     /* load all error messages */
  5. method = (SSL_METHOD*)SSLv2_client_method();   /* create client instance */
  6. ctx = SSL_CTX_new(method);         /* create context */
  7. int sd;
  8. struct hostent *host;
  9. struct sockaddr_in addr;
  10.  
  11. host = gethostbyname("google.com"); /* convert hostname ‡ IP addr */
  12. sd = socket(PF_INET, SOCK_STREAM, 0);  /* create TCP socket */
  13. memset(&addr, 0, sizeof(addr));
  14. addr.sin_family = AF_INET;
  15. addr.sin_port = htons(80);     /* set the desired port */
  16. addr.sin_addr.s_addr = inet_addr("216.58.211.238"); /* and address */
  17. connect(sd, (struct sockaddr*)&addr, sizeof(addr));/* connect */
  18. SSL *ssl;
  19. ssl = SSL_new(ctx);    /* create new SSL connection state */
  20. SSL_set_fd(ssl, sd);   /* attach the socket descriptor */
  21. SSL_connect(ssl);          /* perform the connection */
  22. SSL_write(ssl, "ola que ase", 0);
  23. char rec[1000];
  24. SSL_read(ssl, rec, 0);
  25. cout << rec;

Me salta un error en ejecución en SSL_set_fd(ssl, sd);, donde he pasado de segundo argumento un socket, ¿que se supone que tengo que pasar ahí?.

¿Se supone que hago una conexión http y luego paso a https? ¿o como va?.

Seguiré probando, un saludo.

Edito: Bueno he estado probando y resulta que le pasaba el primer argumento null, el segundo argumento creo que es lo que devuelve connect, fui probando porque devolvia null y probando variable a variable hasta que ví que me faltaba una función de inicializar la librería tal que:

SSL_library_init();

Tras ponerlo no dio error, pero devolvió basura, seguiré probando a ver. Creo que es porque nunca he usado write() a ver de que va..

Código
  1. char *post = "POST / HTTP/1.1\r\ncontent-type:application/x-www-form-urlencoded;charset=utf-8\r\nhost: google.com\r\n";
  2.  
  3. SSL_METHOD *method;
  4. SSL_CTX *ctx;
  5. SSL_library_init();
  6. OpenSSL_add_all_algorithms();   /* load & register cryptos */
  7. SSL_load_error_strings();     /* load all error messages */
  8. method = const_cast<SSL_METHOD*>(SSLv2_client_method());   /* create client instance */
  9. ctx = SSL_CTX_new(method);         /* create context */
  10. int sd, server;
  11. sockaddr_in addr;
  12. WSADATA wsa;
  13. WSAStartup(MAKEWORD(2, 0), &wsa);
  14. if (sd = socket(AF_INET, SOCK_STREAM, 0) == SOCKET_ERROR)
  15. cout << "error crear socket";/* create TCP socket */
  16. memset(&addr, 0, sizeof(addr));
  17. addr.sin_family = AF_INET;
  18. addr.sin_port = htons(80);     /* set the desired port */
  19. addr.sin_addr.s_addr = inet_addr("216.58.211.238"); /* and address */
  20. if (server = connect(sd, (struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR){
  21. cout << "error conectar: " << WSAGetLastError();/* connect */
  22. }
  23. cout << "conectado";
  24. SSL *ssl;
  25. ssl = SSL_new(ctx);    /* create new SSL connection state */
  26. SSL_set_fd(ssl, server);   /* attach the socket descriptor */
  27. SSL_connect(ssl);          /* perform the connection */
  28. SSL_write(ssl, post, strlen(post));
  29. char rec[1000];
  30. SSL_read(ssl, rec, 0);
  31. cout << rec;
  32. /*...*/
  33. SSL_free(ssl);              /* release SSL state */


« Última modificación: 10 Noviembre 2015, 10:41 am por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
nepa

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: Conexión HTTPS con openssl C++
« Respuesta #1 en: 19 Diciembre 2015, 23:43 pm »

Kasperday: Yo estoy en el mismo trabajo. estoy tratando de conectarme a una pagina de internet que es https. Lo que he podido entender es que el puerto para conexiones https es el 443.


En línea

Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Conexión HTTPS con openssl C++
« Respuesta #2 en: 20 Diciembre 2015, 00:18 am »

Toma socio, este código es funcional que tengo, por supuesto necesitas openssl, gracias a ivancea, yo no quería hacerlo con BIO, pero al final no encontré otra manera, esta si funciona.

Código
  1. CRYPTO_malloc_init();
  2. SSL_library_init();
  3. OpenSSL_add_all_algorithms();
  4.  
  5. SSL_CTX* ctx = SSL_CTX_new(SSLv23_client_method());
  6. SSL* ssl;
  7. BIO* bio = BIO_new_ssl_connect(ctx);
  8. if (bio == NULL) {
  9. SSL_CTX_free(ctx);
  10. return 0;
  11. }
  12. BIO_get_ssl(bio, &ssl);
  13. SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
  14. BIO_set_conn_hostname(bio, "www.google.com:443");
  15.  
  16. if (BIO_do_connect(bio) <= 0) {
  17. BIO_free_all(bio);
  18. SSL_CTX_free(ctx);
  19. return 0;
  20. }
  21.  
  22. if (BIO_do_handshake(bio) <= 0) {
  23. BIO_free_all(bio);
  24. SSL_CTX_free(ctx);
  25. return 0;
  26. }
  27. char buf[1024];
  28. memset(buf, 0, sizeof(buf));
  29. BIO_puts(bio, "GET /index.html HTTP/1.1\r\nHost: www.google.com\r\n\Connection: close\r\n\r\n");
  30. string respuesta = "";
  31. while (1) {
  32. int x = BIO_read(bio, buf, sizeof(buf)-1);
  33. if (x == 0) {
  34. break;
  35. }
  36. else if (x < 0) {
  37. if (!BIO_should_retry(bio)) {
  38. BIO_free_all(bio);
  39. SSL_CTX_free(ctx);
  40. return 0;
  41. }
  42. }
  43. else{
  44. respuesta += buf;
  45. }
  46. }
  47. BIO_free_all(bio);
  48. SSL_CTX_free(ctx);
  49.  

Un saludo.
En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
nepa

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: Conexión HTTPS con openssl C++
« Respuesta #3 en: 21 Diciembre 2015, 17:36 pm »

Gracias por tu ayuda. tuve que cambiar algunas parametros pero me funciono.
En línea

Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Conexión HTTPS con openssl C++
« Respuesta #4 en: 21 Diciembre 2015, 17:51 pm »

Gracias por tu ayuda. tuve que cambiar algunas parametros pero me funciono.

De nada hijo, un placer ayudar.

Saludos.
En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines