www是world wide web的缩写,也就是全球信息广播的意思。通常说的上网就是使用www来查询用户所需要的信息。www可以结合文字、图形、影像以及声音等多媒体,并通过可以让鼠标单击超链接的方式将信息以Internet传递到世界各处去。
与其他服务器类似,当你连接上www网站,该网站肯定会提供一些数据,而你的客户端则必须要使用可以解析这些数据的软件来处理,那就是浏览器。
www所用的协议:(http协议Hyper Text Transport Protocol,超文本传输协议)。
www服务器需要提供可让客户端浏览的平台。目前最主流的Web服务器是Apache、Microsoft的Internet信息服务器(Internet Information Services,IIS)和unix nginx。
服务器所提供的最主要数据是超文本标记语言(Hyper Text Markup Language,HTML)、多媒体文件(图片、影像、声音、文字等,都属于多媒体或称为超媒体),HTML只是一些纯文本数据,通过所谓的标记来规范所要显示的数据格式。
客户端收到服务器的数据之后需要软件解析服务器所提供的数据,最后将效果呈现在用户的屏幕上。那么著名的浏览器就有内建在Windows操作系统内的IE浏览器了,还有Firefox浏览器和Google的chrome浏览器。
web服务器提供的这些数据大部分都是文件,那么我们需要在服务器端先将数据文件写好,并且放置在某个特殊的目录下面,这个目录就是我们整个网站的首页,在redhat中,这个目录默认在/var/www/html。浏览器是通过你在地址栏中输入你所需要的网址来取得这个目录的数据的。
URL:Uniform Resource Locator,统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。
<协议>://<主机地址或主机名>[:port]/<目录资源,路径>
浏览器常支持的协议有:http、https、ftp等。
主机地址或者主机名:主机地址就是服务器在因特网所在的IP地址。如果是主机名的话,那么就需要域名解析了。
http为80,https为443。( IANA:互联网数字分配机构)
0-1023:众所周知,永久地分配给固定的应用程序使用,特权端口(只有管理员有权限启用并让进程监听);
1024-41951:亦为注册端口,但要求不是特别严格,分配给程序注册为某应用使用:3306/TCP;
41952-60000:客户端程序随机使用的端口,动态端口,或私有端口;
http请求方法:
在http通信中,每个http请求报文都包含一个方法,用以告诉web服务器端需要执行哪些具体的动作,这些动作包括:获取指定web页面、提交内容到服务器、删除服务器上资源文件等。
1xx:指示信息 —— 表示请求已接收,继续处理。
2xx:成功 —— 表示请求已被成功接收、理解、接受。
3xx:重定向 —— 要完成请求必须进行更进一步的操作。
4xx:客户端错误 —— 请求有语法错误或请求无法实现。
5xx:服务器端错误 —— 服务器未能实现合法的请求。
常见状态代码、状态描述的说明如下:
200 OK:客户端请求成功。
400 Bad Request:客户端请求有语法错误,不能被服务器所理解。
401 Unauthorized:请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用。
403 Forbidden:服务器收到请求,但是拒绝提供服务。
404 Not Found:请求资源不存在,举个例子:输入了错误的URL。
500 Internal Server Error:服务器发生不可预期的错误。
503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。
HTTP报文:http报文中有很多行内容,这些行的字段内容都是由一些ASCII码串组成,但各个字段的长度是不同的。http报文可分为两种,一种是从web客户端发往web服务器的http报文,称为请求报文。另外一种是从web服务器发往web客户端的报文,称为响应报文。
http请求报文:http请求报文由请求行、请求头部、空行和请求报文主体几个部分组成:
**MIME(Multipurpose Internet Mail Extension,多用途因特网邮件扩展)**最初是为了解决在不同的电子邮件系统之间搬移报文时存在的问题。后来http也支持了这个功能,用它来描述数据并标记不同的数据内容类型。
当web服务器响应http请求时,会为每一个http对象数据加一个MIME类型。当web浏览器获取到服务器返回的对象时,会去查看相关的MIME类型,并进行相应的处理。
MIME类型存在于HTTP响应报文的响应头部信息里,它是一种文本标记,表示一种主要的对象类型和一个特定的子类型。常见的MIME类型:
(1)终端客户在web浏览器地址栏输入访问地址http://www.ceshi.com:80/index.html
(2)web浏览器请求DNS服务器把域名www.ceshi.com解析成web服务器的IP地址
(3)web浏览器将端口号(默认是80)从访问地址(URL)中解析出来
(4)web浏览器通过解析后的ip地址及端口号与web服务器之间建立一条TCP连接
(5)建立TCP连接后,web浏览器向web服务器发送一条HTTP请求报文
(6)web服务器响应并读取浏览器的请求信息,然后返回一条HTTP响应报文。
(7)web服务器关闭HTTP连接,关闭TCP连接,web浏览器显示访问的网站内容到屏幕上。
第一步:创建网页文件根目录,通常创建在/www/https/目录下的index.html中。
[root@localhost ~]# yum install httpd -y #linux上面实现网页服务器需要Apache这套服务器软件,httpd提供Apache主程序。
[root@bogon /]# mkdir -p /www/https/
[root@bogon /]# cd /www/https
[root@bogon https]# ll
total 4
-rw-r--r--. 1 root root 12 Nov 29 11:46 index.html
[root@bogon https]# vim /www/https/index.html
hello world!
第二步:由于系统先读取主要配置文件,后读取额外配置文件。所以可以通过创建额外配置文件让系统读入到主配置文件当中。定义基于ip地址来访问网站的配置文件
[root@bogon https]# vim /etc/httpd/conf.d/myhost.conf
<Directory "/www/https">
AllowOverride none
Require all granted
</Directory>
#listen 80
<VirtualHost 192.168.58.129:80>
DocumentRoot "/www/https"
ServerName 192.168.58.129
</VirtualHost>
第三步:进入浏览器验证
注意:验证只前要想可以访问到http需要关闭系统防火墙。以及安全上下文。
要求:该网站ip地址的主机位为100,设置DocumentRoot为/www/ip/100,网页内容为:this is 100。
第一步:添加ip
[root@bogon https]# nmcli connection modify ens160 +ipv4.addresses 192.168.58.100/24 ipv4.gateway 192.168.58.2 ipv4.method manual connection.autoconnect yes
[root@bogon https]# nmcli connection up ens160
第二步:创建两个网页文件根目录,并定义网页内容
[root@bogon ~]# mkdir -p /www/https/ip100
[root@bogon ~]# echo "This is 100" >/www/https/ip100/index.html
[root@bogon ~]# setenforce 0
[root@bogon ~]# getenforce
Permissive
第三步:定义基于ip地址来访问网站的配置文件
[root@bogon ~]# vim /etc/httpd/conf.d/myhost.conf
<Directory /www/https/ip100>
AllowOverride none
Require all granted
</Directory>
<VirtualHost 192.168.58.100:80>
DocumentRoot "/www/https/ip100"
ServerName 192.168.58.100
</VirtualHost>
要求:1、建立一个使用web服务器默认端口的网站,设置DocumentRoot为/www/port/80,网页内容为:the port is 80。
2、建立一个使用10000端口的网站,设置DocumentRoot为/www/port/10000,网页内容为:the port is 10000。
第一步:创建两个网页文件根目录,并定义网页内容
[root@bogon ~]# mkdir -p /www/port/{80,10000}
[root@bogon ~]# echo The port is 80 > /www/port/80/index.html
[root@bogon ~]# echo The port is 10000 > /www/port/10000/index.html
第二步:定义基于不同端口来访问网站的配置文件
<Directory /www/port/80>
AllowOverride none
Require all granted
</Directory>
<VirtualHost 192.168.58.100:80>
DocumentRoot "/www/port/80"
ServerName 192.168.58.100
</VirtualHost>
<Directory /www/port/10000>
AllowOverride none
Require all granted
</Directory>
Listen 10000
<VirtualHost 192.168.58.100:10000>
DocumentRoot "/www/port/10000"
ServerName 192.168.58.100
</VirtualHost>
第三步:结果
[root@bogon ~]# curl 192.168.58.100:10000
The port is 10000
[root@bogon ~]# curl 192.168.58.100
The port is 80
要求:1、新建一个网站,域名为www.ceshi.com,设置DocumentRoot为/www/https,网页内容为hello world!。
第一步:创建网页文件根目录,并定义网页内容
[root@bogon /]# mkdir -p /www/https/
[root@bogon /]# cd /www/https
[root@bogon https]# ll
total 4
-rw-r--r--. 1 root root 12 Nov 29 11:46 index.html
[root@bogon https]# vim /www/https/index.html
hello world!
第二步:定义基于域名访问的网站的配置文件
[root@bogon ~]# vim /etc/httpd//conf.d/myhost.conf
<Directory "/www/https">
AllowOverride none
Require all granted
</Directory>
#listen 80
<VirtualHost 192.168.58.129:80>
DocumentRoot "/www/https"
ServerName 192.168.58.129
ServerAlias www.ceshi.com
</VirtualHost>
第三步:验证结果
注意:电脑验证结果时候,由于浏览器的缓存中没有dns域名缓存,所以需要在电脑本地dns缓存中添加对应缓存。
添加文件位置:C:\Windows\System32\drivers\etc\hosts(末尾添加)
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer 或 Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的HTTP通道。HTTPS并不是一个新协议,而是HTTP+SSL(TLS)。原本HTTP先和TCP(假定传输层是TCP协议)直接通信,而加了SSL后,就变成HTTP先和SSL通信,再由SSL和TCP通信,相当于SSL被嵌在了HTTP和TCP之间。
超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。
SSL 是“Secure Sockets Layer”的缩写,中文叫做“安全套接层”。它是在上世纪90年代中期,由网景公司设计的。到了1999年,SSL 应用广泛,已经成为互联网上的事实标准。IETF 就把SSL 标准化。标准化之后SSL被改为 TLS(Transport Layer Security传输层安全协议)。
SSL协议分为两层:
SSL记录协议 (SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能。
SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
(1)认证用户和服务器,确保数据发送到正确的客户机和服务器
(2)加密数据以防止数据中途被窃取
(3)维护数据的完整性,确保数据在传输过程中不被改变。
当你在浏览器的地址栏上输入https开头的网址后,浏览器和服务器之间会在接下来的几百毫秒内进行大量的通信:
(1)客户端浏览器向服务器端发送如下信息:
1、客户端支持的SSL /TLS协议的版本号。
2、Cipher Suite(密钥算法套件)。
3、客户端产生的随机数,稍后用于生成"对话密钥"。
(2)服务器端向客户端发送如下信息:
1、确认使用的加密通信协议版本,如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
2、确认使用的加密方法。
3、服务器证书。
要使数字证书有用,它的结构必须采用一种可理解且可靠的形式,以便人们可以轻松地检索并理解证书内的信息。例如,护照采用这样一种结构:人们可以轻松地理解以前从未见过的那一类护照中的信息。同样,只要数字证书是标准化的,则无论颁发该证书的是哪个机构,人们都可以阅读并理解该证书。
S/MIME 标准规定:用于 S/MIME 的数字证书应遵守国际电信同盟 (ITU) X.509 标准。S/MIME 版本 3 明确要求数字证书应遵循 X.509 的第 3 版。由于 S/MIME 依赖于已建立的数字证书结构公认标准,因此 S/MIME 标准建立在该标准的发展之上,从而提高了它的认可度。
X.509 标准规定数字证书应包含标准化信息。具体地说,X.509 版本 3 证书包含下列字段:
版本号 证书所遵循的 X.509 标准的版本。
序列号 唯一标识证书且由证书颁发机构颁发的编号。
签名算法 CA用于对证书进行数字签名的hash算法。
颁发者名称 实际颁发该证书的证书颁发机构的标识。
有效期 数字证书保持有效的时间段,并包含起始日期和过期日期。
使用者名称 数字证书所有者的姓名。
使用者公钥信息 与数字证书所有者关联的公钥以及与该公钥关联的特定公钥算法。
颁发者唯一标识符 可以用来唯一标识数字证书颁发者的信息。
使用者唯一标识符 可以用来唯一标识数字证书所有者的信息。
扩充信息 与证书的使用和处理有关的其他信息。
证书颁发机构的数字签名 使用指纹算法中指定的HASH算法以及证书颁发机构的私钥进行加密的数字签名。
4、服务器生成的随机数,稍后用于生成"对话密钥"。
(3)客户端利用服务器传过来的信息验证服务器的合法性。如果合法性验证没有通过,通讯将断开;如果合法性验证通过,则可以知道认证服务器的公开密钥的是真实有效的数字证书认证机构,并且服务器的公开密钥是值得信赖的。(此处认证机关的公开密钥必须安全地转交给客户端。使用通信方式时,如何安全转交是一件很困难的事,因此,多数浏览器开发商发布版本时,会事先在内部植入常用认证机关的公开密钥。)
(4)客户端随机产生一个用于后面通讯的对称密钥,然后用服务器的公钥对其加密,然后将加密后的对称密钥传给服务器。
HASH:是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。Hash算法特别的地方在于它是一种单向算法,用户可以通过hash算法对目标信息生成一段特定长度的唯一hash值,却不能通过这个hash值重新获得目标信息。因此Hash算法常用在不可还原的密码存储、信息完整性校验等。
常见的HASH算法:MD2、MD4、MD5、HAVAL、SHA、SHA-1、HMAC、HMAC-MD5、HMAC-SHA1。
共享密钥加密(对称密钥加密):加密和解密使用相同密钥。
对称加密算法:DES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6和AES。
公开密钥加密(非对称密钥加密):公开密钥加密使用一对非对称的密钥。一把叫做私有密钥,一把叫做公开密钥。私有密钥不能让其他任何人知道,而公开密钥则可以随意发布,任何人都可以获得。使用此加密方式,发送密文的一方使用公开密钥进行加密处理,对方收到被加密的信息后,再使用自己的私有密钥进行解密。利用这种方式,不需要发送用来解密的私有密钥,也不必担心密钥被攻击者窃听盗走。
常见的非对称加密算法:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)。
CA:就是一个公认的公证单位,你可以自行产生一把密钥且制作出必要的证书数据并向CA单位注册,那么当客户端的浏览器在浏览时,该浏览器会主动向CA单位确认该证书是否为合法注册过,如果是,那么该次连接才会建立,如果不是,浏览器会发出警告信息,告知用户应避免建立连接。所以说,如此一来WWW服务器不但有公证单位的证书,用户在建立连接时也比较有保障。
认证服务器:浏览器内置一个受信任的CA机构列表,并保存了这些CA机构的证书。第一阶段服务器会提供经CA机构认证颁发的服务器证书,如果认证该服务器证书的CA机构,存在于浏览器的受信任CA机构列表中,并且服务器证书中的信息与当前正在访问的网站(域名等)一致,那么浏览器就认为服务端是可信的,并从服务器证书中取得服务器公钥,用于后续流程。否则,浏览器将提示用户,根据用户的选择,决定是否继续。当然,我们可以管理这个受信任CA机构列表,添加我们想要信任的CA机构,或者移除我们不信任的CA机构。
协商会话密钥:客户端在认证完服务器,获得服务器的公钥之后,利用该公钥与服务器进行加密通信,协商出两个会话密钥,分别是用于加密客户端往服务端发送数据的客户端会话密钥,用于加密服务端往客户端发送数据的服务端会话密钥。在已有服务器公钥,可以加密通讯的前提下,还要协商两个对称密钥的原因,是因为非对称加密相对复杂度更高,在数据传输过程中,使用对称加密,可以节省计算资源。另外,会话密钥是随机生成,每次协商都会有不一样的结果,所以安全性也比较高。
加密通讯:此时客户端服务器双方都有了本次通讯的会话密钥,之后传输的所有Http数据,都通过会话密钥加密。这样网路上的其它用户,将很难窃取和篡改客户端和服务端之间传输的数据,从而保证了数据的私密性和完整性。
PKI(Public Key Infrastructure):公钥基础设施是提供公钥加密和数字签名服务的系统或平台,目的是为了管理密钥和证书。一个机构通过采用PKI 框架管理密钥和证书可以建立一个安全的网络环境。PKI 主要包括四个部分:X.509 格式的证书(X.509 V3)和证书废止列表CRL(X.509 V2);CA 操作协议;CA 管理协议;CA 政策制定。
X.509通用的证书格式包含三个文件:key,csr,crt。
key是私钥文件。
csr是证书签名请求文件,用于提交给证书颁发机构(CA)对证书签名。
crt是由证书颁发机构(CA)签名后的证书,或者是开发者自签名的证书,包含证书持有人的信息,持有人的公钥,以及签署者的签名等信息。
第一步:写入网页文件
[root@localhost /]# vim /www/https/index.html
welcome access web!
~
第二步:定义配置文件
[root@localhost ~]# yum install mod_ssl -y #mod_ssl是一种以openssl 的工具箱为基础专门为apache webserver 提供密码保护的软件。
[root@localhost ~]vim /etc/httpd/conf.d/host.conf
Directory "/www/https">
AllowOverride none
Require all granted
#Listen 443
</Directory>
#listen 443
<VirtualHost 192.168.58.200:443>
DocumentRoot "/www/https"
ServerName 192.168.58.200
SSLEngine on
SSLProtocol all -SSLv3
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA #密码套件,列出允许客户端协商的密码。
SSLCertificateFile /etc/pki/tls/certs/localhost.crt #指定CA证书路径,local.host文件不需要创建,这个文件httpd服务执行后会自己写入。
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key #指定公钥密钥文件路径
</VirtualHost>
第一步:创建用户认证密码,以及用户名。
[root@localhost /]# htpasswd -c /etc/httpd/mima mima
New password:
Re-type new password:
Adding password for user mima
第二步:创建访问网页文件
[root@localhost ~]# mkdir -p /www/https
[root@localhost ~]# echo hahahaha > /etc/https/index.html
第三步:写入配置文件
<Directory /www/https>
authtype basic
authname "please login:"
authuserfile "/etc/httpd/mima"
require user mima
</Directory>
#Listen 80
<VirtualHost 192.168.58.200:80>
alias "/mimi" "/www/https"
servername 192.168.58.200
</VirtualHost>
~
CGI接口标准包括标准输入、环境变量、标准输出三部分:
标准输入:CGI程序像其他可执行程序一样,可通过标准输入(stdin)从服务器获取到输入信息,比如Form中的数据,
这就是所谓的向CGI程序传递数据的POST方法。这意味着在操作系统命令行状态可执行的CGI程序,对CGI程序进行调试。POST方法是常用的方法。是从服务器来的会把HTTP请求Request
的Header
头设置成CGI程序的环境变量HTTP请求的Body
正文设置成CGI程序的标准输入
**环境变量:**操作系统提供了许多环境变量,他们定义了程序的执行环境,应用程序可以存取他们,Web服务器和CGI接口又定义了自己的一些环境变量,用来向CGI程序传递一些重要的参数。CGI的GET方法还通过环境变量QUERY-STRING向CGI传递:
FORM表单数据。
标准输出: CGI程序通过标准输出(stdout)将输出信息传送给Web服务器。传送给Web服务器的信息可以用各种格式。
第一步:创建一个cgi的目录: /www/cgi,在这个目录下创建一个cgi程序。
[root@localhost ~]mkdir -p /www/cgi #这里注意需要修改目录权限 chmod +d /www/cgi
vim test.cgi
#!/bin/bash
printf "Context-type:text/html\n\n"
printf "Hello World for CGI"
第二步:配置目录权限(让这个目录具有可执行cgi权限的权限,设定cgi的后缀名)
<Directory "/www/cgi">
AllowOverride none
Options +ExecCGI
AddHandler cgi-script .cgi .py .pl
require all granted
</Directory>
第三步:设置虚拟主机(执行cgi程序的虚拟目录)
<VirtualHost 192.168.58.200:8001>
ScriptAlias "/cgi/" "/www/cgi/"
ServerName 192.168.58.200
</VirtualHost>