SSL_write 访问https

枯木___ 2017-01-05 06:20:41
openssl 访问https 的网站 报文head是明文 ,body却是密文,该怎么解析body数据部分?

// openssl.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"
#define WIN32_LEAN_AND_MEAN // 从 Windows 头中排除极少使用的资料
#include <Windows.h>
#include <winsock2.h>
#include <iostream>
#include <WS2tcpip.h>
#include <openssl/rsa.h> /* SSLeay stuff */
#include <openssl/crypto.h>
#include <openssl/x509.h>
#include <openssl/pem.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#pragma comment(lib, "ws2_32.lib")
#pragma comment( lib, "libeay32.lib" )
#pragma comment( lib, "ssleay32.lib" )
#pragma warning (disable: 4996)

#define MAXBUF 4096
#define DEF_PORT 443
#define DEF_MONITOR_PORT 4444
const char* str_url = "www.2345.com";

void ShowCerts(SSL * ssl)
{
X509 *cert;
char *line;
cert = SSL_get_peer_certificate(ssl);
if (cert != NULL)
{
printf("数字证书信息:\n");
line = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0);
printf("证书: %s\n", line);
OPENSSL_free(line);
line = X509_NAME_oneline(X509_get_issuer_name(cert), 0, 0);
printf("颁发者: %s\n", line);
OPENSSL_free(line);
X509_free(cert);
}
else
printf("无证书信息!\n");
}
// ssl Client
int _tmain(int argc, _TCHAR* argv[])
{
int sockfd, len;
struct sockaddr_in dest;
char buffer[MAXBUF + 1];
SSL_CTX *ctx;
SSL *ssl;

/* SSL 库初始化,参看 ssl-server.c 代码 */
SSL_library_init(); //SSL 库初始化
OpenSSL_add_all_algorithms(); //载入所有 SSL 算法
SSL_load_error_strings(); //载入所有 SSL 错误消息
ctx = SSL_CTX_new(SSLv23_client_method()); // 以 SSL V2 和 V3 标准兼容方式产生一个 SSL_CTX ,即 SSL Content Text *//* 也可以用 SSLv2_server_method() 或 SSLv3_server_method() 单独表示 V2 或 V3标准
if (ctx == NULL)
{
ERR_print_errors_fp(stdout);
exit(1);
}

WSADATA wsaData;
int ret = WSAStartup( MAKEWORD(2, 2), &wsaData );
if ( ret != 0 )
{
std::cout<<"WSAStartup error."<<std::endl;
return -1;
}
/* 创建一个 socket 用于 tcp 通信 */
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
perror("Socket");
exit(errno);
}
printf("socket created\n");

//绑定客户端
//sockaddr_in native;
//native.sin_family = AF_INET;
//native.sin_port = htons(444);
//native.sin_addr.S_un.S_addr = inet_addr("192.168.9.59");
//int i = bind(sockfd , (const sockaddr*)&native , sizeof(sockaddr));

/* 初始化服务器端(对方)的地址和端口信息 */
char str_ip[32] = {0};
struct hostent* hptr = gethostbyname(str_url);
inet_ntop(hptr->h_addrtype , hptr->h_addr , str_ip , sizeof(str_ip));
memset(&dest,0, sizeof(dest));
dest.sin_family = AF_INET;
dest.sin_addr.S_un.S_addr = inet_addr(str_ip);
dest.sin_port = htons (DEF_PORT);
//dest.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
//dest.sin_port = htons (6000);


printf("address created\n");

/* 连接服务器 */
if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != 0) {
perror("Connect ");
exit(errno);
}
printf("server connected\n");

/* 基于 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\n", SSL_get_cipher(ssl));
ShowCerts(ssl);
}

char* pPackets = "GET https://www.2345.com/ HTTP/1.1\r\n"\
"Host: www.2345.com\r\n"\
"Connection: keep-alive\r\n"\
"Cache-Control: max-age=0\r\n"\
"Upgrade-Insecure-Requests: 1\r\n"\
"User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36\r\n"\
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n"\
"Accept-Encoding: gzip, deflate, sdch, br\r\n"\
"Accept-Language: zh-CN,zh;q=0.8\r\n\r\n";

memset(buffer,0, MAXBUF + 1);
strcpy(buffer , pPackets);
len = SSL_write(ssl, buffer, strlen(buffer));

char* recv_buffer = new char[1200];
memset(recv_buffer , 0 , 1200);
len = SSL_read(ssl, recv_buffer, 1200);


memset(recv_buffer , 0 , 1200);
len = SSL_read(ssl, recv_buffer, 1200);


SSL_shutdown(ssl);
SSL_free(ssl);
closesocket(sockfd);
SSL_CTX_free(ctx);
system("pause");
return 0;
}



...全文
567 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
枯木___ 2017-01-06
  • 打赏
  • 举报
回复
源码 里边 ssl read 是解密 的
枯木___ 2017-01-06
  • 打赏
  • 举报
回复
引用 3 楼 oyljerry 的回复:
ssl read会解密https的加密内容。但是如果还被服务器额外加密了。需要在解密一次
我自己知道原因了 ,content-encoding 我没有处理
赵4老师 2017-01-06
  • 打赏
  • 举报
回复
openssl是开源的吧。
oyljerry 2017-01-06
  • 打赏
  • 举报
回复
ssl read会解密https的加密内容。但是如果还被服务器额外加密了。需要在解密一次
枯木___ 2017-01-05
  • 打赏
  • 举报
回复
难道 我还需要 用 主钥 解密一次?? SSL_read 有这个操作的啊 所有的https 都是这样的
枯木___ 2017-01-05
  • 打赏
  • 举报
回复
Wininet可以拿明文啊

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧