文章源:网络世界通讯 作者:于洋
一般情况下,像Web这样的应用,数据在机器中经过简单的由上到下的几次封装,就进入网络,如果这些包被截获的话,那么可以很容易的根据网络 协议得到里面的数据,包括登陆用户名/密码等信息。用类似Sniffer这样的监听工具可以很容易地做到这一点。SSL可以作为对策之一,帮助我们提高 Web系统的安全性。
一.SSL工作工程概述
SSL(Secure Socket Layer)是主要用于web的安全通信标准,可以把它理解成分层体系结构中的一层,位于网络层和应用层之间。数据经过它流出的时候被加密,再往 TCP/IP送,而数据从TCP/IP流入之后先进入它这一层被解密,同时它也能够验证网络连接两端的身份。SSL可以对各种应用数据进行加密,比如: HTTP,POP,FTP,LADP等。SSL提供的安全机制可以保证应用层数据在传输时不被监听,伪造和篡改。
SSL中使用了三种加密技术:非对称密钥(公/私密钥对),对称密钥和数字签名。其中,通过使用公/私密钥对进行加解密来初始化一个SSL连接。Web服务器持有私钥,并把公钥通过证书传到客户端。具体过程如下:
1. 客户端通过HTTPS向Web服务器发出对某个页面的请求。
2. Web服务器吧含有服务器公钥的证书发送给客户端。
3. 客户端进行一系列的检查,包括:
1)证书是否过期;
2)签发此证书的CA是否存在于浏览器的可信任CA列表中;
3)Web服务器的FQDN(Fully Qualified Domain Name)是否和证书中的CN(Comman Name)匹配。
如果各项检查都通过,SSL连接就会成功的初始化。当然,针对第二项检查,CA不在信任列表中也可建立连接,只不过浏览器会提示你说这个证书来自不可信任的机构,是否继续等等。这时只要选择"是"即可。自建CA签发的证书就如此。
任何经私钥加密的数据只有通过公钥才能解密,反之亦然。不论公钥还是私钥都可以进行加解密,只不过应用场合不同。公钥加密/私钥解密用于通常 所说的加密,保证只有指定接收者(私钥拥有人)才能访问该数据。私钥加密/公钥解密用于数字签名。签名是要确保原文不被篡改,且只有发文人才能签出,即不 可抵赖。通过下面这个例子可以了解具体过程是怎样的。
条件:Alice的公钥K(ua)和私钥K(ra),Bob的公钥K(ub)和私钥K(rb)。
Alice要发送明文M给Bob,其间利用数字签名和加密,先看一下加解密过程:
前提是Alice有K(ub)和K(ra),Bob有K(ua)和K(rb);
首先,Alice用Bob的公钥K(ub)对M进行加密得到M(k),发送给Bob,Bob利用自己的私钥K(rb)对加密的消息M(k) 解密,得到M。 即使其他人得到了消息M(k),由于没有K(rb)仍然无法解密得到M。 一句话,要发送给谁明文就要用谁的公钥进行加密。
再看看数字签名的过程:
Alice对明文M用 one-way hash (MD4/MD5) 产生摘要Digest-M, 用自己的私匙K(ra)对摘要加密. Bob用Alice的公匙解开明文摘要, Bob用明文M(在上一步已获得)自行生成新摘要与解密的摘要核对, 如果无误则认为原文未经篡改 (由单向散列函数的不可逆性保证) , 明文的完整性得以确保。 如果Alice的公匙可信或由CA签发则Alice身份属实,Alice签名的不可抵赖性得以确保。
当SSL连接已经建立起来后,使用对称密钥用于实际的数据传输,因为使用相同的密钥加密和解密会节省系统资源。这个密钥是在SSL连接初始化工程中通过公钥加密/私钥解密由客户端和服务器端协商确定下来的。
二.证书的申请和签发
从上面的SSL工作过程可以发现,对Web系统加密离不开密钥对的产生和证书的签发。CA(安全认证中心)完成证书签发。
公/私密钥对的产生有两种方式:
1)由用户在自己的机器上生成密钥对
这种方式下,用户向CA申请证书时只传递公钥,私钥自己保留,因此安全性高。
2)由"可信任的第三方",即CA机械地为客户生成密钥对。
第一种方式中,用户在生成密钥对后,可以花钱让CA签署证书,这时用户要生成一个证书请求上传给CA,在这个证书请求中包括密钥对的公钥部分,等待CA的签发。如果用户是为了测试用,可以自己建立CA并签发证书。
为了考察实施了SSL情况下Web服务器的性能,我们在Windows 2000 server CA+iis和Linux+Openssl+Apache环境中分别进行了测试。应该说,在两种平台上的操作步骤基本上是一样的,尽管从表面看来有些不 同。我们以服务器端证书为例,过程如下:
1)创建CA。Windows上使用Windows 2000 CA组件。Linux上使用Openssl,必须使用命令生成CA自己的公钥和私钥,这一步必不可少,否则CA无法做数字签名。具体表现是给用户签发的证 书在使用openssl verify命令进行校验时会报错;
2)生成密钥对。Windows平台组合中由IIS5.0生成,可以导出保存。Linux组合中
由Openssl生成。在这步操作中,笔者感觉使用Openssl命令行更为清晰一些。先是生成密钥对文件,然后利用密钥文件(使用其中公钥部分)生成CSR证书请求。而Windows中则隐式生成密钥对,并把它存到默认位置;
3)将证书请求发送给CA。Windows CA支持Web方式,把请求文本粘贴到指定位置即可。Linux中只要把证书请求文件拷贝到Openssl相应的目录下就可以了。
4)签发证书。Windows中使用控制面板-管理工具-证书颁发机构进行签发。Linux中使用Openssl命令签发。
5)安装证书。从CA得到证书,可以通过网上下载也可以用磁盘拷贝或IC卡等方式获得。IIS5.0中处理挂起的请求并指向获取的证书。Linux组合中要配置Apache的httpd.conf,指明私钥和证书文件的位置。
如果要比较Linux和Windows两种平台Web with ssl的性能,最好在两个平台上使用相同的密钥对。这种需求在实际应用中也会遇到,比如一个企业的Web站点要做平台迁移,就可能需要把密钥和证书从 IIS中导出放到Apache中去,反之亦然。IIS和Openssl有相应的指令支持这些操作。(具体命令描述可参考IIS和Openssl的文档)
有兴趣的读者可以尝试一下为自己的Web系统加入SSL,也可以是邮件系统或其他什么别的应用。当然安全性的增高是以性能下降为代价的。
|