linux openssl基础介绍

现行网上银行和电子商务等大型的网上交易系统普遍采用HTTP和SSL相结合的方式。服务器端采用支持SSL的Web服务器,用户端采用支持SSL的浏览器实现安全通信。 
    SSL是Secure Socket Layer(安全套接层协议)的缩写,可以在Internet上提供秘密性传输。Netscape公司在推出第一个Web浏览器的同时,提出了SSL协议标准,目前已有3.0版本。SSL采用公开密钥技术。其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持。目前,利用公开密钥技术的SSL协议,已成为Internet上保密通讯的工业标准。本文着重在SSL协议和SSL程序设计两方面谈谈作者对SSL的理解。 
SSL协议初步介绍 
    安全套接层协议能使用户/服务器应用之间的通信不被攻击者窃听,并且始终对服务器进行认证,还可选择对用户进行认证。SSL协议要求建立在可靠的传输层协议(TCP)之上。SSL协议的优势在于它是与应用层协议独立无关的,高层的应用层协议(例如:HTTP,FTP,TELNET等)能透明地建立于SSL协议之上。SSL协议在应用层协议通信之前就已经完成加密算法、通信密钥的协商及服务器认证工作。在此之后应用层协议所传送的数据都会被加密,从而保证通信的私密性。 
通过以上叙述,SSL协议提供的安全信道有以下三个特性: 
1.数据的保密性 
信息加密就是把明码的输入文件用加密算法转换成加密的文件以实现数据的保密。加密的过程需要用到密匙来加密数据然后再解密。没有了密钥,就无法解开加密的数据。数据加密之后,只有密匙要用一个安全的方法传送。加密过的数据可以公开地传送。 
2.数据的一致性 
加密也能保证数据的一致性。例如:消息验证码(MAC),能够校验用户提供的加密信息,接收者可以用MAC来校验加密数据,保证数据在传输过程中没有被篡改过。 
3.安全验证 
加密的另外一个用途是用来作为个人的标识,用户的密匙可以作为他的安全验证的标识。 
    SSL是利用公开密钥的加密技术(RSA)来作为用户端与服务器端在传送机密资料时的加密通讯协定。目前,大部分的Web 服务器及浏览器都广泛支持SSL 技术。当浏览器试图连接一个具有SSL认证加密的服务器时,就会唤醒一个SSL会话,浏览器检查认证,必须具备下面三个条件: 
1)有一个权威机构发放证书,当然可以创建自我签订的证书(x509 结构)。 
2)证书不能过期。 
3)证书是属于它所连接的服务器的。 
    只有全部具备了这三个条件,浏览器才能成功完成认证。通过这三个条件,用户能确认其浏览器连接到正确的服务器,而不是连接到一些想盗取用户密码等重要信息的虚假的服务器上。 
    在当今的电子商务中还有一项被广泛使用的安全协议是SET协议。SET(Secure Electronic Transaction,安全电子交易)协议是由VISA和MasterCard两大信用卡公司于1997年5月联合推出的规范。SET能在电子交易环节上提供更大的信任度、更完整的交易信息、更高的安全性和更少受欺诈的可能性。SET交易分三个阶段进行:用户向商家购物并确定支付;商家与银行核实;银行向商家支付货款。每个阶段都涉及到RSA对数据加密,以及RSA数字签名。使用SET协议,在一次交易中,要完成多次加密与解密操作,故有很高的安全性,但SET协议比SSL协议复杂,商家和银行都需要改造系统以实现互操作。 
在Linux 下,比较流行支持SSL认证的是OpenSSL服务器。OpenSSL项目是一个合作的项目,开发一个健壮的、商业等级的、完整的开放源代码的工具包,用强大的加密算法来实现安全的Socket层(Secure Sockets Layer,SSL v2/v3)和传输层的安全性(Transport Layer Security,TLS v1)。这个项目是由全世界的志愿者管理和开发OpenSSL工具包和相关文档。 
     如何在Linux下配置OpenSSL服务器,首先从OpenSSL的主页()上下载openssl-version.tar.gz软件包来编译安装,与Apache服务器配合可以建立支持SSL的Web服务器,并可以使用自我签订的证书做认证,关于如何编译、安装OpenSSL服务器,可以参考一下OpenSSL HOWTO文档。 
SSL 程序设计初步介绍 
    SSL 通讯模型为标准的C/S 结构,除了在 TCP 层之上进行传输之外,与一般的通讯没有什么明显的区别。在这里,我们主要介绍如何使用OpenSSL进行安全通讯的程序设计。关于OpenSSL 的一些详细的信息请参考OpenSSL的官方主页 。 
在使用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环境; 
    OpenSSL 虽然已经发展到了0.9.96版本,但是它的文档还很少,甚至连最基本的man 函数手册都没有完成。所以,本文紧紧是讲述了使用OpenSSL 进行程序设计的框架。更加详细的资料可以参考OpenSSL 的文档或者 Apache mod_ssl 的文档。 
    通过以上的介绍,我想读者对SSL协议已经有了一定的了解,作者有机会将会继续给大家介绍SSL协议的其他方面的内容。 
(作者:张云帆)

(0)

相关推荐

  • linux下安装openssl、swoole等扩展的详细步骤

    OpenSSL是一个开源的ssl技术,由于我需要使用php相关功能,需要获取https的文件所以必须安装这个东西了.下面给大家介绍下linux下安装openssl.swoole等扩展的详细步骤,一起看看吧! 编译安装 先来看编译安装的php,如果需要安装新的扩展,这里以安装openssl扩展为例进行说明 1.找到php源码目录,我们这里的源码位于 /opt/download/php-5.5.30 ,如果找不到了,查看当前php版本,通过 wget http://cn2.php.net/distr

  • Linux中openssl/opensslv.h找不到问题的解决方法

    前言 众所周知scrapy是Python中鼎鼎大名的爬虫框架,在安装scrapy过程中碰到了openssl某个文件找不到的问题,并进行了分析,记录之. 一. scrapy以及安装过程 Scrapy是python中鼎鼎大名的爬虫框架,笔者在Centos 7系统之上进行安装,发现了如下问题: >> pip install scrapy 由于安装过程中的过程信息比较多,这里只列出了其中的关键片段信息: running egg_info writing requirements to src/cryp

  • linux系统中使用openssl实现mysql主从复制

            证书准备: CA证书: 第一步:创建CA私钥 [root@localhost CA]# (umask 066;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048) 第二步:生成自签证书 [root@localhost CA]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem  -days 7300 -out /etc/pki/CA/cacert.pem -

  • linux openssl基础介绍

    现行网上银行和电子商务等大型的网上交易系统普遍采用HTTP和SSL相结合的方式.服务器端采用支持SSL的Web服务器,用户端采用支持SSL的浏览器实现安全通信.     SSL是Secure Socket Layer(安全套接层协议)的缩写,可以在Internet上提供秘密性传输.Netscape公司在推出第一个Web浏览器的同时,提出了SSL协议标准,目前已有3.0版本.SSL采用公开密钥技术.其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持.目前,利用公开密钥技术

  • Linux操作系统中BSD套接口开发的基础介绍

    这是关于如何用各种可以得到的接口为Linux开发网络程序的系列文章的第一篇.就像大多数Unix-based的操作系统一样,Linux支持将TCP/IP作为本地的网络传输协议.在这个系列中,我们假定你已经比较熟悉Linux上的C编程和Linux的一些系统知识诸如signals,forking等等. 这篇文章是关于如何用BSD套接口创建网络程序的基础介绍 .在下一篇中,我们会解决涉及到建立(网络)deamon进程的问题.而且今后的文章我们还会涉及到使用远程过程调用(RPC),以及用CORBA/dis

  • Linux中BSD套接口开发的基础介绍

    这是关于如何用各种可以得到的接口为Linux开发网络程序的系列文章的第一篇.就像大多数Unix-based的操作系统一样,Linux支持将TCP/IP作为本地的网络传输协议.在这个系列中,我们假定你已经比较熟悉Linux上的C编程和Linux的一些系统知识诸如signals,forking等等. 这篇文章是关于如何用BSD套接口创建网络程序的基础介绍 .在下一篇中,我们会解决涉及到建立(网络)deamon进程的问题.而且今后的文章我们还会涉及到使用远程过程调用(RPC),以及用CORBA/dis

  • linux脚本基础详细介绍

    目录 1.脚本vim环境 2.shell脚本中环境的定义方法 3.shell脚本中的转译字符 4.脚本中变量的数组 5.系统中命令的别名设定 6.脚本中的传参 7.脚本中的循环函数 1.脚本vim环境 在脚本中通常要显示一些脚本信息,这些信息可以通过对vim设定使其自动出现 /etc/vimrc 此文件是vim的主配置文件,文件内容全局生效 -/.vimrc 此文件是vim子文件,在用户家目录中编辑vim的配置文件也可以控制,但是只针对当前用户生效 vim ~/.vimrc 编辑配置文件 配置信

  • Linux学习基础教程

    Linux学习基础 1.什么是Linux?  准确的说,是指Linux的kernel(系统的核心程序),其内核版权属于Linus Torvalds,在GPL(GNU General Public License)版权协议下发行, 任何人都可以自由的复制(copy), 修改(change), 套装分发(distribute),销售,但是不可以在分发时加入任何限制, 而且所有原码必须是公开的,所以任何人都可以无偿取得所有执行文件和原代码.  对于Linux用户和系统管理员来说,Linux是指包含Li

  • linux操作系统原理 linux系统基础教程

    本篇文章系统的给大家讲述linux操作系统原理,这是一篇非常好的linux系统基础教程,我们总结了相关的全部精选内容,一起来学习下. linux操作系统原理文字版 一.计算机经历的四个时代 1.第一代: 真空管计算机,输入和输出:穿孔卡片,对计算机操作起来非常不便,做一件事可能需要十几个人去共同去完成,年份大概是:1945-1955.而且耗电量特别大,如果那个时候你家里有台计算机的话,可能你一开计算机你家的电灯泡亮度就会变暗,哈哈~ 2.第二代: 晶体管计算机,批处理(串行模式运行)系统出现.相

  • Flask框架学习笔记之表单基础介绍与表单提交方式

    本文实例讲述了Flask框架学习笔记之表单基础介绍与表单提交方式.分享给大家供大家参考,具体如下: 表单介绍 表单是HTML页面中负责数据采集功能的部件.由表单标签,表单域和表单按钮组成.通过表单,将用户输入的数据提交给服务器,并交给服务端进行处理. 表单标签 用于声明表单的范围,位于表单标签的元素将被提交. 语法:<form></form> 属性:Method规定用于发送表单数据的 HTTP 方法. Enctype规定在向服务器发送表单数据之前如何对其进行编码.(适用于 meth

  • Linux组基本介绍知识点总结

    一.Linux组基本介绍 在Linux中每个用户必须属于一个组,不能独立于组外.在Linux中每个文件有所有者,所在组,其他组的概念 1)所有者 2)所在组 3)其他组 4)改变用户的所在组 二.文件/目录 所有者 一般为文件的创建者,谁创建了该文件,就自然成为该文件的所有者 1.查看文件的所有者 1)指令: ls  -ahl 2) 应用实例 : 2.修改文件所有者 指令: chown  用户名   文件名 应用实例 要求: 三.组的创建 1.基本命令 groupadd  组名 2.应用实例  

  • Python中字典的基础介绍及常用操作总结

    目录 1.字典的介绍 2.访问字典的值 (一)根据键访问值 (二)通过get()方法访问值 3.修改字典的值 4.添加字典的元素(键值对) 5.删除字典的元素 6.字典常见操作 1.len 测量字典中键值对的个数 2. keys 返回一个包含字典所有KEY的列表 3. values 返回一个包含字典所有value的列表 4. items 返回一个包含所有(键,值)元祖的列表 5.遍历字典的key(键) 6.遍历字典的value(值) 7.遍历字典的items(元素) 8.遍历字典的items(键

  • Python中元组的基础介绍及常用操作总结

    目录 1.元组的介绍 2.访问元组 3.修改元组(不可以修改的) 4.元组的内置函数有count,index 5.类型转换 1.将元组转换为列表 2.将元组转换为集合 1.元组的介绍 Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. 元组的格式: tup=('a','b','c','d') 2.访问元组 元组可以使用下标索引来访问元组中的值,下标索引从0开始 例如: tup=('a','

随机推荐