SSL连接,搭建网络安全道路

  

SSL连接,搭建网络安全道路

  

  <强>   <强>什么是   <强>   <强> SSL连接

  

  <强>   <强> SSL   <强>   <强>连接 强,当前版本为3.1 (SSL3.1就是TLS1.0)。它已被广泛地用于网页浏览器与服务器之间的身份认证和加密数据传输。它位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持.SSL协议可分为两层:SSL记录协议(SSL协议)记录:它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装,压缩,加密等基本功能的支持。SSL握手协议(SSL握手协议):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证,协商加密算法,交换加密密钥等。

  

   SSL连接,搭建网络安全道路

  

  <强>   <强> SSL连接建立过程

  

(以OpenSSL API为例)

  

OpenSSL是一套开放源代码的SSL套件,其函数库是以C语言所写成,实现了基本的传输层数据加密功能。此软件是以两个加拿大人埃里克·a .年轻和蒂姆·j·哈德逊所写的SSLeay为基础所发展的,SSLeay随着两人前往RSA公司任职而停止开发.1998年,OpenSSL项目组接管了OpenSSL的开发工作,并推出了OpenSSL的0.9.1版,到目前为止,OpenSSL的算法已经非常完善,对SSL2.0, SSL3.0以及TLS1.0都支持。

  

OpenSSL同时实现了客户端与服务器的开发接口,使用OpenSSL进行安全通信的大致流程如下图所示。

  

   SSL连接,搭建网络安全道路

  

一、OpenSSL API

  

SSL通信模型采用标准的C/S结构,因此基于OpenSSL的程序可以被分为两个部分:客户机和服务器上。图是建立SSL通信的流程简图,说明了基于OpenSSL的程序所要遵循的以下几个重要步骤:

  

(1) OpenSSL初始化

  

OpenSSL在使用之前,必须进行相应的初始化工作,完成初始化功能的函数原型为:

  

空白SSL_load_error_strings(无效);//错误信息的初始化

  

int SSL_library_int(无效);,,,,,,,//初始化SSL算法库函数(加载要用到的算法),调用SSL函数之前必须调用此函数

  

在建立SSL连接之前,要为客户端和服务器分别指定本次连接采用的协议及其版本,目前能够使用的协议版本包括SSLv2的站点时,SSLv3, SSLv2的站点时/v3和TLSv1.0.SSL连接若要正常建立,则要求客户机和服务器必须使用相互兼容的协议。

  

(2)创建CTX

  

在OpenSSL中,CTX是指SSL会话环境。建立连接时使用不同的协议,其CTX也不一样。创建CTX的过程中会依次用到以下OpenSSL函数:

  

//客户端,服务端都需要调用的

  

SSL_CTX_new来(),,,,,,,,//申请SSL会话环境

  

//若有验证对方证书的需求,则需调用

  

SSL_CTX_set_verify(),,,,,,,,,,,//指定证书验证方式

  

SSL_CTX_load_verify_location(),//为SSL会话环境加载本应用所信任的CA证书列表

  

//若有加载证书的需求,则需调用

  

SSL_CTX_use_certificate_file(),,,,,,//为SSL会话加载本应用的证书

  

SSL_CTX_use_certificate_chain_file()//为SSL会话加载本应用的证书所属的证书链

  

SSL_CTX_use_PrivateKey_file(),,,,,,,//为SSL会话加载本应用的私钥

  

SSL_CTX_check_private_key(),,,,,,,,,//验证所加载的私钥和证书是否相匹配

  

(3)创建SSL套接字

  

在此之前要先创建普通的流套接字,完成TCP三次握的手,建立普通的TCP连接,然后创建SSL套接字,并将之与流套接字绑定。这一过程中会使用以下几个函数:

  

SSL * SSl_new (SSL_CTX * ctx);,//创建一个SSL套接字

  

int SSL_set_fd (SSL * SSL, int fd);//以才能读写模式绑定流套接字

  

int SSL_set_rfd (SSL * SSL, int fd);,//以只读模式绑定流套接字

  

int SSL_set_wfd (SSL * SSL, int fd);,//以只写模式绑定流套接字

  

(4)完成SSL握手

  

在这一步,我们需要在普通TCP连接的基础上,建立SSL连接。与普通流套接字建立连接的过程类似:客户端使用函数SSL_connect()【类似于流套接字中用的连接()】发起握的手,而服务器使用函数SSL_接受()【类似于流套接字中用的接受()】对握手进行响应,从而完成握手过程。两函数原型如下:

  

int SSL_connect (SSL * SSL);

  

int SSL_accept (SSL * SSL);

  

握手过程完成之后,客户端通常会要求服务器发送证书信息,以便对服务器进行鉴别。其实现会用到以下两个函数:

SSL连接,搭建网络安全道路