SSL协议和抓包

2012年12月15日 | 分类: 操作系统, 编程技术, 网络性能 | 标签: ,

主要内容

  • 什么是SSL
  • CA建立和证书管理
  • Wireshark配置抓SSL包

一、什么是SSL

简单理解,ssl就是运行在tcp传输层之上,用来保证会话的安全性,完整性,可认证性:
安全意味着,传输的信息不会泄露给通讯之外的第三方,即便被截获,也只是密文,无法查看到原来的内容;
完整意味着,消息从发送方产生,到最终接收,内容不会被第三方更改,即便更改,也会由于摘要信息等不匹配而丢弃;
认证意味着,通信的双方的身份是有保障的,这是安全通信的基础;

ssl通过加密算法和数字签名等来实现这些特征:

加密算法分为对称和非对称,对称是指双方使用同一个密钥进行加解密,效率高,但安全性低,因为在协商密钥的时候,很可能被其他人截获,非对称算法恰好弥补这一点,这种算法有2个密钥,公钥公布,私钥自己保留,公钥和私钥可以互相加解密,这样
客户通过公钥加密的数据,只要服务器通过私钥才能解密,从而保证安全性。

数字签名是指对某一块信息进行签字(其实也是加密,只不过是用私钥),签过字的信息,只有公钥才能解开,因为私钥是不公布的,所以其他人无法伪造签字。

SSL的整个建立过程如下:

https
1. 客户端发起HTTPS请求
2. 服务端的配置
采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面
3. 传送证书
这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。
4. 客户端解析证书
这部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随即值。然后用证书对该随机值进行加密。
5. 传送加密信息
这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。
6. 服务段解密信息
服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密。所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。
7. 传输加密后的信息
8. 客户端解密信息

SSL的基本思想是用非对称加密来建立链接(握手阶段),用对称加密来传输数据(传输阶段)。这样既保证了密钥分发的安全,也保证了通信的效率。通过上面对SSL的分析,我们可以看到,SSL并不能阻止别人获得你传输的数据,但是由于你传输的数据都是加密过的,别人拿到了毫无用处,一样可以保护信息的安全

二、Ca建立和证书管理

证书就像是身份证一样,可以表明用户身份,但只有经过权威机构(比如公安局发放)签过名的证书才具有合法地位,其它的证书用户可以选择是否相信。权威机构签发的证书其实就是通过权威机构的私钥进行加密,然后浏览器拿到证书后用权威机构的公钥进行解密,获得证书的对应的服务器的具体信息,如失效时间,域名,以及该服务器的公开公钥。一般互联网应用,服务器需要身份验证,客户端一般不需要验证,一般客户端证书都是公司内网用来验证员工身份时才使用。

首先要有一个权威证书,然后用权威证书来签发服务器证书和客户证书,服务器证书和客户证书是平级关系,SSL所使用的证书可以自己生成,也可以通过一个商业性CA(如Verisign 或 Thawte)签署证书。签发证书的问题:如果使用的是商业证书,具体的签署方法请查看相关销售商的说明;如果是知己签发的证书,可以使用openssl 自带的CA.sh脚本工具。如果不为单独的客户端签发证书,客户端证书可以不用生成,客户端与服务器端使用相同的证书。

有了证书相当于有了身份证,才可以进行后续的信息交互,关系如下图:
ca

主证书生成
找到openssl的CA脚本:
./CA.sh -newca
建立成功的话,会在ssl目录下面产生一个文件夹demoCA
主证书用来后续的服务器证书或者客户端证书的签名,也可以加到客户端的信任列表中,方法是:将demoCA中的cacer.pem改名
为ca.crt并拷贝到windows,执行导入操作
cacrt

生成服务器私钥和服务器证书
产生服务器私钥
openssl genrsa -des3 -out server.key 1024
生成服务器证书
openssl req -new -key server.key -out server.csr
对产生的服务器证书进行签证
cp server.csr newreq.pem
./CA.sh -sign
cp newcert.pem server.crt
中间会有密码输入,其它地方默认即可,commonName可以填域名
客户端证书生成步骤一样,只不过要转化成pfx能够安装才行:
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.pfx

apache配置主要是:
ssl开启
SSLEngine on

指定服务器证书位置
SSLCertificateFile /usr/local/apache/conf/ssl/server.crt

指定服务器证书key位置
SSLCertificateKeyFile /usr/local/apache/conf/ssl/server.key

证书目录
SSLCACertificatePath /usr/local/apache/conf/ssl

根证书位置
SSLCACertificateFile /usr/local/apache/conf/ssl/cacert.pem

要求客户拥有证书
SSLVerifyClient require
SSLVerifyDepth  1
SSLOptions +StdEnvVars

记录log
CustomLog “/usr/local/apache/logs/ssl_request_log” \
          “%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \”%r\” %b”

配置成功后访问ssl站点出现,可以看到CA可信,服务端证书可以正确认证:
https

三、wireshark配置

因为证书是由密码加密的,wireshark解密的时候需要的是明文的秘钥,因此还需要做一下转换: openssl rsa -in server.key > clearkey.key
选中Wireshark主菜单Edit->Preferences,将打开一个配置窗口;窗口左侧是一棵树(目录),你打开其中的Protocols,将列出出所有Wireshark支持的协议;在其中找到SSL并选中,右边窗口里将列出几个参数,其中“RSA keys list”即用于配置服务器私钥:
各字段的含义为:

  • <ip>    —- 服务器IP地址(对于HTTPS即为WEB服务器)。
  • <port>  —- SSL的端口(HTTPS的端口,如443)。
  • <protocol> —- 表示SSL里加密的是什么协议,对于HTTPS,这项应该填HTTP。
  • <key_file_name> —- 服务器密钥文件,文件里的私钥必须是明文(没有密码保护的格式)。

如:

config
可以参见:http://wiki.wireshark.org/SSL Example capture file的例子。
如:
wiresharkssl

-the end

本文的评论功能被关闭了.