我们在了解完PKI体系结构之后,下面我们着手利用OpenSSL来构建一个安全的基于SSL协议的Web通讯。
目标 |
1,构建一个CA;
2,Web服务器制作证书签署请求;
3,CA完成对Web服务器证书的签名;
4,实现客户端和服务器端的双向验证以及两者之间的加密通讯。
SSL协议简介 |
SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。
SSL提供的服务:
1)认证用户和服务器,确保数据发送到正确的客户机和服务器;
2)加密数据以防止数据中途被窃取;
3)维护数据的完整性,确保数据在传输过程中不被改变。
SSL在TCP/IP协议模型中的位置图:
图解:
SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层:SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
SSL可以实现众多通讯协议的安全传输。常见的协议如下:
http:80/tcp------------->https:443/tcp ftp:21/tcp----------->ftps smtp:25/tcp---------->smtps:465/tcp pop3:110/tcp--------->pops:995/tcp ............
SSL的版本:
SSL v2
SSL v3
TLS v1 (相当于SSL v3.1) IETF
WTLS Mobile and wireless version of the TLS protocol
SSL通讯过程阶段一图:
阶段一图解:
1,Client端主动和Server端建立TCP连接;
2,Client向Server发送Hello信息,告知Server,我想和你建立安全连接。这是我支持的SSL版本和加密算法。
3,Server接收之后,会给Client一个响应。告知Client,我同意和你建立安全连接。我们就使用这个SSL版本和加密套件进行安全连接吧!
4,如果Client向Server提出需要验证Server端,那么Server就会将自己的经过CA签过名的数字证书文件发送给Client。Client端收到Server端发送的数字证书之后,使用CA的公钥来验证Server端的合法性。
注:Server Key Exchange表示Server端没有证书时,Server端就会把自己的公钥发送给Client端。但是这样没办法保证Server端的合法性。
5,反过来,Server端也可以验证Client端。这时候Server端会要求Client提供它指定CA颁发的证书。否则验证不通过。
6,至此,阶段一结束。Client和Server端已经协商出使用的SSL版本和加解密套件等信息。而且Client端已经得到Server端的公钥。
SSL通讯过程阶段二图:
阶段二图解:
1,如果Server端要求验证Client端,那么Client端此时会将自己的证书发送给Server端。
2,Client端会随机产生一个Session Key,然后用Server端的公钥加密这个Session Key并发送给Server端。
3,Client端使用自己的私钥加密一些信息完成签名,并发送给Server端。Server端使用Client端的公钥来验证签名,完成对客户端的验证。
4,安全通讯开始,通讯双方使用Session Key利用对称加密算法加密数据并进行传输。接收方就可以使用Session Key进行解密。
5,至此,SSL安全通讯完成。
基于SSL的Web通讯 |
1,构建CA: 1)生成密钥对 (umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048) 说明:CA私要保存路径是根据openssl的配置文件来设定的 openssl的配置文件:/etc/pki/tls/openssl.cnf 2)生成自签名证书 openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out cacert.pem-days 3656 说明:-x509 签发X.509格式证书 -key 指定签名的私钥 -days 表示有效天数 3656也就是10年 3)创建序列号文件和数据库文件 touch serial index.txt echo 01 > serial 说明:这个两个文件的文件名也是在配置文件中定义的。 echo 01 > serial 表示给它一个初始序列号。 注:CA私钥和自签名证书可以同时生成: openssl req -new -x509 -days 3656 -nodes -keyout /etc/pki/CA/private/cakey.pem -out cacert.pem -subj 'CN=Test Only' 2,Web服务器制作证书签署请求: 1)生成密钥对 (umask 077;openssl genrsa -out /root/Server.key 2048) 2)制作证书签署请求: openssl req -new -key /root/Server.key -out /root/Serreq.csr 注意:Common Name必须和客户端需要访问的FQDN或IP地址对应 3,CA完成对Web服务器证书的签名: openssl ca -in Serreq.csr -out Server.crt -days 3656 4,实现客户端和服务器端的双向验证以及两者之间的加密通讯: 客户端验证服务器: 1)编辑apache主配置文件: Include conf/extra/httpd-ssl.conf #开启ssl配置文件 2)编辑httpd-ssl.conf文件: SSLCertificateFile "/usr/local/apache/conf/Server.crt" #指定证书文件 SSLCertificateKeyFile "/usr/local/apache/conf/Server.key" 3)启动apache: /usr/local/apache/bin/apachectl start 4)客户端测试: https://192.168.1.109 openssl s_client -connect 192.168.1.109:443 服务器验证客户端: ...... 5,小技巧: 如果你的CA和Web服务器是同一台,你也可以这么来: openssl req -new -x509 -days 3656 -sha1 -nodes -newkey rsa:2048 -keyout /etc/pki/CA/private/cakey.pem -out cacert.pem -subj '/O=Seccure/OU=Seccure Labs/CN=ww.ssldemo.com' 说明: -nodes 表示不用des算法对私钥文件进行加密 CN:Common Name必须和客户端需要访问的FQDN或IP地址对应 Web服务器可以之间使用cacert.pem这个证书文件 客户端也可以直接使用https://www.ssldemo.com来访问
OpenSSL客户端工具 |
1,openssl s_client -connect HOST:443 2,ethereal 抓包工具 3,ssldump 专门抓取和分析ssl协议包