基于openssl的https client例子
来源:互联网 发布:阿里云2m带宽并发数 编辑:程序博客网 时间:2024/05/17 09:34
因为微信公众获取access_token需要用到https,开始用http请求的时候发现不行查了之后,
发现它是需要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>// Simple structure to keep track of the handle, and// of what needs to be freed later.typedef struct{ int socket; SSL *sslHandle; SSL_CTX *sslContext;} connection;// For this example, we'll be testing on openssl.org#define SERVER "183.57.48.62" // api.weixin.qq.com 服务器地址#define PORT 443// Establish a regular tcp connectionint tcpConnect (){ int error, handle; struct hostent *host; struct sockaddr_in server; host = gethostbyname (SERVER); handle = socket (AF_INET, SOCK_STREAM, 0); if (handle == -1) { perror ("Socket"); handle = 0; } else { server.sin_family = AF_INET; server.sin_port = htons (PORT); server.sin_addr = *((struct in_addr *) host->h_addr); bzero (&(server.sin_zero), 8); error = connect (handle, (struct sockaddr *) &server, sizeof (struct sockaddr)); if (error == -1) { perror ("Connect"); handle = 0; } } return handle;}// Establish a connection using an SSL layerconnection *sslConnect (void){ connection *c; c = malloc (sizeof (connection)); c->sslHandle = NULL; c->sslContext = NULL; c->socket = tcpConnect (); if (c->socket) { // Register the error strings for libcrypto & libssl SSL_load_error_strings (); // Register the available ciphers and digests SSL_library_init (); OpenSSL_add_all_algorithms(); // New context saying we are a client, and using SSL 2 or 3 c->sslContext = SSL_CTX_new (SSLv23_client_method ()); if (c->sslContext == NULL) ERR_print_errors_fp (stderr); // Create an SSL struct for the connection c->sslHandle = SSL_new (c->sslContext); if (c->sslHandle == NULL) ERR_print_errors_fp (stderr); // Connect the SSL struct to our connection if (!SSL_set_fd (c->sslHandle, c->socket)) ERR_print_errors_fp (stderr); // Initiate SSL handshake if (SSL_connect (c->sslHandle) != 1) ERR_print_errors_fp (stderr); } else { perror ("Connect failed"); } return c;}// Disconnect & free connection structvoid sslDisconnect (connection *c){ if (c->socket) close (c->socket); if (c->sslHandle) { SSL_shutdown (c->sslHandle); SSL_free (c->sslHandle); } if (c->sslContext) SSL_CTX_free (c->sslContext); free (c);}// Read all available text from the connectionchar *sslRead (connection *c){ const int readSize = 1024; char *rc = NULL; int received, count = 0; char buffer[1024]; if (c) { while (1) { if (!rc) rc = malloc (readSize * sizeof (char) + 1); else rc = realloc (rc, (count + 1) * readSize * sizeof (char) + 1); memset(rc,0,readSize + 1); received = SSL_read (c->sslHandle, buffer, readSize); buffer[received] = '\0'; if (received > 0) strcat (rc, buffer); if (received < readSize) break; count++; } } return rc;}// Write text to the connectionvoid sslWrite (connection *c, char *text){ if (c) SSL_write (c->sslHandle, text, strlen (text));}// Very basic main: we send GET / and print the response.int main (int argc, char **argv){ connection *c; char *response; c = sslConnect (); //sslWrite (c, "GET / HTTP/1.1\r\nHost: localhost\r\nconnection: close\r\n\r\n"); // 这里记得写上自己的申请的appid 和 secret就可以了 sslWrite (c, "GET /cgi-bin/token?grant_type=client_credential&appid=your_appid&" "secret=your_secret HTTP/1.1\r\nHost: localhost\r\nconnection: close\r\n\r\n"); response = sslRead (c); printf ("%s\n", response); sslDisconnect (c); free (response); return 0;}
参考:
[1]两个基于openssl的https client例子[EB/OL].https://my.oschina.net/vincentwy/blog/620282?p=1
阅读全文
0 0
- 基于openssl的https client例子
- 基于openssl的https服务的配置
- 安装基于openssl的https服务配置
- Jersey Client基于Https的Basic Authorization
- 基于 openssl + vs2013 https服务端 Demo
- 基于 openssl + vs2013 https客户端 Demo
- httpd系列-04-基于openSSL配置HTTPS
- nginx系列-05-基于openSSL配置HTTPS
- Https openssl
- Https + OPENSSL
- 基于openssl的RSA 编码和解码例子吗,非常详细
- 采用OpenSSL生成Https的证书CA
- SSL,SSH,OpenSSL,OpenSSH,HTTPS的区别
- 支持 https 的 svn client 安装方法
- okhttp3去掉https证书的client
- Linux下的OpenSSL编程——openssl例子
- openssl https openssl 证书生成
- 【OpenSSL】ssl client
- xss-javascript被攻击系列--(一)
- Spring Security 系列教程-Hello World
- win64下安装配置eclipse+MySQL+Tomcat(转载)
- 初识数组与指针
- 1037. 在霍格沃茨找零钱(20)
- 基于openssl的https client例子
- HTML如何做出分割线效果
- LoadRunner12学习之路(1-5)
- 线程池的知识点
- 1038. 统计同成绩学生(20)
- 理解jvm如何加载类
- 理解迭代法和优化基础
- 1039. 到底买不买(20)
- 算法爱好者——算法题:最小调整代价 ? 待解决