当前位置: 首页 > news >正文

ssl/https通信(opensssl接口)

废话不多说,代码中使用了两种https客户端的实现方式。

完整代码:https://github.com/satadriver/openssl-TLS_SSL-sample

#include<windows.h>#include<WinSock.h>#include"../include/openssl\ssl.h"#include"../include/openssl\err.h"#pragmacomment(lib,"ws2_32.lib")#pragmacomment(lib,"../lib/libeay32.lib")#pragmacomment(lib,"../lib/ssleay32.lib")#defineHTTPS_PORT443DWORDBIOSendRecvData(sockaddr_in stBaiduPassPortAddr,char*pSendData,intiSendSize,char*pRecvData,intiRecvSize){//ERR_load_crypto_strings();//ERR_load_SSL_strings();//OPENSSL_add_all_algorithms_noconf();//如果系统平台不支持自动进行随机数种子的设置,这里应该进行设置(seed PRNG)SSL_CTX*ctxClient=SSL_CTX_new(SSLv3_client_method());//通常应该在这里设置一些验证路径和模式等,因为这里没有设置,所以该例子可以跟使用任意CA签发证书的任意服务器建立连接BIO*stBio=BIO_new_ssl_connect(ctxClient);SSL*sslClient=FALSE;intiRet=BIO_get_ssl(stBio,&sslClient);if(sslClient==FALSE){fprintf(stderr,"Can't locate SSL pointer\n");//ERR_print_errors_fp(stderr);//SSL_free(sslClient);SSL_CTX_free(ctxClient);BIO_free_all(stBio);returnFALSE;}/* 不需要任何重试请求*/iRet=SSL_set_mode(sslClient,SSL_MODE_AUTO_RETRY);//这里你可以添加对SSL的其它一些设置charszBioConnectAddrFormat[]="%s:%u";charszBioConnectAddr[64];intiLen=wsprintfA(szBioConnectAddr,szBioConnectAddrFormat,inet_ntoa(stBaiduPassPortAddr.sin_addr),HTTPS_PORT);iRet=BIO_set_conn_hostname(stBio,szBioConnectAddr);//"passport.baidu.com"//BIO * out=BIO_new_fp(stdout,BIO_NOCLOSE);if(BIO_do_handshake(stBio)<=0){//SSL_free(sslClient);SSL_CTX_free(ctxClient);fprintf(stderr,"Error connecting to server\n");ERR_print_errors_fp(stderr);returnFALSE;}X509*stCert=SSL_get_peer_certificate(sslClient);char*strServerName=X509_NAME_oneline(X509_get_subject_name(stCert),0,0);OPENSSL_free(strServerName);strServerName=X509_NAME_oneline(X509_get_issuer_name(stCert),0,0);OPENSSL_free(strServerName);X509_free(stCert);iRet=BIO_write(stBio,pSendData,iSendSize);if(iRet<=0){//SSL_free(sslClient);SSL_CTX_free(ctxClient);BIO_free_all(stBio);returnFALSE;}char*pRecvPtr=pRecvData;iRet=BIO_read(stBio,pRecvPtr,iRecvSize);if(iRet<=0){//SSL_free(sslClient);SSL_CTX_free(ctxClient);BIO_free_all(stBio);returnFALSE;}while(iRet==1){pRecvPtr++;iRet=BIO_read(stBio,pRecvPtr,iRecvSize);}if(iRet>0){*(pRecvPtr+iRet)=0;}BIO_free_all(stBio);SSL_CTX_free(ctxClient);//SSL_free(sslClient);//BIO_free(out);returnTRUE;}DWORDSendAndRecvHttpsPacket(sockaddr_in stBaiduPassPortAddr,char*pSendData,intiSendSize,char*pRecvData,intiRecvSize){SOCKET sockClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(sockClient==INVALID_SOCKET){returnFALSE;}intiRet=connect(sockClient,(sockaddr*)&stBaiduPassPortAddr,sizeof(sockaddr_in));if(iRet==INVALID_SOCKET){closesocket(sockClient);returnFALSE;}SSL_CTX*pctxClient=SSL_CTX_new(SSLv23_client_method());if(pctxClient==0){iRet=GetLastError();closesocket(sockClient);returnFALSE;}SSL*pSSLClient=SSL_new(pctxClient);if(pSSLClient==0){closesocket(sockClient);returnFALSE;}iRet=SSL_set_fd(pSSLClient,sockClient);if(iRet<=0){iRet=GetLastError();closesocket(sockClient);returnFALSE;}iRet=SSL_connect(pSSLClient);if(iRet<=0){iRet=GetLastError();returnFALSE;}iRet=SSL_write(pSSLClient,pSendData,iSendSize);if(iRet<=0){iRet=GetLastError();returnFALSE;}char*pRecvBuf=pRecvData;intiSize=iRecvSize;do{iRet=SSL_read(pSSLClient,pRecvBuf,1);if(iRet>0){pRecvBuf++;iSize--;}}while(iRet>0);*pRecvBuf=0;SSL_free(pSSLClient);SSL_CTX_free(pctxClient);closesocket(sockClient);return(pRecvBuf-pRecvData);}DWORDBIOServerSample(){BIO*sbio,*bbio,*acpt,*out;intlen;chartmpbuf[1024];SSL_CTX*ctx;SSL*ssl;ERR_load_crypto_strings();ERR_load_SSL_strings();OpenSSL_add_all_algorithms();//Might seed PRNG herectx=SSL_CTX_new(SSLv23_server_method());if(!SSL_CTX_use_certificate_file(ctx,"server.pem",SSL_FILETYPE_PEM)||!SSL_CTX_use_PrivateKey_file(ctx,"server.pem",SSL_FILETYPE_PEM)||!SSL_CTX_check_private_key(ctx)){fprintf(stderr,"Error setting up SSL_CTX\n");ERR_print_errors_fp(stderr);return0;}//Might do other things here like setting verify locations and//DH and/or RSA temporary key callbacks// New SSL BIO setup as serversbio=BIO_new_ssl(ctx,0);BIO_get_ssl(sbio,&ssl);if(!ssl){fprintf(stderr,"Can't locate SSL pointer\n");// whatever ...}// Don't want any retriesSSL_set_mode(ssl,SSL_MODE_AUTO_RETRY);// Create the buffering BIObbio=BIO_new(BIO_f_buffer());//Add to chainsbio=BIO_push(bbio,sbio);acpt=BIO_new_accept("433");// By doing this when a new connection is established// we automatically have sbio inserted into it. The// BIO chain is now 'swallowed' by the accept BIO and// will be freed when the accept BIO is freed.BIO_set_accept_bios(acpt,sbio);out=BIO_new_fp(stdout,BIO_NOCLOSE);// Setup accept BIOif(BIO_do_accept(acpt)<=0){fprintf(stderr,"Error setting up accept BIO\n");ERR_print_errors_fp(stderr);return0;}// Now wait for incoming connectionif(BIO_do_accept(acpt)<=0){fprintf(stderr,"Error in connection\n");ERR_print_errors_fp(stderr);return0;}// We only want one connection so remove and free// accept BIO//sbio=BIO_pop(acpt);BIO_free_all(acpt);if(BIO_do_handshake(sbio)<=0){fprintf(stderr,"Error in SSL handshake\n");ERR_print_errors_fp(stderr);return0;}BIO_puts(sbio,"HTTP/1.0 200 OK\r\nContent-type: text/plain\r\n\r\n");BIO_puts(sbio,"\r\nConnection Established\r\nRequest headers:\r\n");BIO_puts(sbio,"--------------------------------------------------\r\n");for(;;){len=BIO_gets(sbio,tmpbuf,1024);if(len<=0)break;BIO_write(sbio,tmpbuf,len);BIO_write(out,tmpbuf,len);// Look for blank line signifying end of headersif((tmpbuf[0]=='\r')||(tmpbuf[0]=='\n'))break;}BIO_puts(sbio,"--------------------------------------------------\r\n");BIO_puts(sbio,"\r\n");// Since there is a buffering BIO present we had better flush itBIO_flush(sbio);BIO_free_all(sbio);returnTRUE;}int__stdcallWinMain(__in HINSTANCE hInstance,__in_opt HINSTANCE hPrevInstance,__in LPSTR lpCmdLine,__inintnShowCmd){WSAData wsa;intret=WSAStartup(0x0202,&wsa);if(ret){returnFALSE;}SSL_library_init();SSL_load_error_strings();OpenSSL_add_all_algorithms();charszdata[0x4000];for(inti=0;i<sizeof(szdata);i++){szdata[i]='a';}szdata[0]='/';szdata[1]=0;hostent*lphost=gethostbyname("www.baidu.com");DWORD lpip=*(DWORD*)(lphost->h_addr_list);DWORD ip=*(DWORD*)lpip;sockaddr_in sa={0};sa.sin_family=AF_INET;sa.sin_port=ntohs(443);sa.sin_addr.S_un.S_addr=ip;charszrecv[0x4000];ret=BIOSendRecvData(sa,szdata,lstrlenA(szdata),szrecv,sizeof(szdata));//ret=SendAndRecvHttpsPacket(sa,szdata,0x10000,szrecv,0x10000);// SOCKET s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);// if (s == INVALID_SOCKET)// {// return FALSE;// }returnTRUE;}
http://www.cnnetsun.cn/news/3404064.html

相关文章:

  • 如何快速上手switch_user?5分钟实现用户无缝切换
  • switch_user:革命性用户切换工具,让开发与调试效率提升10倍
  • 小程序毕业设计-基于 SpringBoot + 小程序的在线答题系统 基于 SpringBoot 的在线考试测评系统的设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • Python通达信数据获取终极方案:5分钟搭建你的股票分析系统
  • ChatGPT写周报月报终极指南:不是“怎么写”,而是“让领导觉得你早该升职”——融合行为心理学+组织政治学的高阶表达框架
  • AI TreasureBox未来规划:AI资源聚合平台的演进路线图和技术展望
  • ChatGPT写Python/JS/SQL代码不翻车的4类上下文锚点设计法(附GitHub高星模板库)
  • extuner社区贡献指南:如何参与开源性能调优工具开发 [特殊字符]
  • 2026年不锈钢水箱品牌推荐:哪家靠谱又耐用?
  • 火锅烤肉店怎么把流量导进自有小程序?餐宝盈GEO获客模式解析,含零代码SAAS、AI编程、源码定制交付
  • SingGuard-4b-GGUF未来展望:多模态AI安全技术的发展趋势与路线图
  • 5步掌握开源电路板查看器:告别.brd文件查看困境的终极指南
  • 如何构建高效多设备串流系统:Sunshine性能优化实战指南
  • 5分钟掌握Notepad++ Markdown实时预览插件:提升文档编写效率的终极方案
  • 语音处理领域的技术革新:ClearerVoice-Studio如何实现多模态AI语音增强与分离
  • 如何用Super Productivity实现300%效率提升:从时间消耗者到时间掌控者的转变之路
  • 如何轻松在电脑上运行任天堂3DS游戏:Citra模拟器完整教程
  • 基于单片机的智能楼道灯控制器系统设计
  • 抖音弹幕抓取终极指南:快速掌握DouyinBarrageGrab完整使用方法
  • FDA获批Baxfendy:醛固酮合酶抑制剂直击耐药高血压
  • 【小程序课程设计/毕业设计】基于 SpringBoot +小程序的个性化四六级学习推送小程序 基于 SpringBoot + 微信小程序的大学生英语能力提升系统的设计与实现【附源码、数据库、万字文档】
  • PLC工业控制核心:模块化架构与编程实践
  • PalEdit:打造你的专属PalWorld伙伴阵容
  • QtScrcpy技术架构深度解析:构建高性能跨平台Android投屏系统的设计哲学
  • 英集芯-IP2366 开发五大问题全解:温感充放电降额、IIC 读错乱码、总线死锁、空载自关输出根治方案
  • 计算机毕业设计之基于SpringBoot的桌游Club管理系统设计与开发
  • 高校学生社区行为数据驱动育人升级 全链路落地高频答疑
  • AI赋能空压站节能:2026年智慧空压站智控服务商推荐榜单
  • Claudecode与GPT5-codex双模型协同编程实战指南
  • 用ChatGPT 3小时写出豆瓣8.5分小说(附完整Prompt链+人物弧光生成器)