linux openssl 编程 Client端

来源:互联网 发布:王阳明心学知乎 编辑:程序博客网 时间:2024/06/08 00:37

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

1.Client端源码:

openssl_client.c

[cpp] view plain copy
  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #include <errno.h>  
  4. #include <sys/socket.h>  
  5. #include <resolv.h>  
  6. #include <stdlib.h>  
  7. #include <netinet/in.h>  
  8. #include <arpa/inet.h>  
  9. #include <unistd.h>  
  10. #include <openssl/ssl.h>  
  11. #include <openssl/err.h>  
  12.   
  13. #define MAXBUF 1024  
  14.   
  15. void ShowCerts(SSL * ssl)  
  16. {  
  17.     X509 *cert;  
  18.     char *line;  
  19.   
  20.     cert = SSL_get_peer_certificate(ssl);  
  21.     if (cert != NULL) {  
  22.         printf("Digital cert info:\n");  
  23.         line = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0);  
  24.         printf("Cert: %s\n", line);  
  25.         free(line);  
  26.         line = X509_NAME_oneline(X509_get_issuer_name(cert), 0, 0);  
  27.         printf("Owner: %s\n", line);  
  28.         free(line);  
  29.         X509_free(cert);  
  30.     } else  
  31.         printf("No cert info\n");  
  32. }  
  33.   
  34. int main(int argc, char **argv)  
  35. {  
  36.     int sockfd, len;  
  37.     struct sockaddr_in dest;  
  38.     char buffer[MAXBUF + 1];  
  39.     SSL_CTX *ctx;  
  40.     SSL *ssl;  
  41.   
  42.     if (argc != 3)  
  43.     {  
  44.         printf("Usage:%s [server_ip] [server_port]\n",argv[0]);  
  45.         exit(-1);  
  46.     }  
  47.   
  48.     /* SSL 库初始化,参看 ssl-server.c 代码 */  
  49.     SSL_library_init();  
  50.     OpenSSL_add_all_algorithms();  
  51.     SSL_load_error_strings();  
  52.     ctx = SSL_CTX_new(SSLv23_client_method());  
  53.     if (ctx == NULL)   
  54.     {  
  55.         ERR_print_errors_fp(stdout);  
  56.         exit(-1);  
  57.     }  
  58.   
  59.     /* 创建一个 socket 用于 tcp 通信 */  
  60.     if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)   
  61.     {  
  62.         perror("Socket");  
  63.         exit(errno);  
  64.     }  
  65.     printf("socket created\n");  
  66.   
  67.     /* 初始化服务器端(对方)的地址和端口信息 */  
  68.     bzero(&dest, sizeof(dest));  
  69.     dest.sin_family = AF_INET;  
  70.     dest.sin_port = htons(atoi(argv[2]));  
  71.     if (inet_aton(argv[1], (struct in_addr *) &dest.sin_addr.s_addr) == 0) {  
  72.         perror(argv[1]);  
  73.         exit(errno);  
  74.     }  
  75.     printf("address created\n");  
  76.   
  77.     /* 连接服务器 */  
  78.     if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != 0) {  
  79.         perror("Connect ");  
  80.         exit(errno);  
  81.     }  
  82.     printf("server connected\n");  
  83.   
  84.     /* 基于 ctx 产生一个新的 SSL */  
  85.     ssl = SSL_new(ctx);  
  86.     SSL_set_fd(ssl, sockfd);  
  87.     /* 建立 SSL 连接 */  
  88.     if (SSL_connect(ssl) == -1)  
  89.         ERR_print_errors_fp(stderr);  
  90.     else {  
  91.         printf("Connected with %s encryption\n", SSL_get_cipher(ssl));  
  92.         ShowCerts(ssl);  
  93.     }  
  94.   
  95.     /* 接收对方发过来的消息,最多接收 MAXBUF 个字节 */  
  96.     bzero(buffer, MAXBUF + 1);  
  97.     /* 接收服务器来的消息 */  
  98.     len = SSL_read(ssl, buffer, MAXBUF);  
  99.     if (len > 0)  
  100.         printf("recv message '%s' ok.total size:'%d'\n",  
  101.                buffer, len);  
  102.     else {  
  103.         printf("recv message error!error code:'%d',error info:'%s'\n",  
  104.              errno, strerror(errno));  
  105.         goto finish;  
  106.     }  
  107.     bzero(buffer, MAXBUF + 1);  
  108.     strcpy(buffer, "from client->server");  
  109.     /* 发消息给服务器 */  
  110.     len = SSL_write(ssl, buffer, strlen(buffer));  
  111.     if (len < 0)  
  112.         printf("send message '%s' error!error code:'%d',error info:'%s'\n",  
  113.              buffer, errno, strerror(errno));  
  114.     else  
  115.         printf("send message '%s' ok,total size:'%d'\n",buffer, len);  
  116.   
  117.   finish:  
  118.     /* 关闭连接 */  
  119.     SSL_shutdown(ssl);  
  120.     SSL_free(ssl);  
  121.     close(sockfd);  
  122.     SSL_CTX_free(ctx);  
  123.     return 0;  
  124. }  

2.编译

[plain] view plain copy
  1. gcc -o openssl_client openssl_client.c -Wall -lssl -lcrypto -L./openssl-1.0.2d/ -Wl,-rpath=./openssl-1.0.2d   
3.运行

[plain] view plain copy
  1. Usage:openssl_client [server_ip] [server_port]  
0 0
原创粉丝点击