问题:在浏览器中输入www.baidu.com之后发生了什么?
1.把www.baidu.com解析成ip-> 域名解析
a.计算机查看浏览器的dns缓存,如果没有则b
b.计算机的dns本地服务器,如果没有则c (此时开始从根目录开始依次询问)
c.先去请求根服务器——> www.bai.com——> .com的域名服务器在哪儿?
d.本地dns再去请求.com域名服务器——> baidu域名服务器在哪儿?
e.本地dns再去请求baidu域名服务器——> www域名服务器在哪儿?
f.本地dns去请求www服务器——> 如果www域名服务器,有这个ip返回给你,如果没有,未能解析
2. 进行tcp连接: 三次握手
3. 发送http请求(http/https)
4. 获取响应
5. 浏览器进行渲染解析
6. 断开连接的时候: tcp四次挥手
超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。
HTTPS并不是一个新协议,而是HTTP+SSL。原本HTTP和TCP组合通信,而加了SSL后,就变成HTTP先和SSL通信,再由SSL和TCP通信,相当于SSL被嵌在了HTTP和TCP之间。
SSL协议:
①SSL记录协议 (SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能。
②SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
SSL协议提供的服务:①认证用户和服务器,确保数据发送到正确的客户端和服务端②加密数据以防止数据中途被窃取③维护数据的完整性,确保数据在传输过程中不被改变。
过程:
首先客户端向服务端发送请求:
①客户端支持的协议版本号
②客户端支持的加密算法(密钥,算法)
③客户端产生随机数random_client_num1
然后服务端在收到客户端发来的请求后回复:
①服务端发送协商好的协议版本
②服务端发送协商好的加密算法
③服务端发送服务器证书AC
④服务器产生随机数random_server_num1
客户端在接受服务端发送到数据后:
首先验证服务器证书AC合法性,如果不合法,通讯断开;如果合法,则可以从服务器证书中获取到公开的密钥。然后客户端通过证书里面的公钥产生一个对称密钥,然后用服务器公钥进行加密,并加密后的对称密钥传给服务器。
此时,服务端接受到客户端发来的对称密钥:
服务端通过用自己的私钥对客户端发来的对称密钥进行解密,并使用对称密钥进行文件传输。
SSL四次握手的具体过程:
第一阶段: 此时客户端向服务端发送ClientHello包,服务端回复一个SeverHello包,此时客户端产生一个随机数client_null(这个阶段是客户端和服务端通信为hello包)
第二阶段:此时服务端为唯一发送方,向客户端发送AC证书及其根连接发送给客户端,服务端会产生一个随机数server_null(Certificate[证书],Server Key Exchange[公钥],Certificate Request[验证客户端证书请求] 和ServerHello Done[hello结束])
第三阶段:客户端成为这个阶段的唯一发送方,服务端成为唯一接收方。客户端在接受服务端发来的信息交流过程中产生第三个随机数:pre_master,这个随机数是根据服务端(根据公钥产生的对称密钥)和客户端产生的client_num和server_num通过密钥交换算法产生的。客户端将pre_master和产生这个随机数的对称密钥发给服务器。(此时客户和服务端都掌握三个随机数,利用相同算法算出main_master--->这就是对称密钥)
第四阶段:此时服务端通过对称密钥将自己的算出的随机数发送给客户端,并达成SSL四次握手
关于AC证书:
搭建静态https的服务器:
//①使用yum下载文件包,进行httpd文件安装
[root@localhost ~]# yum install mod_ssl -y
//②配置创建连接的index.html文件(访问的目录)
[root@localhost www]# mkdir -pv https
[root@localhost www]# cd /www/https/
[root@localhost https]# vim index.html
// vim编辑index的文件
This is my first https page
//③配置更改阿帕奇登录页面的权限设置
[root@localhost certs]# cd /etc/httpd/conf.d
autoindex.conf host.conf README ssl.conf userdir.conf welcome.conf
[root@localhost conf.d]# vim host.conf
//<Directory>为分配权限 (文件位置,允许人,给予权限)
<Directory "/www/https">
AllowOverride none
Require all granted
</Directory>
//监听这个ip地址下的443端口
#listen 443
// <VirtualHost>配置虚拟机(文档位置,服务名,ssl服务引擎打开,协议选择,密码选择套件,认证证书(公钥,信息),配置私钥)
<VirtualHost 192.168.220.132:443>
DocumentRoot "/www/https"
ServerName 192.168.220.132
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
#证书
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
#密钥
</VirtualHost>
[root@localhost conf.d]# systemctl stop firewalld
//刷新,关闭防火墙,设置可信任
[root@localhost conf.d]# setenforce 0
[root@localhost conf.d]# systemctl restart httpd
这个时候去访问(https://192.168.220.132显示为一个不安全的连接(原因:自己搭建的服务器没有获得AC认证))
基于https协议下搭建一个访问需要验证的网页:
//由于之前已经ym配置好centos
//首先设置密码和密码文件位置
[root@localhost usr]# htpasswd -c /usr/local/etc/passwords test
//passwd:123456
[root@localhost usr]# mkdir -pv /usr/local/mysecret
[root@localhost usr]# echo "My secret" >> /usr/local/mysecret/index.html
//转到密码文件的index.html 并将passwords存放在mysecret下
[root@localhost usr]# cd /etc/httpd/conf.d
[root@localhost usr]# vim host.conf
//设置为监听8001端口
listen 8001
<Directory "/usr/local/mysecret">
AuthType Basic
AuthName "Hello"
AuthBasicProvider file
AuthUserFile "/usr/local/etc/passwords"
Require user test
</Directory>
<VirtualHost "192.168.220.132:8001">
alias "/mysecret" "/usr/local/mysecret"
ServerName 192.168.220.132
</VirtualHost>
//alias为一个转移符,将如果访问文件"/mysecret",则会转移到"/usr/local/mysecret"
[root@localhost conf.d]# systemctl stop firewalld
//刷新,关闭防火墙,设置可信任
[root@localhost conf.d]# setenforce 0
[root@localhost conf.d]# systemctl restart httpd
//此时可能会报错,需要修改文件的权限/usr/local/mysecret(chown +x /usr/local/mysecret)
此时如果需要访问这个带密码的文档时,需要在ip地址后加上端口号和这个文件位置 /mysecret
基于https协议下搭建一个CGI访问的网页(动态页面):
WSGI(Web Server Gateway Interface)是一个统一的Python接口标准(PEP 3333),该标准描述了Python应用如何与Web服务器通信,多个Python应用之间如何级联以处理请求。
//首先配置cgi的文件
[root@localhost ~]# mkdir -p /www/cgi
[root@localhost ~]# cd /www/cgi
//在cgi文件内写入内容
[root@localhost ~]# vim cgi
#!/bin/bash
printf "Context-type:text/html\n\n"
printf "Hello World for CGI"
[root@localhost ~]# cd /etc/httpd/conf.d
[root@localhost conf.d]# vim host.conf
<Directory "/www/cgi">
AllowOverride none
Options +ExecCGI
AddHandler cgi-script .cgi .py .pl
require all granted
</Directory>
listen 8002
<VirtualHost 192.168.233.200:8002>
ScriptAlias /cgi /www/cgi
ServerName 192.168.233.200
</VirtualHost>
[root@localhost conf.d]# chown +x /www/cgi
//给予执行权限
[root@localhost conf.d]# systemctl stop firewalld
//刷新,关闭防火墙,设置可信任
[root@localhost conf.d]# setenforce 0
[root@localhost conf.d]# systemctl restart httpd
练习:
//搭建一个基于https://www.zuoye.com:4443访问的web网站
//网站首页在/www/https/,内容为zuoye
//首先产生密钥和AC证书(地址在/etc/httpd/conf.d下)
[root@lxb conf.d]# openssl genrsa -aes128 2048 >1.key
Generating RSA private key, 2048 bit long modulus (2 primes)
..........................................+++++
................................................................+++++
e is 65537 (0x010001)
Enter pass phrase:
Verifying - Enter pass phrase:
//创建AC证书
[root@lxb conf.d]# openssl req -utf8 -new -x509 -key 1.key -out 1.crt
Enter pass phrase for 1.key:
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]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:
//此时证书为1.crt,密钥为1.key.然后去配置文件
[root@lxb conf.d]# vim host2.conf
listen 4443
<virtualhost 192.168.220.250 >
SSLEngine on
SSLCertificateFile /etc/httpd/conf.d/1.crt
SSLCertificateKeyFile /etc/httpd/conf.d/1.key
DocumentRoot /www/https
ServerName 192.168.220.250
</virtualhost>
<directory /www/https>
allowoverride none
require all granted
</directory>
//然后去配置/www/https的文件
[root@lxb / ]# cd /www/https
[root@lxb https]# echo zuoye > index.html
//然后重启服务(此时要输入密钥)
[root@lxb conf.d]# systemctl restart httpd
Enter TLS private key passphrase for 192.168.220.251:443 (RSA) : ****
//连接192.168.220.250:4443
[root@lxb conf.d]# curl https://192.168.220.250:4443 -k
zuoye
//而此时需要在window上产生物理缓存
C:\Windows\System32\drivers\etc\hosts
192.168.220.250 www.zuoye.com
此时再次登录,发现实现登录