Funções básicas para conexão OpenSSL em C
Publicado por Alexandre Mulatinho (última atualização em 07/02/2014)
[ Hits: 6.539 ]
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;
}
Usando sockets para monitorar servidores
Exemplo de sockets: um client e um server bem simples
Connect - um simples programa para atravessar proxys Socks
Nenhum comentário foi encontrado.
O Journal no Linux para a guarda e consulta de logs do sistema
A evolução do Linux e as mudanças que se fazem necessárias desde o seu lançamento
Maquina modesta - a vez dos navegadores ferrarem o usuario
Fscrypt: protegendo arquivos do seu usuário sem a lentidão padrão de criptograr o disco
Sway no Arch Linux: configuração Inicial sem enrolação
Resolvendo o bloqueio do Módulo Warsaw no Arch Linux (Porta 30900)
Continuando meus tópicos anteriores (0)
Saída de loop após teste de if. (2)
Governo da França vai trocar Windows por Linux (9)
Warsaw não é reconhecido no Google Chrome 147.0.7727.55 [RESOLVIDO] (9)









