Funções básicas para conexão OpenSSL em C
Publicado por Alexandre Mulatinho (última atualização em 07/02/2014)
[ Hits: 5.964 ]
Homepage: http://alex.mulatinho.net
Uma amostra de uma conexão SSL com o Google, lendo e escrevendo dados.
/* * ssl-mlt.c * Alexandre Mulatinho <alex@mulatinho.net> * Simple framework to HTTPs * */ #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <netdb.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <openssl/rand.h> #include <openssl/ssl.h> #include <openssl/err.h> #define BUF_MAX 4096 typedef struct { int socket; char *hostname; SSL *ssl; SSL_CTX *ssl_ctx; } conn; int mlt_handle(char *servname) { int ret, soq; struct hostent *host; struct sockaddr_in server; host = gethostbyname (servname); if ( (soq = socket(AF_INET, SOCK_STREAM, 0)) == -1 ) { perror ("Socket"); return -1; } server.sin_family = AF_INET; server.sin_port = htons (443); server.sin_addr = *((struct in_addr *) host->h_addr); if ( ( ret = connect(soq, (struct sockaddr *)&server, sizeof (struct sockaddr)) ) == -1 ) { perror ("Connect"); return -1; } return soq; } conn *mlt_ssl_connect(char *servname) { conn *p; p = (conn *)malloc(sizeof(conn)); p->ssl = NULL; p->ssl_ctx = NULL; p->hostname = servname; SSL_load_error_strings (); SSL_library_init (); if ( (p->socket = mlt_handle(p->hostname)) == -1) return NULL; if ( (p->ssl_ctx = SSL_CTX_new(SSLv23_client_method ())) == NULL) ERR_print_errors_fp (stderr); if ( (p->ssl = SSL_new(p->ssl_ctx)) == NULL) ERR_print_errors_fp (stderr); if (!SSL_set_fd(p->ssl, p->socket)) ERR_print_errors_fp (stderr); if (SSL_connect(p->ssl) != 1) ERR_print_errors_fp (stderr); return p; } void mlt_disconnect(conn *p) { SSL_shutdown(p->ssl); close(p->socket); SSL_free(p->ssl); SSL_CTX_free(p->ssl_ctx); free(p); } int mlt_ssl_read(conn *p, char *buffer) { int bytes; memset(buffer, '{FONTE}', BUF_MAX); bytes = SSL_read (p->ssl, buffer, BUF_MAX-1); return bytes; } int mlt_ssl_write(conn *p, char *cmd) { int ret; ret = SSL_write(p->ssl, cmd, strlen(cmd)); return ret; } int main (int argc, char **argv) { conn *server; char buffer[BUF_MAX]; int bytes; server = mlt_ssl_connect("www.google.com"); mlt_ssl_write(server, "GET /\r\n\r\n"); while (1) { bytes = mlt_ssl_read(server, buffer); if (!bytes) { fprintf(stderr, ".-. server disconnected.\n"); mlt_disconnect(server); break; } fprintf(stdout, "%s", buffer); } return 0; }
Robo HTTP usando socket e código multiplataforma
Exemplo de sockets: um client e um server bem simples
Nenhum comentário foi encontrado.
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Flatpak: remover runtimes não usados e pacotes
Mudar o gerenciador de login (GDM para SDDM e vice-versa) - parte 2
Como atualizar o Debian 8 para o 10 (10)
Dica sobre iptables ACCEPT e DROP (6)
NGNIX - Aplicar SNAT para evitar roteamento assimetrico (29)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta