• linux openssl 编程 Client端


    相关配置等请參看上一篇关于server端文章:http://blog.csdn.net/pingd/article/details/47805349

    1.Client端源代码:

    openssl_client.c

    #include <stdio.h>
    #include <string.h>
    #include <errno.h>
    #include <sys/socket.h>
    #include <resolv.h>
    #include <stdlib.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <openssl/ssl.h>
    #include <openssl/err.h>
    
    #define MAXBUF 1024
    
    void ShowCerts(SSL * ssl)
    {
        X509 *cert;
        char *line;
    
        cert = SSL_get_peer_certificate(ssl);
        if (cert != NULL) {
            printf("Digital cert info:
    ");
            line = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0);
            printf("Cert: %s
    ", line);
            free(line);
            line = X509_NAME_oneline(X509_get_issuer_name(cert), 0, 0);
            printf("Owner: %s
    ", line);
            free(line);
            X509_free(cert);
        } else
            printf("No cert info
    ");
    }
    
    int main(int argc, char **argv)
    {
        int sockfd, len;
        struct sockaddr_in dest;
        char buffer[MAXBUF + 1];
        SSL_CTX *ctx;
        SSL *ssl;
    
        if (argc != 3)
    	{
            printf("Usage:%s [server_ip] [server_port]
    ",argv[0]);
            exit(-1);
        }
    
        /* SSL 库初始化,參看 ssl-server.c 代码 */
        SSL_library_init();
        OpenSSL_add_all_algorithms();
        SSL_load_error_strings();
        ctx = SSL_CTX_new(SSLv23_client_method());
        if (ctx == NULL) 
    	{
            ERR_print_errors_fp(stdout);
            exit(-1);
        }
    
        /* 创建一个 socket 用于 tcp 通信 */
        if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) 
    	{
            perror("Socket");
            exit(errno);
        }
        printf("socket created
    ");
    
        /* 初始化服务器端(对方)的地址和端口信息 */
        bzero(&dest, sizeof(dest));
        dest.sin_family = AF_INET;
        dest.sin_port = htons(atoi(argv[2]));
        if (inet_aton(argv[1], (struct in_addr *) &dest.sin_addr.s_addr) == 0) {
            perror(argv[1]);
            exit(errno);
        }
        printf("address created
    ");
    
        /* 连接服务器 */
        if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != 0) {
            perror("Connect ");
            exit(errno);
        }
        printf("server connected
    ");
    
        /* 基于 ctx 产生一个新的 SSL */
        ssl = SSL_new(ctx);
        SSL_set_fd(ssl, sockfd);
        /* 建立 SSL 连接 */
        if (SSL_connect(ssl) == -1)
            ERR_print_errors_fp(stderr);
        else {
            printf("Connected with %s encryption
    ", SSL_get_cipher(ssl));
            ShowCerts(ssl);
        }
    
        /* 接收对方发过来的消息,最多接收 MAXBUF 个字节 */
        bzero(buffer, MAXBUF + 1);
        /* 接收服务器来的消息 */
        len = SSL_read(ssl, buffer, MAXBUF);
        if (len > 0)
            printf("recv message '%s' ok.total size:'%d'
    ",
                   buffer, len);
        else {
            printf("recv message error!error code:'%d',error info:'%s'
    ",
                 errno, strerror(errno));
            goto finish;
        }
        bzero(buffer, MAXBUF + 1);
        strcpy(buffer, "from client->server");
        /* 发消息给服务器 */
        len = SSL_write(ssl, buffer, strlen(buffer));
        if (len < 0)
            printf("send message '%s' error!error code:'%d',error info:'%s'
    ",
                 buffer, errno, strerror(errno));
        else
            printf("send message '%s' ok,total size:'%d'
    ",buffer, len);
    
      finish:
        /* 关闭连接 */
        SSL_shutdown(ssl);
        SSL_free(ssl);
        close(sockfd);
        SSL_CTX_free(ctx);
        return 0;
    }
    

    2.编译

    gcc -o openssl_client openssl_client.c -Wall -lssl -lcrypto -L./openssl-1.0.2d/ -Wl,-rpath=./openssl-1.0.2d 
    3.执行

    Usage:openssl_client [server_ip] [server_port]

  • 相关阅读:
    关于数组的tip
    php 计算注册的天数
    PHP推送接口
    nginx 301 重定向
    tp3、tp5 输出上一次sql语句
    MySQL not null 取消条件限制
    vscode查看PHP函数来源
    关于git及项目的归档
    我的第一个JW项目——网上商城设计说明书(六)
    我的第一个JW项目——网上商城设计说明书(五)
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/6916382.html
Copyright © 2020-2023  润新知