将普通的套接字网络应用修改为ssl网络应用
来源:互联网 发布:淘宝产品数据包 编辑:程序博客网 时间:2024/06/02 05:14
ssl是安全套接字层,它提供了对套接字的保护,使得套接字在从连接开始到传输的过程中都是安全的,这种安全体现点有认证和加密。传统套接字加入ssl就可以变得更加安全。
ssl保护套接字,而套接字是端口和ip的组合,端口是基于应用的,那么ssl保护的实际上是应用,它是一种VPN,和传统的IPSec有着本质的不 同,IPSec保护的是ip层,而ip是基于主机的,ip层是主机协议栈中很重要的一个层次(TCP/IP),这么可以说IPSec有着对主机的保护,它 在全局上会更加安全但是却远远没有ssl来的灵活,ssl可以保护特定的应用但是对于不需要保护的不重要的应用可以直接走快速的协议栈,实际上,ssl本 身就工作在应用层,对主机协议栈没有任何影响,而且底层协议栈可以透明的进行NAT而不用付出任何代价。实际上ssl和IPSec抛开具体应用不谈,它们 没有什么可比性,它们完全工作在不同的层次,发挥着各自的作用。
现在有很多应用是传统的伯克利套接字或者windows套接字应用,那么将其修改为ssl套接字是个不错的选择,可以保证安全又可以做到改动最小化,修改工作很简单,用开源的openssl进行修改大致分为以下几个步骤(不考虑客户端验证):
一.修改服务器:
1. 在程序初始化的时候加载算法列表以及需要传给客户端的X509证书:
meth = SSLv23_server_method(); //服务器回调函数
ctx = SSL_CTX_new(meth); //加载证书需要一个ssl上下文
SSL_CTX_use_certificate_file(ctx, "testres.pem", SSL_FILETYPE_PEM)
2. 在accept的套接字正式开始工作之前初始化一个ssl上下文和一个套接字并且绑定传统套接字和ssl套接字:
meth = SSLv23_server_method(); //服务器回调函数
ctx = SSL_CTX_new(meth); //初始化一个ssl上下文
ssl = SSL_new(ctx); //初始化ssl套接字
SSL_set_fd(ssl, newsd); //newsd为服务器监听套接字accept的传统套接字,二者绑定
注意:在ssl套接字完全初始化完毕之前必须保证传统套接字为阻塞模式,因为ssl协商需要阻塞
3. 在ssl套接字上接受客户端ssl套接字的ssl安全连接:
err = SSL_accept (ssl); //接受客户端ssl连接,实际上是一个握手协商的过程
4. 以后就用这个ssl套接字进行通信:将send改为SSL_write,将recv改为SSL_read即可
5. 在传统套接字关闭的时候关闭ssl套接字:
SSL_free(ssl); //在close或者closesocket之后调用
二.修改客户端:
1. 和服务器唯一不同的就是加载认证证书:
meth = SSLv3_client_method(); //客户端回调函数,注意版本号,一般客户端为3,服务器端为2,3
ctx = SSL_CTX_new(meth); //加载证书需要一个ssl上下文
re = SSL_CTX_load_verify_locations(ctx,"cacert.pem","."); //加载验证证书
2. 同服务器端,所不同的就是回调函数。
3. 在ssl套接字上连接服务器的ssl套接字:
err = SSL_connect(ssl); //连接服务器ssl套接字,实际上是一个握手协商的过程
4. 同服务器。
5. 同服务器。
经过以上更改以后,一个传统的套接字应用就成了ssl安全应用了,修改操作很简单,也改不了几处代码,但是看看ssl的api设计就会发现还是需要改一些 地方的(当然废话了)。传统的套接字是个文件描述符或者文件句柄,而ssl套接字返回的是个指针,这就造成了修改时的api不兼容,这种不兼容是可以理解 的,因为ssl是应用层的,不会进入协议栈,当然也不会进入操作系统内核,然后回头想想unix/linux文件描述符也好,windows的句柄也罢, 它们都是和操作系统相关的东西,如果为了兼容将ssl的接口做成和传统的套接字一样的话,那么ssl就会和操作系统大大关联,这个库就不会那么好了,而且 它还会占用一倍的套接字文件描述符或者套接字句柄资源,这不是希望的,应用层某种意义上等同于用户空间,在用户空间,完全由用户空间掌管的就是指针,指针 其实就是内存地址,因此用指针来表示ssl套接字是经过慎重考虑的,虽然导致了一定的修改,但是一旦修改过后,运行的时候更加平滑了,它不会对操作系统内 核有丝毫的影响。
- 将普通的套接字网络应用修改为ssl网络应用
- socket套接字在网络监听中的应用
- 【Android应用开发技术:网络通信】Socket套接字
- 如何应用TCP/IP的套接字开发网络通信应用程序
- WebSockets 简介:将套接字引入网络
- 网络管理的应用
- MPLS网络的应用
- 贝叶斯网络的应用
- Android的网络应用
- 网络应用的魅力
- Android的网络应用
- 网络应用的体系结构
- 网络应用的体系结构
- Android的网络应用
- 一种普通母函数的修改应用
- Linux下的c语言网络编程-将普通进程转换为守护进程
- UNIX网络编程卷1:应用进程写数据到一个TCP套接字中发生的事情
- 套接字选项的应用
- XML解析器接口—java版
- hibernate配置文件中的unsaved-value属性含义
- vs2005的FILE指针
- Posix标准中的timer和AIO
- char *和char数组的区别(深拷贝和浅拷贝的观点)以及内核访问用户空间
- 将普通的套接字网络应用修改为ssl网络应用
- 可重入性和线程安全
- i++循环与i--循环
- Tomcat的对象化处理和apache的统一式处理
- 我的工作--inotyfy实现文件同步
- 基于inotify的文件监控方案
- OpenSSL多线程互斥的解决方案--一种新的锁
- openssl的互斥回调机制
- 工作的前奏—关于目录保护与安全级别