上两张博

   《 Linux网络服务-Web Service之【HTTP协议简介】(一) 》

   《Linux网络服务-Web Service之【Apache-Prefork、Worker和Event三种工作模式分析】(二) 》

    介绍了予以实现http协议的Web Service软件、版本区别以及常用的MPM,本章将介绍如何通过apache实现一个基本的Web Server.


一、httpd常用功能及特性:
路径别名: alias;
用户认证:authentication;
虚拟主机:virtual host;
反向代理:Reverse Proxy;

负载均衡:Load Balancing;
个人用户站点;
CGI:Common Gateway Interface.


二、httpd安装、配置:

   我这里使用的是CentOS6.5_X86-64,默认已经安装了httpd服务,下面将基于该版本操作,

[root@GMQ yum.repos.d]# rpm -q httpd
httpd-2.2.15-29.el6.centos.x86_64
[root@GMQ yum.repos.d]#

后续的博文将会通过源码编译的方式搭建出一个Web Server,有兴趣的请关注...

   好了废话不说.


httpd安装好后会生成以下这些常用的文件以及目录:

/etc/httpd/conf/httpd.conf #→主配置文件;
/etc/httpd/conf.d/*.conf #→扩展配置文件;
/var/www/html #→文档根目录(Docroot);
/etc/rc.d/init.d/httpd #→服务脚本文件;
/etc/sysconfig/httpd #→脚本配置文件;
/etc/httpd #→运行目录;
/var/www/html #→文档根目录 ;
/var/log/httpd #→httpd日志文件存放目录;
/var/www/cgi-bin/ #→CGI目录;

1、主配置文件介绍:

配置文件:/etc/httpd/conf/httpd.conf

有两个部分组成:  配置   值

配置指令不区分字符大小写

值有可能区分字符大小写

有些指令可以重复出现多次

例如:Listen [IP:]80  如果IP省略则表示监听主机上的所有IP

配置文件格式:

[root@GMQ ~]# grep "Section" /etc/httpd/conf/httpd.conf
### Section 1: Global Environment  #→全局配置
### Section 2: 'Main' server configuration  #→主机配置:用于仅提供一个站点时
### Section 3: Virtual Hosts  #→虚拟主机:用于提供多个站点时
[root@GMQ ~]#
#注意:主机配置中的主机和虚拟主机不能同时启用.


2、配置文件语法测试:
[root@GMQ httpd]# service httpd configtest
[root@GMQ httpd]# httpd -t

绝大多数配置修改后,可以通过service httpd reload来生效;如果修改了监听的地址端口,必须重启服务才能生效;


3、主配置文件中常用项介绍(带实例):

1)监听套接字
       Listen [IP:]port
       此指令可以出现多次, 用于指定监听多个不同的套接字:          

[root@GMQ ~]# grep "Listen" /etc/httpd/conf/httpd.conf
Listen 80 #→监听主机来自所有ip地址的80port
Listen 172.16.41.1:8080 #→监听通过访问172.16.41.1的8080port获取网络服务
[root@GMQ ~]#

2)配置使用keep alive是否支持保持连接

KeepAlive {On|Off}       #→是否启用保持连接
#保持连接的断开标准:
KeepAliveTimeout 2       #→超时时间
MaxKeepAliveRequests 50  #→最大请求数

3)MPM
   该项已在上章博文中有详细介绍...

4)DSO模块加载方式

[root@GMQ ~]# LoadModule module_name /path/to/module

   如果使用相对路径,则对于ServerRoot所定义的位置而言;例如:

[root@GMQ ~]# LoadModule php5_module /usr/lib64/httpd/modules/php5.so

   让服务重载配置文件方能生效;


5)配置站点根目录
DocumentRoot /path/to/somewhere


6)配置页面访问属性

<Direcotry "/path/to/somewhere">
     Options:
       Indexes #→缺少指定的默认页面时,允许将目录中的所有文件以列表形式返回给用户;危险;
       FollowSymLinks #→允许跟随符号链接所指向的原始文件;
       None #→所有都启用;
       All #→所有都启用;
       ExecCGI #→允许使用mod_cgi模块执行CGI脚本;
       Includes #→允许使用mod_include模块实现服务器端包含(SSI);
       MultiViews #→允许使用mod_negotiation实现内容协商;
       SymLinksIfOwnerMatch #→在链接文件属主属组与原始文件的属主属组相同时,允许跟随符号链接所指向的原始文件;
</Directory>


7)基于主机的访问控制

<Direcotry "/path/to/somewhere">   
       Options
       AllowOverride None
       Order Deny,Allow  #→Order关键字定义顺序
       Allow
       Deny
</Directory>

   最佳匹配:从列表中找出最小的能匹配到访问者的地址的条目为最终生效的;

#基于IP做访问控制:
Allow from IP、Netmask Address
Deny from  IP、Netmask Address
           IP, Network Address #→下面四种方法都可以使用
           172.16
           172.16.0.0
           172.16.0.0/16
           172.16.0.0/255.255.0.0

           基于用户做访问控制(后续)

8)定义默认主页面
       DirectoryIndex index.php index.html home.html default.html

9)用户目录
       如果期望让每个用户都可以创建个人站点:http://Server_IP/~Username/
       userdir disablied: 禁止
       userdir public_html
           public_html是用户家目录下的目录名称,所有位于此目录中的文件均可通过前述的访问路径进行访问,前提条件:用户的家目录得赋予运行httpd进程的用户拥有执行权限;

例如:

#修改主配置文件:
[root@GMQ ~]# vim /etc/httpd/conf/httpd.conf
#UserDir disabled    #→添加注释信息
UserDir public_html #→开启
[root@GMQ ~]# service httpd restart #→重启服务 Stopping httpd:                                           [  OK  ]
Starting httpd:                                  [  OK  ]
[root@GMQ ~]# useradd Centos #→添加用户
[root@GMQ ~]# su - Centos
[Centos@GMQ ~]$ mkdir public_html  #→新建Centos用户的网页目录与配置文件中的保持一致
[Centos@GMQ ~]$ cd public_html/
[Centos@GMQ public_html]$ echo "<h1>Centos's home.<h1>" >index.html #→新建Centos用户的网页主页文件

   测试:

wKiom1Mpp1ngXMA5AADJ2jvw_DQ891.jpg

   访问出错了,因为Centos的家目录别人访问不了运行httpd的用户apache进入不了,虽然网页文件目录和网页文件都有访问权限,但是Centos他自身的家目录其他人是没有任何访问权限的,所以我们赋予apache对他的家目录有访问权限就可以了:

[root@GMQ home]# setfacl -m u:apache:x Centos
[root@GMQ home]# getfacl Centos/
# file: Centos/
# owner: Centos
# group: Centos
user::rwx
user:apache:--x
group::---
mask::--x
other::---
[root@GMQ home]#

   再次刷新页面:

wKioL1MppzLCt_EyAABxRtcL1mY969.jpg

10)配置日志功能

  我们知道web服务的日志量是非常大的,对于我们分析日常用户访问的行为有很大的帮助,还不能删除,于是那我们就会通过日志切割来进行管理,比如:

第一天生成的日志叫做access.log,到第二天我们将它重名为access_log_20140320,然后创建一个新的access_log空文件,以此类推,我们就可以对其进行有效的管理了;

/var/log/httpd/下有两类日志:
              access.log:
访问日志,它的格式我们可以自行定义其需要记录的内容需要自定义
              error.log:
错误日志,无需定义其格式
   例如:我的httpd服务的访问日志格式:

[root@GMQ ~]# tail -1 /var/log/httpd/access_log
172.16.254.52 - - [18/Mar/2014:10:10:57 +0800] "GET /~Centos/HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64;rv:27.0) Gecko/20100101 Firefox/27.0"

wKiom1MpruTDcc4wAADMFhzRFU4524.jpg

wKioL1Mprr3hiJF7AAAuXKYXFHY201.jpg

       通过上图我们可以看得出来这种格式是在主配置文件里面定义好了的;其中“combined”我们可以自定义.
       下面我们看一下这些带百分号的格式字符串各自表达的是什么意思:

       访问日志:
       CustomLog "/path/to/access_log_file" Format_Name
       LogFormat Format_String  Format_Name

%h  #→客户端地址
%l  #→远程登录名,通常为-
%u  #→认证时的远程用户名,没有认证时为-
%t  #→收到请求时的时间;
%r  #→请求报文的起始行;
%>s #→响应状态码;
%b  #→响应报文的长度,单位为字节
%{Header_Name}i  #→记录指定请求报文首部的内容(value);

   个别格式字符串详情可参考:

   http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
           错误日志:直接指定即可
wKiom1MpsenCwzjVAAAhcEMkVFo588.jpg


11)路径别名
   Alias /alias/ "/path/to/somewhere"
   意味着访问http://Server_IP/alias/时,其页面文件来自于/path/to/somewhere这个位置;

   例如:我有一个页面是放在DocumentRoot:/var/www/html/webfile/中的,现在我希望通过/data/www这个路径也能来访问这个页面的信息:

[root@GMQ conf]# echo "<h1>Aliassite<h1>" > /var/www/html/webfile/1.html

现在访问一下:

wKioL1MqyEbwpT-4AABrfZPm6cY054.jpg

[root@GMQ conf]# vim httpd.conf
#添加下面这行信息,注意/webfile/后面的"/"如果带上,那么后面的/data/www/最后这个"/"也要带上,前后要一致.
Alias /webfile/ "/data/www/"
[root@GMQ www]# service httpd reload
Reloading httpd:
[root@GMQ conf]# cd/data/www/
[root@GMQ www]# echo "<h1>New Alias Site.<h1>">1.html
[root@GMQ www]# service httpd reload
Reloading httpd:
[root@GMQ www]#

wKiom1MqyJDx71xAAAB3ltd2jq0472.jpg

本来my.html这个页面文件是在/data/www下面的.



12)设定默认字符集(系统默认支持UTF-8)
   AddDefaultCharsetType
   在主配置文件中修改即可


13) CGI脚本路径别名
CGI: Common Gateway Interface协议
它是让Web服务器能够跟某一个应用程序执行环境通信,而且能够从这个环境获取执行的协议.
例如:我在根目录中写了个小的测试脚本叫做test.sh

[root@GMQ html]# vim test.sh
#!/bin/bash
echo "Welcom!"
echo "Today is `date +%F`"
[root@GMQ html]# chmod +x test.sh

我们通过网页去访问这个脚本:

wKioL1MqyKLRzW9PAABOCs6BDWI909.jpg

wKiom1MqyMqTu5fbAAEN69jXis8371.jpg

提示我下载;那如果我将test.sh的后缀会出现什么呢!

[root@GMQ html]# mv test.sh test

wKioL1MqyMCRePzxAABo2y1LGkI859.jpg

将它识别成了文本文件


很明显apache它会通过文件的类型或内容来识别,然后再用浏览器展现给我们的;

但是我们的目的不是这样的,我们需要它将脚本执行后的结果呈现在客户的浏览器中,那又该该如何做呢,还是得靠CGI协议来实现,apache 自身不具备这样的功能,而是它通过调用其他的应用程序,让它先执行一次再返回客户端;


但是CGI为了获某种资源,它必须要以管理员的身份去运行,CGI脚本文件还得具有SUID或SGID才行,那样系统的安全又有隐患了,于是它这样的机制逐渐淘汰,通过对CGI脚本的扩充,随后像php的脚本在自身的工作环境中运行,而无需再去调用系统的资源了


那我们再次实验:
配置主配置文件:
系统默认已经有一条别名路径了,我们就使用默认的

将之前的那个脚本文件移动到/var/www/cgi-bin目录下

[root@GMQ html]# mv test ../cgi-bin/

修改其内容

[root@GMQ html]# vim ../cgi-bin/test
#!/bin/bash
cat <<EOF
Content-Type: text/html
                         #<--这里必须留空格;语法格式.
<pre>
Welcom
Today is `date +%F`
</pre>
EOF

再次访问测试:

wKiom1MqyRGCBkkyAABcTJNGEfM030.jpg

有效果了,很明显是它先在系统里面执行过后将结果返回给apache,最后再呈现出来


14) 基于用户的访问控制
上面的第7个小点我们介绍了apache基于IP做访问控制,下面我们介绍基于用户的访问控制
基于用户的访问控制,也就是http的认证机制

wKioL1MqySqjoErbAAHQX_fNN7Y413.jpg



通过上图我发现:
问题1, 对于某个网站访问时需要认证,是不是我们系统上的帐号密码?
如果是那么它使用的系统用户帐号,我们知道为了某一资源访问没有必要为其创建系统账号信息,于是我们可以将这类用户称之为是"虚拟用户",帐号和密码在某种意义上是一串字符串而已.
问题2,那对于虚拟用户他们的用户帐号密码又存放在哪里?
放于文件中:在/etc/httpd/conf/目录下创建一个.htpasswd文件来专门存放他们的帐号密码信息,也可以放在SQL数据库、dbm、 ldap等

在我们的系统上认证功能也是以模块化的设计提供功能的,例如在配置文件中表明的这些模块:
以auth、authn、authz、authnz开头的这四类认证的模块,其中:
auth开头的
       用作认证类型
       basic: 基本认证,帐号和密码明文发送;
       digest:摘要认证,hash编码之后发送;(绝大多数的浏览器不支持此项)

authn开头的
       用作认证的提供者认证提供者(authentication provider):
       可以理解为帐号和密码的存放位置

authz开头的
       授权机制(authorization):
       根据什么进行授权

authnz开头的只有ldap
       它能实现上面两种机制的功能


案例:基于文件,做基本认证,根据用户和组授权
我们对于某个目录下的网页文件做认证
在主配置文件中加入以下内容:

(1) 编辑配置文件,为需要认证的目录配置认证机制

[root@GMQ conf]# vim httpd.conf
<Directory "/var/www/html/fin">
Options None
AllowOverrideAuthConfig#→明确说明我们要使用认证机制
AuthTypeBasic #→认证类型为基本认证
Authname"Private Area" #→网页对话框中的提示信息,自定义即可
#AuthBasicProviderfile#→认证的提供者认证提供者,默认不指定也是基于文件,故此处未使用
AuthUserFile/etc/httpd/conf/.htpasswd#→指明哪个文件中存放用户的帐号密码信息的
RequireValid-user#→明确说明上面这个文件中哪些用户才能访问,使用Valid-user则表明所有位于上面这个文件中的合法用户都可以认证后访问,如果将Vliad-user改为User则表明指定部分的的合法用户才能认证访问,跟多个用户时用空格分开
</Directory>
[root@GMQ conf]# cd /var/www/html/
[root@GMQ html]# mkdir fin
[root@GMQ html]# cd fin/
[root@GMQ fin]# echo "<h1>Fininfo<h1>">index.html
[root@GMQ fin]# servicehttpd reload

测试:

wKiom1MqyYuTgVj3AADoSJbsBE8746.jpg

很明显我们需要输入帐号和密码才能够去访问了,那我们就创建虚拟用户的帐号和密码
(2)使用htpasswd命令生成认证库

[root@GMQ ~]# htpasswd -c -m /etc/httpd/conf/.htpasswduser1 #→使用htpasswd去创建该文件、其中-c表示创建、-m表示使用md5加密
New password: #→输入该用户密码
Re-type new password: #→再次输入该用户密码
Adding password for user user1
[root@GMQ ~]# htpasswd-m /etc/httpd/conf/.htpasswd user2 #→这里不能够使用-c选项,否则前面的用户信息将会被覆盖
New password: #→输入该用户密码
Re-type new password: #→再次输入该用户密码
Adding password for user user2
[root@GMQ ~]# ls -a /etc/httpd/conf/#→很明显,为了安全性,该文件为隐藏文件
....htpasswdhttpd.confmagic
[root@GMQ ~]#

我再次输入用户名密码就可以访问了:

wKioL1MqyZuit4TaAADqI6mVqyM310.jpg

wKiom1MqycOTk_GDAABeqPtotTY903.jpg

(3) 如果要基于组进行认证则需在配置文件中加入一下内容:

[root@GMQ conf]# vim httpd.conf
<Directory"/www/htdocs/fin">
OptionsNone
AllowOverrideAuthConfig
AuthTypeBasic
AuthName"Private Area"
#AuthBasicProvider file
AuthUserFile/etc/httpd/conf/.htpasswd
AuthGroupFile/etc/httpd/conf/.htgroup#→加入此行
Requiregroup GroupName
</Directory>

组文件格式:
组名:用户1用户2用户3


15)虚拟主机

一个物理服务器提供多个站点; 使用虚拟主机得先取消中心主机,将其加入到虚拟主机中

在前面第1点中我们已经知道配置文件的三个配置段,其中第三段就是用来配置我们虚拟主机的

我们知道一个主机的服务要基于一个Socket来实现,

Web服务: Socket(IP, port)

要建立多个虚拟主机有3种实现的方式:

基于不同的IP实现不同的虚拟主机

   变化IP

基于不同的port实现不同的虚拟主机

   变化port

基于不同的FQDN实现不同的虚拟主机

   IP/Port都不变,变化ServerName的值


查看配置文件中虚拟主机的默认配置示例:

#<VirtualHost *:80>
#ServerAdminwebmaster@dummy-host.example.com#→定义此虚拟主机的管理人员地址
#DocumentRoot/www/docs/dummy-host.example.com #→定义此虚拟主机的根目录位置
#ServerNamedummy-host.example.com #→定义此虚拟主机的FQDN
#ErrorLoglogs/dummy-host.example.com-error_log #→定义此虚拟主机的错误日志信息
#CustomLoglogs/dummy-host.example.com-access_log common #→定义此虚拟主机的访问日志信息
#</VirtualHost>
#当然除了上面这些必要的选项外还有其他的选项,只要中心主机使用的指令在虚拟机中大多都能够照常使用,例如:
<virtualhost IP:port>
ServerName
DocumentRoot""
<Directory""> #→如果网页中的内容需要做认证的话我们可以定义此项
Options
..........
</Directory>
ServerAlias#→定义此虚拟主机的访问日志
ServerAdmin
</virtualhost>

下面我演示一下


基于不同IP的虚拟主机是如何实现的

(1)取消中心主机

[root@GMQ ~]# vim /etc/httpd/conf/httpd.conf
#DocumentRoot "/var/www/html" #→将其注释

(2)配置第二个IP:

[root@GMQ conf]# ifconfig eth0:0 172.16.43.43
[root@GMQ conf]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdiscnoqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet127.0.0.1/8 scope host lo
inet6::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu1500 qdisc pfifo_fast state UP qlen 1000
link/ether00:0c:29:ce:d3:8d brd ff:ff:ff:ff:ff:ff
inet172.16.41.1/16 brd 172.16.255.255 scope global eth0
inet172.16.43.43/16 brd 172.16.255.255 scope global secondary eth0:0 #→第二个IP地址已添加
inet6fe80::20c:29ff:fece:d38d/64 scope link
valid_lft forever preferred_lft forever
[root@GMQ conf]#

(3)新建虚拟主机:

<VirtualHost 172.16.41.1:80>
ServerAdminguomaoqiu@aaa.com
ServerNamewww.aaa.com
DocumentRoot"/web/aaa.com/htdocs"
</VirtualHost>
<VirtualHost 192.168.0.100:80>
ServerAdminguomaoqiu@bbb.com
ServerNamewww.bbb.org
DocumentRoot"/web/bbb.com/htdocs"
</VirtualHost>

(4)创建测试网页文件:

[root@GMQ ~]# mkdir -p /web/{aaa.com,bbb.org}/htdocs
[root@GMQ ~]# echo"<h1>www.aaa.com<h1>" >/web/aaa.com/htdocs/index.html
[root@GMQ ~]# echo "<h1>www.bbb.org<h1>">/web/bbb.org/htdocs/index.html
[root@GMQ web]# service httpd reload #→重载服务
Reloading httpd:
[root@GMQ web]#

(5)测试:

wKioL1MqyfWDTB7jAABht8ajsOc067.jpg

wKiom1Mqyh3SoQySAABkWm7vqr8198.jpg


基于不同端口的虚拟主机是如何实现的

(1)用上面的配置我们只需要修改一下配置文件就可以了

[root@GMQ ~]# mkdir -p /web/ccc.net/htdocs
[root@GMQ ~]# echo "<h1>www.ccc.net<h1>">/web/ccc.net/htdocs/index.html
[root@GMQ conf]# vim httpd.conf
<VirtualHost 172.16.41.1:6500>#→添加以下基于不同端口虚拟主机
ServerAdminguomaoqiu@ccc.com
ServerNamewww.ccc.net
DocumentRoot"/web/ccc.net/htdocs"
</VirtualHost>Listen 172.16.41.1:6500#→注意:这里监听的端口一定要该
[root@GMQ web]# service httpd reload#→重载服务
Reloading httpd:
[root@GMQ web]#

(2)测试:

wKioL1MqyhbQfGFhAABoJ6Hu1sw460.jpg


基于不同FQDN的虚拟主机是如何实现的

我还是按照上面的配置进行修改,三个虚拟主机的主页文件内容都是各自的
(1)修改三台虚拟主机的内容为下:

<VirtualHost *:80>#→注意:这里的"*"是继承"NameVirtualHost *:80"的星号,如果是IP那么虚拟主机中的也只能是IP.
ServerAdminguomaoqiu@aaa.com
ServerNamewww.aaa.com
DocumentRoot"/web/aaa.com/htdocs"
CustomLog/var/log/aaa.com.access_log common
ErrorLog/var/log/aaa.com.error_log
</VirtualHost>
<VirtualHost *:80>
ServerAdminguomaoqiu@bbb.com
ServerNamewww.bbb.org
DocumentRoot"/web/bbb.org/htdocs"
CustomLog/var/log/bbb.org.access_log common
ErrorLog/var/log/bbb.corg.error_log
</VirtualHost>
<VirtualHost *:80>
ServerAdminguomaoqiu@ccc.com
ServerNamewww.ccc.net
DocumentRoot "/web/ccc.net/htdocs"
CustomLog/var/log/ccc.net.access_log common
ErrorLog/var/log/ccc.net.error_log

(2)我们要基于域名访问那么就需要有DNS负责它们的解析,我这里就不搭建DNS服务器了,我将他们写到Windows中的hosts文件中

C:\Windows\System32\drivers\etc\hosts#→添加如下几行保存即可:
172.16.41.1www.aaa.com
172.16.41.1www.bbb.org
172.16.41.1www.ccc.net

(3)重启服务测试

[root@GMQ conf]# service httpd restart
Stopping httpd:[OK]
Starting httpd:[OK]
[root@GMQ conf]#

wKiom1MqyomBZ0ZYAABi8cG0SUU334.jpg

wKioL1MqymKQiR8lAABlZvEYgIQ182.jpg

wKiom1MqyonytljLAABe_IlyEjQ643.jpg

注意在httpd-2.2中如果使用虚拟主机则需要将此指令开启:NameVirtualHost*:80


       当客户端发起请求时第一步是去找DNS解析这三个主机名的域名,获得解析结果后再访问这3台虚拟服务器,3台虚拟主机的IP端口都一样,但是服务器端是如何区分客户端是访问的哪台主机呢,我们知道客户端在浏览器端输入上面任意一个主机名时,请求报文首部信息中有一项为"HOST"它就明确表明了这个请求是对哪台主机发起的,这样我们服务器端就能区分了,如果客户端是通过输入IP地址来获取web资源时,虚拟主机会安装配置文件中定义的多台虚拟主机自上而下的顺序响应客户端请求,我们也可以定义默认虚拟主机,只要将其放到第一个虚拟主机的位置就可以了.
下面是请求报文中的信息:用HOST来区分基于不同FQDN的主机。

wKioL1MqyoHBhVh5AAHhVfZxnpo324.jpg


16)https协议的实现

       HTTPS是最 常见的HTTP安全版本,它等到了很广泛的应用,所有主要的商业浏览器和服务器上都提供HTTPS.HTTPS将HTTP协议与一组强大的对称、非对称和基于证书的加密技术结合在一起,使得HTTPS不仅很安全,而且很灵活,很容易在处于无序状、分散的全球互联网上进行管理。

       HTTPS就是在安全的传输层上发送的HTTP,HTTPS没有将未加密的HTTP报文发送个TCP,并通过世界范围内的Ineternet进行传输,如下图,它将在HTTP报文发送给TCP之前,先将其发送个了一个安全层,对其进行加密。

       现在HTTP安全层是通过SSL及其现代替代协议TLS来实现的。

wKiom1MqytuyfQhWAAE9zpRD80E894.jpg

SSL握手:

在发送已加密的HTTP报文之前,客户端和服务器端要进行一次SSL握手,在这个握手过程中,他们要完成一下工作:
   ◆交换协议版本号;
选择一个两端都了解的密码;
对两端实体身份进行认证;

生成临时的会话密钥,以便建立加密信道.

上面的步骤完成之后它们之间就能传输加密数据了


       但是之前说过http协议是无状态连接的,那https也是无状态连接,这就意味着我们每一次发送数据都需要重复上面的步骤呢?这样就会很麻烦,于是我们可以将这些结果缓存到本地,待到第二次协商时就不用那样麻烦了,一般而言SSL会话期是当前浏览器进程的生命周期,这也是一种安全机制.

数字证书:


   在《Linux系统基础-管理之加密、解密、Openssl基本应用及CA实现过程 》博文中已经提及的了数字证书的格式,下面我们再次来清晰的学习一下:

wKiom1MqywnwuZaiAAEgLkZVCVs794.jpg

数字签名的格式

x509.3证书字段:

证书格式的版本号:
       这个证书的X.509证书版本号。现在常用的是版本3
证书序列号:
       证书办法机构(CA)生成的唯一整数,CA生成的每个证书都要有一个唯一的序列号证书签名算法证书颁发者:
       发布并签署这个证书的组织名称,以X5.00格式表示
有效期:
       此证书何时有效,有一个起始日期和一个结束日期来表示
对象名称:
       证书中描述的实体,比如个人或一个组织,对象名称是以X5.00格式表示的
对象的公钥信息:
       证书对象的公开密钥,公开密钥使用的算法,以及所有附加参数
发布者唯一的ID(可选):
       可选的证书发布者唯一标识符,这样就可以重复相同的发布者名称
对象唯一的ID(可选):
       可选的证书对象唯一标识符,这样就可以重复相同的对象名称
其它扩展信息:
       基本约束:
           对象与证书颁发机构的关系
       证书策略:
           授予证书的策略
       密钥的使用限制:
           对公开密钥使用的限制
CA签名:
       证书颁发机构指定的签名算法对上述所有字段进行的数字签名

当然,基于X.509证书的签名有好几种,(其中)包括Web服务器证书、客户端电子邮件证书、软件代码签名证书和证书颁发机构证书。


PKI: Public Key Infrastructure

端实体(申请者)

注册机构(RC)

签证机构(CA)-->签证机构(CA)

证书撤消列表(CRL)发布机构

证书存取库


http: 文本协议,80/tcp

https: 二进制格式的协议, 443/tcp

SSL会话基于IP地址进行:不支持在基于FQDN的虚拟主机上实现,如果我创建了3台虚拟主机的话那么只能对其中的一台使用HTTPS协议


客户端验正服务器证书时:

日期检测:证书是否在有效期内

证书颁发者的可信度;

证书的签名检测;

持有者的身份检测;


对于在如何运用私用CA做https加密的实验我将会单独写一篇博客,
这里介绍一下大概的实现步骤即可:

(1)先搭建出一个基于http协议的站点
(2)创建私有CA服务器并自签证书;
(4)生成密钥对儿事情证书
(3)安装mod_ssl模块
#yum -y install mod_ssl(此模块是独立的)
(3) 配置/etc/httpd/conf.d/ssl.conf
配置使用ssl的虚拟主机
ServerName
DocumentRoot
配置证书和私钥
SSLCertificatFile 证书文件
SSLCertificatKeyFile 密钥文件
(4) 重启httpd服务
(5) 测试
# openssl s_client -connect IP:port -CAfile/path/to/CA_certificate_file