C调用OPENSSL做REST服务客户端的例子
//SSL-Client.c#include <stdio.h>#include <errno.h>#include <unistd.h>#include <malloc.h>#include <string.h>#include <sys/socket.h>#include <resolv.h>#include <netdb.h>#include <openssl/ssl.h>#include <openssl/err.h>#define FAIL    -1int OpenConnection(const char *hostname, int port){   int sd;    struct hostent *host;    struct sockaddr_in addr;    if ( (host = gethostbyname(hostname)) == NULL )    {        perror(hostname);        abort();    }    sd = socket(PF_INET, SOCK_STREAM, 0);    bzero(&addr, sizeof(addr));    addr.sin_family = AF_INET;    addr.sin_port = htons(port);    addr.sin_addr.s_addr = *(long*)(host->h_addr);    if ( connect(sd, (struct sockaddr*)&addr, sizeof(addr)) != 0 )    {        close(sd);        perror(hostname);        abort();    }    return sd;}SSL_CTX* InitCTX(void){   SSL_METHOD *method;    SSL_CTX *ctx;    OpenSSL_add_all_algorithms();  /* Load cryptos, et.al. */    SSL_load_error_strings();   /* Bring in and register error messages */    method = SSLv3_client_method();  /* Create new client-method instance */    ctx = SSL_CTX_new(method);   /* Create new context */    if ( ctx == NULL )    {        ERR_print_errors_fp(stderr);        abort();    }    return ctx;}void ShowCerts(SSL* ssl){   X509 *cert;    char *line;    cert = SSL_get_peer_certificate(ssl); /* get the server's certificate */    if ( cert != NULL )    {        printf("Server certificates:\n");        line = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0);        printf("Subject: %s\n", line);        free(line);       /* free the malloc'ed string */        line = X509_NAME_oneline(X509_get_issuer_name(cert), 0, 0);        printf("Issuer: %s\n", line);        free(line);       /* free the malloc'ed string */        X509_free(cert);     /* free the malloc'ed certificate copy */    }    else        printf("No certificates.\n");}int main(int count, char *strings[]){   SSL_CTX *ctx;    int server;    SSL *ssl;    char buf[1024];    int bytes;    char *hostname, *portnum;    if ( count != 3 )    {        printf("usage: %s <hostname> <portnum>\n", strings[0]);        exit(0);    }    SSL_library_init();    hostname=strings[1];    portnum=strings[2];    ctx = InitCTX();    server = OpenConnection(hostname, atoi(portnum));    ssl = SSL_new(ctx);      /* create new SSL connection state */    SSL_set_fd(ssl, server);    /* attach the socket descriptor */    if ( SSL_connect(ssl) == FAIL )   /* perform the connection */        ERR_print_errors_fp(stderr);    else    {   char *msg = "Hello???";        printf("Connected with %s encryption\n", SSL_get_cipher(ssl));        ShowCerts(ssl);        /* get any certs */        SSL_write(ssl, msg, strlen(msg));   /* encrypt & send message */        bytes = SSL_read(ssl, buf, sizeof(buf)); /* get reply & decrypt */        buf[bytes] = 0;        printf("Received: \"%s\"\n", buf);        SSL_free(ssl);        /* release connection state */    }    close(server);         /* close socket */    SSL_CTX_free(ctx);        /* release context */    return 0;}PS:个人觉得这个可能会中文会乱码
posted on 2015-01-28 21:51 redmondfans 阅读(299) 评论(0) 收藏 举报
                    
                
                
            
        
浙公网安备 33010602011771号