OpenSSL socket客户端

这是我从网上找来的,改好了的。

需要添加一下include 和 lib 路径

  1 #define WIN32_LEAN_AND_MEAN
  2 
  3 #include <stdio.h>
  4 #include <stdlib.h>
  5 #include <errno.h>
  6 #include <string.h>
  7 #include <sys/types.h>
  8 #include <Windows.h>
  9 #include <WinSock2.h>
 10 #include <MSWSock.h>
 11 #include <WS2tcpip.h>
 12 #include <openssl/ssl.h>
 13 #include <openssl/err.h>
 14 #pragma comment(lib, "ws2_32.lib")
 15 #pragma comment(lib, "libssl.lib")
 16 #pragma comment(lib, "libcrypto.lib")
 17 #pragma comment(lib, "Crypt32.lib")
 18 #define bzero ZeroMemory
 19 #define close closesocket
 20 
 21 #define MAXBUF 1024
 22 
 23 void ShowCerts(SSL * ssl)
 24 {
 25     X509 *cert;
 26     char *line;
 27     cert = SSL_get_peer_certificate(ssl);
 28     if (cert != NULL)
 29     {
 30         printf("数字证书信息:\n");
 31         line = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0);
 32         printf("证书: %s\n", line);        free(line);
 33         line = X509_NAME_oneline(X509_get_issuer_name(cert), 0, 0);
 34         printf("颁发者: %s\n", line);
 35         free(line);        X509_free(cert);
 36     } else
 37         printf("无证书信息!\n");
 38 }
 39 
 40 /************关于本文档********************************************
 41  *************filename: ssl-client.c
 42  **************purpose: 演示利用OpenSSL 库进行基于IP层的SSL 加密通讯的方法,这是客户端例子
 43  ***********************************************************************************/
 44 
 45 int main(int argc, char **argv){
 46     SOCKET sockfd, len;
 47     struct sockaddr_in dest;
 48     char buffer[MAXBUF + 1];
 49     SSL_CTX *ctx;    SSL *ssl;
 50     if (argc != 3)
 51     {
 52         printf("参数格式错误!正确用法如下:\n\t\t%s IP地址端口\n\t比如:\t%s 127.0.0.1 80\n此程序用来从某个IP 地址的服务器某个端口接收最多MAXBUF 个字节的消息",             argv[0], argv[0]);
 53         exit(0);
 54     }
 55 
 56     /* SSL 库初始化,参看ssl-server.c 代码*/
 57     SSL_library_init();
 58     OpenSSL_add_all_algorithms();
 59     SSL_load_error_strings();
 60     //      SSL_CTX_new(SSLv23_server_method());
 61     ctx = SSL_CTX_new(SSLv23_client_method());
 62     if (ctx == NULL) {
 63         ERR_print_errors_fp(stdout);
 64         exit(1);
 65     }
 66 
 67     WSADATA wsaData;
 68     int iResult = 0;
 69     iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
 70     if (iResult != NO_ERROR) {
 71         wprintf(L"Error at WSAStartup()\n");
 72         return 1;
 73     }
 74 
 75     /* 创建一个socket 用于tcp 通信*/
 76     if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
 77     {
 78         perror("Socket");
 79         exit(errno);
 80     }
 81 
 82     printf("socket created\n");
 83 
 84 
 85     /* 初始化服务器端(对方)的地址和端口信息*/
 86     bzero(&dest, sizeof(dest));
 87     dest.sin_family = AF_INET;
 88     dest.sin_port = htons(atoi(argv[2]));
 89 
 90     if (inet_pton(AF_INET, argv[1], &dest.sin_addr.s_addr) == 0) {
 91         perror(argv[1]);
 92         exit(errno);
 93     }
 94     printf("address created\n");
 95     /* 连接服务器*/
 96     if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != 0) {
 97         printf("Connect error:%d", WSAGetLastError());
 98         exit(errno);
 99     }
100     printf("server connected\n");
101     /* 基于ctx 产生一个新的SSL */
102     ssl = SSL_new(ctx);
103     SSL_set_fd(ssl, sockfd);
104     /* 建立SSL 连接*/
105     if (SSL_connect(ssl) == -1)
106         ERR_print_errors_fp(stderr);
107     else {
108         printf("Connected with %s encryption\n",
109             SSL_get_cipher(ssl));
110         ShowCerts(ssl);
111     }
112 
113 
114     bzero(buffer, MAXBUF + 1);
115     strcpy_s(buffer,MAXBUF,  "from client->server");
116 
117     /* 发消息给服务器*/
118     len = SSL_write(ssl, buffer, strlen(buffer));
119     if (len < 0)
120     {
121         char err[256] = { 0 };
122         strerror_s(err, errno);
123         printf("消息'%s'发送失败!错误代码是%d,错误信息是'%s'\n",
124             buffer, errno, err);
125     }
126     else
127         printf("消息'%s'发送成功,共发送了%d个字节!\n",
128             buffer, len);
129 
130 
131 
132     /* 接收对方发过来的消息,最多接收MAXBUF 个字节*/
133     bzero(buffer, MAXBUF + 1);
134 
135     /* 接收服务器来的消息*/
136     len = SSL_read(ssl, buffer, MAXBUF);
137     if (len > 0)
138         printf("接收消息成功:'%s',共%d个字节的数据\n",
139             buffer, len);
140     else {
141         char err[256] = { 0 };
142         strerror_s(err, errno);
143         printf("消息接收失败!错误代码是%d,错误信息是'%s'\n",
144             errno, err);
145         goto finish;
146     }
147 
148 finish:
149     /* 关闭连接*/
150     SSL_shutdown(ssl);
151     SSL_free(ssl);
152     close(sockfd);
153     SSL_CTX_free(ctx);
154 
155     return 0;
156 
157 }


posted on 2020-06-18 17:32  thinkinc999  阅读(517)  评论(0编辑  收藏  举报

导航