Funções básicas para conexão OpenSSL em C

Publicado por Alexandre Mulatinho (última atualização em 07/02/2014)

[ Hits: 6.084 ]

Homepage: http://alex.mulatinho.net

Download ssl-example.c




Uma amostra de uma conexão SSL com o Google, lendo e escrevendo dados.

  



Esconder código-fonte

/*
 * 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;
}

Scripts recomendados

Destrinchador de IPs

Tratando o log do snmptrapd

Cliente TCP/IP em C

Alucard - scan de redes defensivo

Usando sockets para monitorar servidores


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts