北京市两限房政策:openssl创建连接的过程
来源:百度文库 编辑:偶看新闻 时间:2024/04/28 01:22:04
前面说了一大堆使用OpenSSL进行加密操作的东西,今天开始说说上层的SSL通信了,从基本的程序结构谈起。SSL的理论就不说了,自己找RFC的TLS文档看去。SSL通信程序的基本结构和普通的客户机/服务器模式相差不大。今天比较偷懒,把错误处理一并省略^_^
先看客户端。
#include
#include
#include
#include
#include
int main(int argc, char** argv)
{
char buffer[256] = {0};
int socket_client = 0;
struct sockaddr_in socket_address;
SSL* ssl = NULL;
SSL_CTX* ssl_ctx = NULL;
SSL_METHOD* ssl_method = NULL;
X509* server_cert = NULL;
// 初始化SSL库
SSL_library_init();
// 设置客户端使用的SSL版本
ssl_method = SSLv3_client_method();
// 创建SSL上下文环境
// 每个进程只需维护一个SSL_CTX结构体
ssl_ctx = SSL_CTX_new(ssl_method);
// 建立TCP连接
// 这一部分全部使用标准socket函数
socket_client = socket(AF_INET, SOCK_STREAM, 0);
socket_address.sin_family = AF_INET;
socket_address.sin_addr.s_addr = inet_addr("127.0.0.1");
socket_address.sin_port = htons(1234);
connect(socket_client, (struct sockaddr*)&socket_address, sizeof(socket_address));
// 创建维护当前连接信息的SSL结构体
ssl = SSL_new(ssl_ctx);
// 将SSL绑定到套接字上
SSL_set_fd(ssl, socket_client);
// 建立SSL连接
SSL_connect(ssl);
// 获取和释放服务器端证书
// 关于证书的验证放在下一次讨论
server_cert = SSL_get_peer_certificate(ssl);
X509_free(server_cert);
// 与服务器端进行通信
SSL_write(ssl, "hello, world!", sizeof("hello, world!"));
SSL_read(ssl, buffer, 255);
printf("received: %s\n", buffer);
// 断开SSL连接
SSL_shutdown(ssl);
// 释放当前连接SSL结构体
SSL_free(ssl);
// 断开TCP连接
close(socket_client);
// 释放SSL上下文
SSL_CTX_free(ssl_ctx);
return 0;
}
再看服务器端。
#include
#include
#include
#include
#include
int main()
{
int socket_server = 0;
int socket_client = 0;
struct sockaddr_in sa_serv, sa_cli;
char buffer[256] = {0};
SSL* ssl = NULL;
SSL_CTX* ssl_ctx = NULL;
SSL_METHOD* ssl_method = NULL;
X509* client_cert = NULL;
// 初始化SSL库
SSL_library_init();
// 设置客户端使用的SSL版本
ssl_method = SSLv23_server_method();
// 创建SSL上下文环境
// 每个进程只需维护一个SSL_CTX结构体
ssl_ctx = SSL_CTX_new(ssl_method);
// 读取证书文件
SSL_CTX_use_certificate_file(ssl_ctx, "ca-cert.pem", SSL_FILETYPE_PEM);
// 读取密钥文件
SSL_CTX_use_PrivateKey_file(ssl_ctx, "ca-cert.pem", SSL_FILETYPE_PEM);
// 验证密钥是否与证书一致
SSL_CTX_check_private_key(ssl_ctx);
// 建立TCP服务器端、开始监听并接受客户端连接请求
// 这一部分全部使用标准socket函数
socket_server = socket(AF_INET, SOCK_STREAM, 0);
sa_serv.sin_family = AF_INET;
sa_serv.sin_addr.s_addr = INADDR_ANY;
sa_serv.sin_port = htons(1234);
bind(socket_server, (struct sockaddr*)&sa_serv, sizeof(sa_serv));
listen(socket_server, 10);
while (socket_client = accept(socket_server, NULL, NULL))
{
// 创建当前连接的SSL结构体
ssl = SSL_new(ssl_ctx);
// 将SSL绑定到套接字上
SSL_set_fd(ssl, socket_client);
// 接受SSL连接
SSL_accept(ssl);
// 获取和释放客户端证书
// 这一步是可选的
client_cert = SSL_get_peer_certificate(ssl);
X509_free(server_cert);
// 与客户端进行通信
SSL_read(ssl, buffer, 255);
printf("received: %s\n", buffer);
SSL_write(ssl, "reply", 5);
// 断开SSL连接
SSL_shutdown(ssl);
// 断开与客户端的TCP连接
close(socket_client);
// 释放当前连接SSL结构体
SSL_free(ssl);
}
// 停止TCP监听
close(socket_server);
// 释放SSL上下文
SSL_CTX_free(ssl_ctx);
return 0;
}
先看客户端。
#include
#include
#include
#include
#include
int main(int argc, char** argv)
{
char buffer[256] = {0};
int socket_client = 0;
struct sockaddr_in socket_address;
SSL* ssl = NULL;
SSL_CTX* ssl_ctx = NULL;
SSL_METHOD* ssl_method = NULL;
X509* server_cert = NULL;
// 初始化SSL库
SSL_library_init();
// 设置客户端使用的SSL版本
ssl_method = SSLv3_client_method();
// 创建SSL上下文环境
// 每个进程只需维护一个SSL_CTX结构体
ssl_ctx = SSL_CTX_new(ssl_method);
// 建立TCP连接
// 这一部分全部使用标准socket函数
socket_client = socket(AF_INET, SOCK_STREAM, 0);
socket_address.sin_family = AF_INET;
socket_address.sin_addr.s_addr = inet_addr("127.0.0.1");
socket_address.sin_port = htons(1234);
connect(socket_client, (struct sockaddr*)&socket_address, sizeof(socket_address));
// 创建维护当前连接信息的SSL结构体
ssl = SSL_new(ssl_ctx);
// 将SSL绑定到套接字上
SSL_set_fd(ssl, socket_client);
// 建立SSL连接
SSL_connect(ssl);
// 获取和释放服务器端证书
// 关于证书的验证放在下一次讨论
server_cert = SSL_get_peer_certificate(ssl);
X509_free(server_cert);
// 与服务器端进行通信
SSL_write(ssl, "hello, world!", sizeof("hello, world!"));
SSL_read(ssl, buffer, 255);
printf("received: %s\n", buffer);
// 断开SSL连接
SSL_shutdown(ssl);
// 释放当前连接SSL结构体
SSL_free(ssl);
// 断开TCP连接
close(socket_client);
// 释放SSL上下文
SSL_CTX_free(ssl_ctx);
return 0;
}
再看服务器端。
#include
#include
#include
#include
#include
int main()
{
int socket_server = 0;
int socket_client = 0;
struct sockaddr_in sa_serv, sa_cli;
char buffer[256] = {0};
SSL* ssl = NULL;
SSL_CTX* ssl_ctx = NULL;
SSL_METHOD* ssl_method = NULL;
X509* client_cert = NULL;
// 初始化SSL库
SSL_library_init();
// 设置客户端使用的SSL版本
ssl_method = SSLv23_server_method();
// 创建SSL上下文环境
// 每个进程只需维护一个SSL_CTX结构体
ssl_ctx = SSL_CTX_new(ssl_method);
// 读取证书文件
SSL_CTX_use_certificate_file(ssl_ctx, "ca-cert.pem", SSL_FILETYPE_PEM);
// 读取密钥文件
SSL_CTX_use_PrivateKey_file(ssl_ctx, "ca-cert.pem", SSL_FILETYPE_PEM);
// 验证密钥是否与证书一致
SSL_CTX_check_private_key(ssl_ctx);
// 建立TCP服务器端、开始监听并接受客户端连接请求
// 这一部分全部使用标准socket函数
socket_server = socket(AF_INET, SOCK_STREAM, 0);
sa_serv.sin_family = AF_INET;
sa_serv.sin_addr.s_addr = INADDR_ANY;
sa_serv.sin_port = htons(1234);
bind(socket_server, (struct sockaddr*)&sa_serv, sizeof(sa_serv));
listen(socket_server, 10);
while (socket_client = accept(socket_server, NULL, NULL))
{
// 创建当前连接的SSL结构体
ssl = SSL_new(ssl_ctx);
// 将SSL绑定到套接字上
SSL_set_fd(ssl, socket_client);
// 接受SSL连接
SSL_accept(ssl);
// 获取和释放客户端证书
// 这一步是可选的
client_cert = SSL_get_peer_certificate(ssl);
X509_free(server_cert);
// 与客户端进行通信
SSL_read(ssl, buffer, 255);
printf("received: %s\n", buffer);
SSL_write(ssl, "reply", 5);
// 断开SSL连接
SSL_shutdown(ssl);
// 断开与客户端的TCP连接
close(socket_client);
// 释放当前连接SSL结构体
SSL_free(ssl);
}
// 停止TCP监听
close(socket_server);
// 释放SSL上下文
SSL_CTX_free(ssl_ctx);
return 0;
}
百度的创建过程问题
创建公司的具体过程
创建新连接的问题
不能创建指定的连接
amazon.com的历史及创建过程
交友网站创建的前期过程
简述实验中创建菜单的过程
简述实验中创建菜单的过程
谁知道爱因斯坦创建广义相对论的过程
怎样创建Access的存储过程?
sql怎么创建存储过程的问题
谁能告诉我创建Outlook的过程
创建一个网站的详细过程??? --经验之谈?!!!!
希尔顿酒店的创建过程,经历?
自己创建公司需要怎样的过程?
关于openssl?
关于openssl
怎么创建不了Internet的连接
无法“创建一个新的连接”?
PowerPoint 创建指向 0 的超连接
刚装好的XP怎么创建连接啊
我要用陆游器创建一个新的连接
怎样删除创建的网络连接?
powerpoint创建指向“^0”的超连接