Funções básicas para conexão OpenSSL em C
Publicado por Alexandre Mulatinho (última atualização em 07/02/2014)
[ Hits: 6.409 ]
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
Calcular Broadcast e IPs disponíveis
Connect - um simples programa para atravessar proxys Socks
Nenhum comentário foi encontrado.
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Como automatizar sua instalação do Ubuntu para desenvolvimento de software.
Consertando o áudio com som ruim no Pipewire
Como implementar Raid (0, 1, 5, 6, 10 e 50)
fusermount3 no Ubuntu 25.10 - mantenha o perfil do AppArmor
[Resolvido] dlopen(): error loading libfuse.so.2 AppImages require FUSE to run.
Como programar um sistema de controle para distribuições linux em c? (4)
Servidor Ubuntu 24.04 HD 500 não tenho espaço na \home\adminis... (2)









