咱们在了解完PKI体系结构以后,下面咱们着手利用OpenSSL来构建一个安全的基于SSL协议的Web通信。php
目标 |
1,构建一个CA;node
2,Web服务器制做证书签署请求;算法
3,CA完成对Web服务器证书的签名;数据库
4,实现客户端和服务器端的双向验证以及二者之间的加密通信。apache
SSL协议简介 |
SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通讯提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络链接进行加密。安全
SSL提供的服务: 服务器
1)认证用户和服务器,确保数据发送到正确的客户机和服务器;网络
2)加密数据以防止数据中途被窃取;并发
3)维护数据的完整性,确保数据在传输过程当中不被改变。less
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协议包