SSL 程序设计初步介绍
2015-03-05 09:32
316 查看
SSL 通讯模型为标准的C/S 结构,除了在 TCP 层之上进行传输之外,与一般的通讯没有什么明显的区 别。在这里,我们主要介绍如何使用OpenSSL进行安全通讯的程序设计。关于OpenSSL 的一些详细的信 息请参考OpenSSL的官方主页 http://www.openssl.org。 在使用OpenSSL前,必须先对OpenSSL 进行初始化,以下的三个函数任选其一: SSL_library_init(void); OpenSSL_add_ssl_algorithms(); SSLeay_add_ssl_algorithms(); 事实上 后面的两个函数只是第一个函数的宏。 如果要使用OpenSSL的出错信息,使用SSL_load_error_strings (void)进行错误信息的初始化。以后 可以使用void ERR_print_errors_fp(FILE *fp) 打印SSL的错误信息。 一次SSL连接会话一般要先申请一个SSL 环境,基本的过程是: 1. SSL_METHOD* meth = TLSv1_client_method(); 创建本次会话连接所使用的协议,如果是客户端可 以使用 SSL_METHOD* TLSv1_client_method(void); TLSv1.0 协议 SSL_METHOD* SSLv2_client_method(void); SSLv2 协议 SSL_METHOD* SSLv3_client_method(void); SSLv3 协议 SSL_METHOD* SSLv23_client_method(void); SSLv2/v3 协议 服务器同样需要创建本次会话所使用的协议: SSL_METHOD *TLSv1_server_method(void); SSL_METHOD *SSLv2_server_method(void); SSL_METHOD *SSLv3_server_method(void); SSL_METHOD *SSLv23_server_method(void); 需要注意的是客户端和服务器需要使用相同的协议。 2.申请SSL会话的环境 CTX,使用不同的协议进行会话,其环境也是不同的。申请SSL会话环 境的OpenSSL函数是 SSLK_CTX* SSL_CTX_new (SSL_METHOD*); 参数就是前面我们申请的 SSL通讯方式。返回当前 的SSL 连接环境的指针。 然后根据自己的需要设置CTX的属性,典型的是设置SSL 握手阶段证书的验证方式和加载自己 的证书。 void SSL_CTX_set_verify (SSL_CTX* , int , int* (int, X509_STORE_CTX*) ) 设置证书验证的方式。 第一个参数是当前的CTX 指针,第二个是验证方式,如果是要验证对方的话,就使用 SSL_VERIFY_PEER。不需要的话,使用SSL_VERIFY_NONE.一般情况下,客户端需要验证对方,而 服务器不需要。第三个参数是处理验证的回调函数,如果没有特殊的需要,使用空指针就可以了。 void SSL_CTX_load_verify_locations(SSL_CTX*, const char* , const char*); 加载证书; 第一个参数同上,参数二是证书文件的名称,参数三是证书文件的路径; int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, int type); 加载本地的证书;type 指明证书文件的结构类型;失败返回-1 int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, int type); 加载自己的私钥;type 参数指明私钥文件的结构类型;失败返回-1 加载了证书和文件之后,就可以验证私钥和证书是否相符: BOOl SSL_CTX_check_private_key (SSL_CTX*); 3.既然SSL 使用TCP 协议,当然需要把SSL attach 到已经连接的套接字上了: SSL* SSL_new (SSL_CTX*); 申请一个SSL 套节字; int SSL_set_rfd (SSL*); 绑定只读套接字 int SSL_set_wfd (SSL*); 绑定只写套接字 int SSL_set_fd ( SSL*); 绑定读写套接字 绑定成功返回 1, 失败返回0; 4. 接下来就是SSL 握手的动作了 int SSL_connect (SSL*); 失败返回 -1 5. 握手成功之后,就可以进行通讯了,使用SSL_read 和SS_write 读写SSL 套接字代替传统的 read 、write int SSL_read (SSL *ssl, char *buf, int num ); int SSL_write (SSL *ssl, char *buf, int num); 如果是服务器,则使用 SSL_accept 代替传统的 accept 调用 int SSL_accept(SSL *ssl); 6. 通讯结束,需要释放前面申请的 SSL资源 int SSL_shutdown(SSL *ssl); 关闭SSL套接字; void SSL_free (ssl); 释放SSL套接字; void SSL_CTX_free (ctx); 释放SSL环境;
相关文章推荐
- TOTAL COMMAND初步介绍
- [NFC] 程序设计(NDEF 格式介绍)
- 《C语言及程序设计初步》第十四讲实践项目
- Ruby初步介绍
- Win32位程序设计初步之服务
- Netty及SSL/TLS介绍
- 手机flash技术的初步介绍,(上次飞思的来北京聊了一下)[小糊涂的灵感]
- 第一章Python 初步介绍
- Win32位程序设计初步之服务
- SSL与TLS 区别 以及介绍
- 【搜索引擎Jediael开发笔记1】搜索引擎初步介绍及网络爬虫
- vue初步介绍
- Android Binder 机制初步学习 笔记(一)—— 概述及数据结构介绍
- 贺老师《C语言及程序设计初步》网络课程一.4C语言程序初体验项目2圆柱体表面积
- Tomcat介绍---SSL
- SAS软件的使用和统计学分析的初步介绍
- C语言及程序设计初步例程-15 数据的输入
- C语言及程序设计初步例程-38 用break和continue改变流程
- 第1周 C语言及程序设计初步 例程1- if语句的嵌套
- 区块链技术之区块链初步介绍