现行网上银行和电子商务等大型的网上交易系统普遍采用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协议的其他方面的内容。
(作者:张云帆)
linux openssl基础介绍_服务器
时间: 2024-09-30 08:44:15
linux openssl基础介绍_服务器的相关文章
流行的软件测试工具介绍_服务器其它
英文原版书籍下载:https://bitbucket.org/xurongzhong/python-chinese-library/downloadss. 精品文章推荐: python 2.7 中文教程及自动化测试介绍 使用Python学习selenium测试工具 性能测试艺术 Java单元测试之模拟利器-使用PowerMock进行Mock测试 网络工具ATC 主页 http://facebook.github.io/augmented-traffic-control/ 代码托管:https:/
Javascript数组Array基础介绍_基础知识
Javascript,一门神奇的语言,它的数组也同样独特.我们要去其糟粕,取其精华,把常用的最优实践总结出来.如有错误,请指出. javascript数组是一种类数组的对象,拥有对象的特性.当属性名是小而连续的整数时,应该使用数组,否则,使用对象. 数组来源 所有的数组都是Array构造出来的,我们来测试一下constructor这个属性. var arr = []; arr.constructor === Array; // true arr.constructor === Array.pro
禁止IP访问网站的多种方法分享(linux,php,nginx,apache)_服务器其它
PHP禁止某个IP或IP段访问 废话不多说,客官请看: <? //禁止某个IP $banned_ip = array ( "127.0.0.1", //"119.6.20.66", "192.168.1.4" ); if ( in_array( getenv("REMOTE_ADDR"), $banned_ip ) ) { die ("您的IP禁止访问!"); } //禁止某个IP段 $ban_ran
ipvs模块的管理工具ipvsadm介绍_服务器其它
对ipvsadm 的命令参考,并根据自己使用的经验,进行了一个简单的翻译,希望对ipvsadm 的使用者有一定的帮助. 为了更好的让大家理解这份命令手册,将手册里面用到的几个术语先简单的介绍一下: 1,virtual-service-address:是指虚拟服务器的ip 地址 2,real-service-address:是指真实服务器的ip 地址 3,scheduler:调度方法 (lna@networksbase.com 翻译 ipvsadm v1.21 2004 年4 月) ipvsadm
rsync相对于其他同步工具的优缺点介绍_服务器其它
rsync它原本是在Linux系统下面的一个文件同步协议,随着技术的发展,它也有其它版本的,如Windows和AIX.HPUX下面都有相应的版本可以支持的.Rsync这个同步工具的好处在于完全命令行下面的操作,有详细的日志文件,同时也能支持多种不同情况下的更新,例如备份式更新等,还有一个非常好的地方是,它和服务器之间可以互相同步,即可以从服务器上更新文件下来,也可以把本地的文件提交到服务器上面去.只要你配置的参数是正确的,就能完成这样的工作. 而且这个工具占用的系统资源也比较小.另外我们也试过,
磁盘阵列RAID0、RAID1和RAID5的区别和安全性介绍_服务器其它
RAID 0:无差错控制的带区组 要实现RAID0必须要有两个以上硬盘驱动器,RAID0实现了带区组,数据并不是保存在一个硬盘上,而是分成数据块保存在不同驱动器上.因为将数据分布在不同驱动器上,所以数据吞吐率大大提高,驱动器的负载也比较平衡.如果刚好所需要的数据在不同的驱动器上效率最好.它不需要计算校验码,实现容易.它的缺点是它没有数据差错控制,如果一个驱动器中的数据发生错误,即使其它盘上的数据正确也无济于事了.不应该将它用于对数据稳定性要求高的场合.如果用户进行图象(包括动画)
简单粗暴的Caddy Server 使用介绍_服务器其它
Caddy是一个Go写的服务器软件,官方的宣传语"The HTTP/2 web server with automatic HTTPS"以及"Serve The Web Like It's 2016"简明表达了这个软件的优点和趋势,它拥有基本的apache或者nginx有的web server模块,同时还有一些很有特色的功能,比如: HTTP/2 Automatic HTTPS Multi-core Websockets Markdown IPv6 Git -...
Linux中BSD套接口开发的基础介绍_unix linux
这是关于如何用各种可以得到的接口为Linux开发网络程序的系列文章的第一篇.就像大多数Unix-based的操作系统一样,Linux支持将TCP/IP作为本地的网络传输协议.在这个系列中,我们假定你已经比较熟悉Linux上的C编程和Linux的一些系统知识诸如signals,forking等等. 这篇文章是关于如何用BSD套接口创建网络程序的基础介绍 .在下一篇中,我们会解决涉及到建立(网络)deamon进程的问题.而且今后的文章我们还会涉及到使用远程过程调用(RPC),以及用CORBA
如何配置Linux操作系统下的FTP服务器
为了实现Linux环境下的FTP服务器配置,绝大多数的Linux发行套装中都选用的是Washington University FTP(Wu-Ftpd),这是一个性能优秀的服务器软件,由于它具有众多强大功能和超大的吞吐量,Internet上的FTP服务器有60%以上采用了它. 安装与运行 以下我们以RedHat Linux为例. 1.安装 根据服务对象的不同,FTP服务可以分为两类:一类是系统FTP服务器,它只允许系统上的合法用户使用:另一类是匿名FTP服务器,它允许任何人登录到FTP服务器,和