书接上文,复习一条:elinks -dump:获取到页面数据后直接退出进程。我们的keepAlive在根据需求定义不同的时长,如果繁忙,则调短一些。
如何将http使用成https
ssl:secure socket layer 安全套接字层
ssv1
ssv2
ssv3 ~tls1
tls 传输层安全
因为http协议时明文的,基于文本编码。
telnet
使用telnet发起请求,此时我们的服务器仍是192.168.1.126
而我们的客户端多了一个192.168.1.134了
[root@bigshark cdrom]# telnet 192.168.1.126 80
Trying 192.168.1.126...
Connected to 192.168.1.126.
Escape character is ‘^]‘.
GET /index.html HTTP/1.0
Host: www.bigfire.com
HTTP/1.1 200 OK
Date: Sun, 10 Aug 2014 01:18:18 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Sat, 09 Aug 2014 21:18:22 GMT
ETag: "a0008-e-50038dc9ae2ea"
Accept-Ranges: bytes
Content-Length: 14
Connection: close
Content-Type: text/html; charset=UTF-8
this is host2 网页内容
Connection closed by foreign host.这里http1.0不支持持久连接,所以网页资源一旦全部响应完了,服务就都全断开了。
如果我们想在telnet使用中,连接使用KeepAlive,需要在配置文件里找到它,把它ON起来。这也验证http是明文的。
在笔者做实验的时候出了点小问题,笔者的服务器开启了KeepAlive服务,但是用telnet连接的时候由于把http/1.1写成了http空格/1.1,结果输出结果就一下断开。这里与大家分享,希望引以为戒。
在tcp/ip模型下,如果应用层本身不具备加密功能,则整个tcp/ip传输都是明文的方式的,如果我们想在连接的时候加密怎么办?
1、客户端与服务器的程序两者之间本身是加密的,如:浏览器是加密的,程序自身也是加密的,但是这样,我们要在应用层协议做统一和规范就很难。
则2、 在模型中,应用层与传输层增加了半个层,叫做ssl层。它的实现是OpenSSL的库文件实现的,叫libssl,httpd程序开发时,一旦调用了OpenSSL库的接口,则
httpd:对ssl功能启用与否,在于httpd是否加载了ssl模块。ssl是个模块是单独成包的。
我们使用yum list all mod*
可以查找到mod_ssl信息,然后用yum info mod_ssl,如下:
[root@www ~]# yum info mod_ssl
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
Available Packages
Name : mod_ssl
Arch : x86_64
Epoch : 1
Version : 2.2.15
Release : 29.el6.centos
Size : 90 k
Repo : new1
Summary : SSL/TLS module for the Apache HTTP Server
URL : http://httpd.apache.org
…
如果想使用https,需要先安装并加载mod_ssl模块才能使用。
再次回顾下ssl的会话当客户端和服务器端要基于ssl,由于ssl在tcp/ip协议之上,意味借助tcp协议本身来实现ssl报文的传输,由此当客户端向服务器端发出请求之后,接下来tcp三次握手之一次握手,客户端在浏览器中输入地址,DNS会解析域名到ip地址,这时ip地址进行交互。在三次握手完成之前,http的请求报文并没有发送过去。当三次握手建立成功,服务器发现http的请求是https,它要基于SSL进行会话,它再次建立基于SSL会话的握手,双方要协商如何实现加密通信。协商内容比如:双方都支持使用什么对称加密方式、双方支持什么公钥加密方式,双方使用SSL协议的版本。等等
接下来开始实现数据加密,但是有个前提,需要密钥交换的,如何实现密钥交换,比如你新访问一个站点,怎么获得密钥呢?去验证服务器端的证书,服务器要发服务端的证书给客户端,服务端证书的名字一定是你在浏览器中输入的名称,服务端发来证书以后,要看看是哪个CA给服务器发的证书,接着验证证书有效性,比如检查CA的公钥能否解密签名,再用同样的单向加密的算法计算证书的指纹信息,比较特征码,没有问题的话,完整性就得到了校验。还需要验证证书是否有效,还验证在没在证书的吊销列表,当一切都检验妥当,才是SSL建立会话的过程。我们的客户端选择一个对称加密的密钥用服务器端的公钥加密以后发送给服务器端,因此服务器用自己的私钥解密来获得对称加密的密钥,然后用这个密钥加密网络文件再发给客户端。
ssl会话是基于ip地址建立的,仅仅是基于主机名验证你的证书,所以说只有ssl通道建立后,用户的请求才能达到服务器端。若你访问了虚拟主机,所有的虚拟主机只能使用同一个SSL进行通信。所以说,如果某公司做了三个网站,三个网站都是一个IP地址,三个网站没有办法同时使用SSL进行通话,只有一个才可以使用SSL通话的。否则证书会全部混乱。
故,每一个ip地址仅能创建一个ssl会话。
建立好了会话以后,如果还是工作在一个非持久连接的状态下,每一个的三次握手并且建立ssl会话通道、加密解密等等,会特别占用消耗。
ssl比http多了很多步骤,不管是服务器端还是客户端都有巨大压力,为了加速会话速度和cpu消耗,现在出现了很多本身就完成ssl会话支持加密的硬件芯片。
下图对比了http会话和基于ssl通道的https会话。
未加密的http事务,都是tcp发送和响应请求的,然后在关闭。
https中多了ssl连接和断开,多消耗很多资源,对CPU压力很大。
https中很重要的还是证书,证书格式如下:
证书版本号
证书序列号
证书签名算法
证书颁发者
证书有效期
对象的名称(需要与服务器的主机名保持一致)
对象的公钥
其他信息
CA的数字签名
Ra ca CTL还有证书存取库 共称为PKI,核心是CA
ssl握手要完成的工作
交换协议版本号,选择双方都支持的加密方式,客户端向服务器端都实现身份验证,(解密对方上的证书签名)密钥交换(客户端要选择一个对称加密的密钥交换,然后用对方的公钥加密后传递给对方)。所以http称为https,http是文本编码,而https是基于ssl做二进制编码的。
因此我们的服务器是https,我们客户端想基于ssl做认证,要使用Openssl+s_client的工具与服务器端做交互。能够证明证书有效性,能够与对方做协商以及数据加密解密传输。
https将监听在443端口,不能在FQDN做认证。
客户端验证服务器端证书、
1.有效期的检测
2.CA的有效性检测(用本地的CA解密CA的签名,能则成功)
3、证书签名检测
4、持有者的身份验证。(看浏览器输入的名称是否跟CA颁发的证书上的主机名是否一致)
开始模拟建立https
一、 安装mod_ssl模块
# yum install mod_ssl
rpm -ql mod_ssl
/etc/httpd/conf.d/ssl.conf
查看ssl.conf,看里面配置文件 是否开启叫SSLEngine
# SSL Engine Switch:
# Enable/Disable SSL for this virtual host.
SSLEngine on
<VirtualHost _default_:443> 默认在443上
# General setup for the virtual host, inherited from global configuration
#DocumentRoot "/var/www/html"这里的根目录文件默认被注释掉了
#ServerName www.example.com:443
一个网站很可能在浏览时是基于http的,一旦出现支付页面则需要开启https了。
二、为服务端器生成私钥(演示过程在同一主机上)
1.为CA生成私钥
[root@localhost CA]# (umask 077; openssl genrsa -out private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus
....................................................................+++
............................................................+++
e is 65537 (0x10001)
查看CA私钥,是否是600权限。
[root@localhost CA]# ll private/
total 4
-rw------- 1 root root 1679 Aug 11 17:42 cakey.pem
2、生成自签证书,但要保证证书前面格式 一致。
openssl req -new -x509(表示自发自签,仅限个人做CA实验用) -key private/cakey.pem -out cacert.pem -days 360
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.‘, the field will be left blank.
-----
Country Name (2 letter code) [XX]: 一直到提示你输入CA证书格式信息
3.创建serial和index.txt,并且echo 01 > serial
另外还有生成一个证书签署软件,让CA给我们签。
openssl req –new –key httpd.key(对当前已经生成的密钥) –out httpd.csr(生成一个签名请求)1024 (长度为1024的)
ll查看当前目录,发现生成-rw-r--r-- 1 root root 3716 Aug 12 19:52 httpd.crt
然后返回到httpd目录下,并cd到conf.d目录下,编辑ssl.conf,找到SSL证书那
把刚才生成的路径文件填写到那里。因为刚才签署证书时使用的主机名是我们的www.aaabig.com,所以在/etc/httpd/conf/httpd.conf中找到对应的那个虚拟主机,然后在ssl.conf文件中找到DocumentRoot一项,改为对应虚拟主机的根文件目录保持一致。注意一个ip地址只能有一个ssl会话连接!
在浏览器中输入https://www.aaabig.com
显然是有证书的,但是客户端没有CA的公钥,无法验证证书的合法性。点锁查询证书信息。于是这样,利用xftp把证书传给windows一份,最好让它保存在一个良好的位置,然后在重命名为cacert.crt。
你想验证服务器的证书,你作为客户端首先要有CA的证书。我们使用命令行试试:
[root@localhost ~]# openssl s_client -connect 192.168.1.121:443
CONNECTED(00000003)
depth=0 C = CN, ST = hebei, O = mageedu, OU = ops, CN = www.aaabig.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 C = CN, ST = hebei, O = mageedu, OU = ops, CN = www.aaabig.com
verify error:num=27:certificate not trusted
verify return:1
depth=0 C = CN, ST = hebei, O = mageedu, OU = ops, CN = www.aaabig.com
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
0 s:/C=CN/ST=hebei/O=mageedu/OU=ops/CN=www.aaabig.com
i:/C=CN/ST=hebei/L=baoding/O=mageedu/OU=ops/CN=caserver.mageedu.com
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIDNjCCAh6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBuMQswCQYDVQQGEwJDTjEO
MAwGA1UECAwFaGViZWkxEDAOBgNVBAcMB2Jhb2RpbmcxEDAOBgNVBAoMB21hZ2Vl
ZHUxDDAKBgNVBAsMA29wczEdMBsGA1UEAwwUY2FzZXJ2ZXIubWFnZWVkdS5jb20w
HhcNMTQwODEyMTE1MjUwWhcNMTUwMjI4MTE1MjUwWjBWMQswCQYDVQQGEwJDTjEO
MAwGA1UECAwFaGViZWkxEDAOBgNVBAoMB21hZ2VlZHUxDDAKBgNVBAsMA29wczEX
Q+jhVPz7HKpOXoenXEeIRcr+DxPvcQJzjjfp70JdEPb3JJ/aIDrzMh716RnDsrHf
lOD/W9sid4niwg==
-----END CERTIFICATE-----
subject=/C=CN/ST=hebei/O=mageedu/OU=ops/CN=www.aaabig.com
issuer=/C=CN/ST=hebei/L=baoding/O=mageedu/OU=ops/CN=caserver.mageedu.com
---
No client certificate CA names sent
---
SSL handshake has read 1575 bytes and written 499 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-GCM-SHA384
Server public key is 1024 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1.2
Cipher : DHE-RSA-AES256-GCM-SHA384
Session-ID: 0129F689AB259250E90701FC73FF0B79DD7B62D9BBF7C7C475A48EAA63DC8FD9
Session-ID-ctx:
Master-Key: 9DD25205B672FD9A6ECF51DC8DF2CEEE1F9DBD49962972DD01E6231B1F8A3B4AA6909FBB1BA33CBF36D6AD665B550976
Key-Arg : None
Krb5 Principal: None
PSK identity: None
PSK identity hint: None
TLS session ticket lifetime hint: 300 (seconds)
TLS session ticket:
0000 - 1d 5e f8 d1 15 0a 71 81-8d b6 ab 3c 43 e1 4a a3 .^....q....<C.J.
0010 - 4c ef c6 fe 71 40 0d 6e-e0 92 78 91 79 9e f5 82 L...q@.n..x.y...
0020 - d9 bb c5 72 38 29 0f 96-22 e5 34 3c 7a fd 99 c4 ...r8)..".4<z...
0030 - 55 17 fc bd 9d 71 30 d3-71 e3 d4 f1 ee 2a 0b 85 U....q0.q....*..
0040 - 23 eb 31 fa b8 7e 35 39-bc 8a e9 54 b5 72 d2 12 #.1..~59...T.r..
0050 - e5 ae 32 b7 83 ff 08 51-b3 bb d7 e6 7c 59 d4 b3 ..2....Q....|Y..
0060 - 3e 2f a0 5b 57 88 bb 30-e9 a6 72 22 d5 28 fc f5 >/.[W..0..r".(..
0070 - b2 28 3c 5c ce 86 19 06-7d 08 39 48 c9 4b 24 02 .(<\....}.9H.K$.
0080 - 8c a6 dc 52 19 4d 64 65-fd 20 10 7d c7 98 c7 fb ...R.Mde. .}....
0090 - f2 ac 06 a9 7a ca c5 da-9b 4d 58 09 f0 d1 d5 87 ....z....MX.....
00a0 - 17 26 b5 0c fa 60 60 52-41 ae d8 2e 84 2b c2 89 .&...``RA....+..
00b0 - 85 ed 0b 12 6a 55 f4 93-50 28 80 10 ee ba ee 9a ....jU..P(......
Start Time: 1407901775
Timeout : 300 (sec) Verify return code: 21 (unable to verify the first certificate)这边写着无法验证证书。只是对方服务器身份无法验证,不过会话可以建立。
如果我们仍想校验证书,可以利用scp 命令
[root@localhost ~]# scp 192.168.1.121:/etc/pki/CA/cacert.pem ./ 找到对方CA证书的位置,放到本地即可。
表明可以获取数据了。SSL会话通信成功,我们可以利用GET HTTP Host来获取信息
原文地址:http://libincla.blog.51cto.com/6249823/1539333