1 、 web服务器简介
( 1 )什么是 www
www 是 world wide web 的缩写,也就是全球信息广播的意思。通常说的上网就是使用 www 来查询用户所需要的信息。www 可以结合文字、图形、影像以及声音等多媒体,并通过可以让鼠标单击超链接的方式将信息以Internet 传递到世界各处去。
与其他服务器类似,当你连接上 www 网站,该网站肯定会提供一些数据,而你的客户端则必须要使用可以解析这些数据的软件来处理,那就是浏览器。www 服务器与客户端浏览器之间的连接图。
1 、 www 所用的协议: 浏览器怎样向 web 服务器请求数据以及服务器怎样把文档传送给浏览器呢?这就是由http 协议来定义的,( Hyper Text Transport Protocol , HTTP ,超文本传输协议)。2 、 www 服务器需要提供可让客户端浏览的平台。目前最主流的 Web 服务器是 Apache 、 Microsoft 的Internet信息服务器( Internet Information Services , IIS )和 unix nginx 。3 、服务器所提供的最主要数据是超文本标记语言( Hyper Text Markup Language , HTML )、多媒体文件(图片、影像、声音、文字等,都属于多媒体或称为超媒体),HTML 只是一些纯文本数据,通过所谓的标记来规范所要显示的数据格式。4 、客户端收到服务器的数据之后需要软件解析服务器所提供的数据,最后将效果呈现在用户的屏幕上。那么著名的浏览器就有内建在Windows 操作系统内的 IE 浏览器了,还有 Firefox 浏览器和 Google 的chrome浏览器。
( 2 )网址及 HTTP 简介
web服务器提供的这些数据大部分都是文件,那么我们需要在服务器端先将数据文件写好,并且放置在。某个特殊的目录下面,这个目录就是我们整个网站的首页,
在 nginx中,这个目录默认在/usr/share/nginx/html/。
浏览器是通过你在地址栏中输入你所需要的网址来取得这个目录的数据的。
URL:Uniform Resource Locator,统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。
网址格式: < 协议 >://< 主机或主机名 >[:port]/< 目录资源 , 路径 >
1.浏览器常支持的协议有: http 、 https 、 ftp 等。
2.主机地址或者主机名:主机地址就是服务器在因特网所在的 IP 地址。如果是主机名的话,那么
就需要域名解析了。
3.端口号( port ): http 为 80 , https 为 443 ( IANA :互联网数字分配机构)
0-1023:众所周知,永久地分配给固定的应用程序使用,特权端口(只有管理员有权限
启用并让进程监听)
1024-41951:亦为注册端口,但要求不是特别严格,分配给程序注册为某应用使用:
3306/TCP
41952-60000:客户端程序随机使用的端口,动态端口,或私有端口
http 请求方法:在 http 通信中,每个 http 请求报文都包含一个方法,用以告诉 web 服务器端需要执
行哪些具体的动作,这些动作包括:获取指定 web 页面、提交内容到服务器、删除服务器上资源文
件等。
| 序号 | 方法 | 描述 |
| 1 | GET | 请求指定的页面信息,并返回实体主体 |
| 2 | HEAD | 类似于get请求,只不过返回的响应中没有具体的内容用于获取报头 |
| 3 | POST | 向指定资源提交数据处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源修改。 |
| 4 | PUT | 从客户端向服务器传送的数据取代指定的文档内容 |
| 5 | DELETE | 请求服务器删除指定页面 |
| 6 | CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器 |
| 7 | OPTIONS | 允许客户端查看服务器的性能 |
| 8 | TRACE | 会显示服务器收到的请求,主要用于测试或诊断 |
状态代码:由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。
1xx:指示信息 —— 表示请求已接收,继续处理
2xx:成功 —— 表示请求已被成功接收、理解、接受
3xx:重定向 —— 要完成请求必须进行更进一步的操作
4xx:客户端错误 —— 请求有语法错误或请求无法实现
5xx:服务器端错误 —— 服务器未能实现合法的请求
常见状态代码、状态描述的说明如下:
200 OK :客户端请求成功400 Bad Request :客户端请求有语法错误,不能被服务器所理解401 Unauthorized :请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用403 Forbidden :服务器收到请求,但是拒绝提供服务404 Not Found :请求资源不存在,举个例子:输入了错误的 URL500 Internal Server Error :服务器发生不可预期的错误503 Server Unavailable :服务器当前不能处理客户端的请求,一段时间后可能恢复正常
HTTP 报文: http 报文中有很多行内容,这些行的字段内容都是由一些 ASCII 码串组成,但各个字段
的长度是不同的。 http 报文可分为两种,一种是从 web 客户端发往 web 服务器的 http 报文,称为请
求报文。另外一种是从 web 服务器发往 web 客户端的报文,称为响应报文 。
http请求报文由请求行、请求头部、空行和请求报文主体几个部分组成
| 报文格式 | 报文信息 | 说明 |
| 请求行 | 请求方法 URL 协议版本 | 请求行是请求报文的第一行,用来说明客户端想要做什么 |
| 请求头 | 字段名 1 :值 1 字 段名 2 :值 2 …… | Accept:image/gif,image/jpeg 媒体类型 Accept-Language:zh-cn 语言类型 Accept-Encoding:gzip,deflate 支持压缩 User-Agent:Mozilla/4.0(compatible:MSIE6.0;WindowsNT;……) 客户端类型 Host: www.ceshi.com 主机名 |
| 空行 | 空白无内容 | 通知 web 服务器空行以下不会有请求头部的信息了 |
| 请求报文主题 | GET 方法没有请求 报文主体, POST 方法才有 | 请求报文主体中包括了要发送给 web 服务器的数据信息。 请求报文主体不会应用于 http 的 GET 命令方法,而是应用 于 post 方法。 |
http 响应报文由起始行、响应头部、空行和响应报文主体这几个部分组成
| 报文格式 | 报文信息 | 说明 |
| 起始行 | 协议及版本号数字状态码状态信息 | 用来说明服务器响应客户端请求的状况,例如: HTTP/1.1 200 OK |
| 响应头部 | 字段名 1 :值 1 字段名2 :值 2 | 常见的头部信息: Content-Length: 81 说明响应主体的长 度 Content-Type: text/html; charset=UTF-8 说明文档的 MIME 类型 |
| 空行 | 空白无内容 | 通知客户端空行以下无头部信息了 |
| 响应报文主体 | 响应报文主体中装载了要返回给客户端的数据,这些数据可以是文本,也可以是二进制的(如图片,视频)。 |
MIME ( Multipurpose Internet Mail Extension ,多用途因特网邮件扩展)最初是为了解决在不同
的电子邮件系统之间搬移报文时存在的问题。后来 http 也支持了这个功能,用它来描述数据并标记
不同的数据内容类型。
当 web 服务器响应 http 请求时,会为每一个 http 对象数据加一个 MIME 类型。当 web 浏览器获取到
服务器返回的对象时,会去查看相关的 MIME 类型,并进行相应的处理。
MIME 类型存在于 HTTP 响应报文的响应头部信息里,它是一种文本标记,表示一种主要的对象类型和一个特定的子类型。常见的MIME 类型:
| MIME 类型 | 文件类型 |
| text/html | html 、 htm 、 shtml 文本类型 |
| text/css | css 文本类型 |
| text/xml | xml 文本类型 |
| image/gif | gif 图像类型 |
| image/jpeg | jpeg 、 jpg 图像类型 |
| application/javascript | js 文本类型 |
| text/plain | txt 文本类型 |
| application/json | json 文本类型 |
| video/mp4 | mp4 视频类型 |
| video/quicktime | mov 视频类型 |
| video/x-flv | flv 视频类型 |
| video/x-ms-wmv | wmv 视频类型 |
| video/x-msvideo | avi 视频类 |
( 3 ) http 协议请求的工作流程
( 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 浏览器显示访问的网站内容到屏幕上。
2 、 web 服务器的类型
( 1 )仅提供用户浏览的单向静态网页
单纯是由服务器单向提供数据给客户端, Server 不需要与 client 端有互动,所以你可以到该网站上去浏览,但是无法进行数据的上传。
( 2 )提供用户互动接口的动态网站
这种类型的网站可以让服务器与用户互动,常见的例如留言板,博客。这种类型的网站需要通过 “ 网页程序语言” 来实现与用户互动的行为。常见的例如: PHP 网页程序语言,配合数据库系统来进行数据的读、写。当你在向服务器请求数据时,其实是通过服务器端同一个网页程序在负责将数据读出或写入数据库,变动的是数据库的内容,网页程序并没有任何改变。
另外一种交互式的动态网页主要是在客户端实现。服务端将可执行的程序代码( JavaScript )传送给客户 端,客户端的浏览器如果提供 JavaScript 的功能,那么该程序就可以在客户端的计算机上面工作了;另外一种可在客户端执行的就是flash 动画格式,在这种动画格式内还可以进行程序设计。
搭建动态网站的需求:
LAMP ( linux+Apache+MySQL+PHP )lnmp ( linux+nginx+Mysql+php )Apache 主要提供 www 的服务器平台MySQL :传统的文件读取是很麻烦的,如果你只要读取该文件当中的一小部分,系统还是会将整个文件读出来,若又有人同时读取同一个文件时,那就会造成效率与系统上的问题,所以才会有数据库系统的推出。数据库其实是一种特殊格式的文件,这种文件要通过特殊接口(数据库软件)来进行读写。由于这个特殊接口已经针对数据的查询、写入做过优化设计,因此很适合多人同时写入与查询工作。PHP : PHP 可以被用来建立动态网页, PHP 程序代码可以直接在 HTML 网页当中嵌入,就像编辑HTML网页一样简单。 PHP 是一种 “ 程序语言 ” ,这种程序语言可以直接在网页当中编写,不需要经过编译即可执行。
3、web服务器基本配置
服务器端:此处使用nginx提供web服务,RPM包获取:http://nginx.org/packages/
[root@localhost ~]# dnf install nginx -y
[root@localhost ~]# nginx -v
[root@localhost ~]# nginx -V
[root@localhost ~]# rpm -ql nginx
[root@localhost httpd]# tree /etc/nginx
[root@localhost ~]# tree /etc/nginx/
/etc/nginx/
├── conf.d #子配置文件目录
├── default.d
├── fastcgi.conf
├── fastcgi.conf.default
├── fastcgi_params #用以翻译nginx的变量供php识别
├── fastcgi_params.default
├── koi-utf
├── koi-win
├── mime.types #用以配置支持的媒体文件类型
├── mime.types.default
├── nginx.conf #主配置文件
├── nginx.conf.default
├── scgi_params
├── scgi_params.default
├── uwsgi_params #用以配置nginx的变量供python识别
├── uwsgi_params.default
└── win-utf
[root@localhost ~]# tree /usr/share/nginx/html/ #默认的nginx网站根目录
[root@localhost ~]# tree /var/log/nginx/ #nginx的日志文件所在目录
#nginx服务主配置文件nginx.conf的结构
[root@localhost nginx]# grep ^[^#] /etc/nginx/nginx.conf
=========全局配置(无{}标志)=======================
user nginx; #进程所属用户
worker_processes auto; #worker数量
error_log /var/log/nginx/error.log; #错误日志存放路径
pid /run/nginx.pid; #pid文件路径
include /usr/share/nginx/modules/*.conf; #include导入的功能模块配置文件
=========全局配置(无{}标志)=======================
==========性能配置(有{}标志)=================
events {
worker_connections 1024; #TCP连接数
}
==========性能配置(有{}标志)=================
=========http模块配置(有{}标志)==================
http { #http区块开始
log_format main '$remote_addr - $remote_user [$time_local] "$request"
'
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'; #错误日
志格式
access_log /var/log/nginx/access.log main; #访问日志路径
sendfile on; #开启高效文件传输模式
tcp_nopush on; #性能优化参数
tcp_nodelay on; #性能优化参数
keepalive_timeout 65; #持久连接时间或超时时间
types_hash_max_size 4096; #性能优化参数
include /etc/nginx/mime.types; #可解析的静态资源类型
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf; #子配置文件存放路径
server { #server区块开始
listen 80; #监听端口
listen [::]:80;
server_name _; #服务器的名字
root /usr/share/nginx/html; #主页存放路径
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf; #子配置文件存放路径
error_page 404 /404.html; #404错误返回的页面
location = /40x.html { #使用location定义用户请求的uri
}
error_page 500 502 503 504 /50x.html; #500、502、503、504返回的页面
location = /50x.html {
}
} #server区块结束
} #http区块结束
=========http模块配置(有{}标志)==================
[root@localhost ~]#systemctl disable firewalld --now
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce
Permissive
[root@localhost ~]# systemctl restart nginx
#测试可以使用curl命令访问web服务器或者使用浏览器访问
[root@localhost ~]# curl -I localhost
HTTP/1.1 200 OK
Server: nginx/1.21.5
Date: Fri, 17 Nov 2023 08:40:28 GMT
Content-Type: text/html
Content-Length: 3510
Last-Modified: Mon, 23 Oct 2023 15:48:29 GMT
Connection: keep-alive
ETag: "653695cd-db6"
Accept-Ranges: bytes
4 、虚拟主机配置实战
4.1 搭建静态网站 —— 基于 http 协议的静态网站
实验1:搭建一个web服务器,访问该服务器时显示“hello world”欢迎界面 。
[root@localhost ~]# echo "hello world" > /usr/share/nginx/html/index.html
[root@localhost ~]# curl localhost
hello world
[root@localhost ~]# curl 192.168.168.153
hello world
实验2:建立两个基于ip地址访问的网站,要求如下
该网站ip 地址的主机位为 100 ,设置首页目录为 /www/ip/100 ,网页内容为: this is 100 。
该网站ip 地址主机位为 200 ,设置首页目录为 /www/ip/200 ,网页内容为: this is 200 。
#添加ip地址
[root@localhost ~]# nmcli connection modify ens33 +ipv4.addresses
192.168.168.100/24 +ipv4.gateway 192.168.168.2 ipv4.dns 114.114.114.114
ipv4.method manual autoconnect yes
[root@localhost ~]# nmcli connection modify ens33 +ipv4.addresses
192.168.168.200/24
[root@localhost ~]# nmcli connection up ens33#创建两个网页文件根目录,并定义网页内容
[root@localhost ~]# mkdir -pv /www/ip/{100,200}
[root@localhost ~]# echo this is 100 > /www/ip/100/index.html
[root@localhost ~]# echo this is 200 > /www/ip/200/index.html
#设置selinux,必须设置,否则无法看到网页页面内容
[root@server html]# setenforce 0
[root@server html]# getenforce
Permissive#定义基于不同ip地址来访问网站的配置文件
#新建文件,写入如下配置
[root@localhost ~]# vim /etc/nginx/conf.d/test_ip.conf
server {listen 192.168.168.100:80;root /www/ip/100;location / {}
}
server {listen 192.168.168.200:80;root /www/ip/200;location / {}
}
[root@localhost ~]# systemctl restart nginx
[root@localhost ~]# curl 192.168.168.100
this is 100
[root@localhost ~]# curl 192.168.168.200
this is 200 实验 3 :建立两个基于不同端口访问的网站,要求如下:
建立一个使用web服务器默认端口的网站,设置网站首页目录为/www/port/80,网页内容为:the port is 80。
建立一个使用10000 端口的网站,设置网站首页目录为 /www/port/10000 ,网页内容为:the port is 10000。
[root@localhost ~]# mkdir -pv /www/port/{80,10000}
[root@localhost ~]# echo the port is 80 > /www/port/80/index.html
[root@localhost ~]# echo the port is 10000 > /www/port/10000/index.html
[root@localhost ~]# nmcli connection modify ens33 +ipv4.addresses
192.168.168.153/24
[root@localhost ~]# nmcli connection up ens33
[root@localhost ~]# cat /etc/nginx/conf.d/test_port.conf
server {listen 192.168.168.153:80;root /www/port/80;location / {}
}
server {listen 192.168.168.153:10000;root /www/port/10000;location / {}
}
[root@localhost ~]# systemctl restart nginx
[root@localhost ~]# curl 192.168.168.153:10000
the port is 10000
[root@localhost ~]# curl 192.168.168.153
the port is 80
实验 4 :建立两个基于域名访问的网站,要求如下:
新建一个网站,域名为 www.ceshi.com ,设置网站首页目录为 /www/name,网页内容为this is test。
新建一个网站,域名为 rhce.first.day ,同时可通过 ce.first.day访问,设置网站首页目录 为 /www/ce, 网页内容为: today is first day of class 。
基于域名的网站,需要用到域名解析。 域名 ------->ip 地址浏览器如何通过域名去查询 URL 对应的 IP (对应服务器地址):1 、浏览器缓存:浏览器会按照一定的频率缓存 DNS 记录。2 、操作系统缓存:如果浏览器缓存中找不到需要的 DNS 记录,那就去操作系统中的 hosts 文件找。hosts 是一个没有扩展名的系统文件,其作用就是将一些常用的网址域名与其对应的 IP 地址建立一个关联" 数据库 " ,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从 Hosts 文件中寻找对应的IP 地址,一旦找到,系统会立即打开对应网页,如果没有找到,则系统会再将网址提交 DNS 域名解析服务器进行 IP 地址的解析。windows 下的 hosts 文件路径: C:\Windows\System32\drivers\etc\hostsLinux下的 hosts 文件路径 :/etc/hosts3 、路由缓存:路由器也有 DNS 缓存。4 、 ISP 的 DNS 服务器: ISP 是互联网服务提供商 (Internet Service Provider) 的简称, ISP 有专门的DNS服务器应对 DNS 查询请求。5 、根服务器: ISP 的 DNS 服务器还找不到的话,它就会向根服务器发出请求,进行递归查询( DNS 服务器先问根域名服务器 .com 域名服务器的 IP 地址,然后再问 .com 域名服务器,依次类推)
[root@localhost conf.d]# nmcli connection modify ens33 +ipv4.addresses
192.168.168.154/24
[root@localhost conf.d]# nmcli connection up ens33
[root@localhost ~]# mkdir /www/{name,ce}
[root@localhost ~]# echo this is test > /www/name/index.html
[root@localhost ~]# echo today is first day of class > /www/ce/index.html
[root@localhost ~]# vim /etc/nginx/conf.d/test_servername.conf
server {
listen 192.168.168.154:80;server_name www.ceshi.com;root /www/name;location / {}
}
server {listen 192.168.168.154:80;server_name rhce.first.day ce.first.day;root /www/ce;location / {}
}
[root@localhost ~]# vim /etc/hosts
192.168.168.154 www.ceshi.com rhce.first.day ce.first.day
[root@localhost ~]# systemctl restart nginx
[root@localhost ~]# curl www.ceshi.com
this is test
[root@localhost ~]# curl rhce.first.day
today is first day of class
[root@localhost ~]# curl ce.first.day
today is first day of class
实验5:基于虚拟目录和用户控制的web网站
#虚拟目录实现
[root@localhost conf.d]# nmcli connection modify ens33 +ipv4.addresses
192.168.168.155/24
[root@localhost conf.d]# nmcli connection up ens33
[root@localhost ~]# vim /etc/nginx/conf.d/test_virtualdir.conf
server {listen 192.168.168.155:80;root /usr/share/nginx/html;location /real {alias /www/real;}
}
[root@localhost ~]# mkdir /www/real/
[root@localhost ~]# echo real-virtual > /www/real/index.html
[root@localhost ~]# systemctl restart nginx
[root@localhost ~]# curl 192.168.168.155/real/
real-virtual
#用户访问控制
[root@localhost ~]# vim /etc/nginx/conf.d/test_virtualdir.conf
server {listen 192.168.168.155:80;root /usr/share/nginx/html;location /real {alias /www/real;auth_basic on;auth_basic_user_file /etc/nginx/conf.d/auth-password;}
}
[root@localhost ~]# dnf install httpd-tools -y
[root@localhost ~]# htpasswd -cb /etc/nginx/conf.d/auth-password user1
123456
[root@localhost ~]# systemctl restart nginx
[root@localhost ~]# curl 192.168.168.155/real/
<html>
<head><title>401 Authorization Required</title></head>
<body>
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx/1.21.5</center>
</body>
</html>
[root@localhost ~]# curl 192.168.168.155/real/ -u user1
Enter host password for user 'user1':
real-virtual
[root@localhost ~]# curl user1:123456@192.168.168.155/real
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.21.5</center>
</body>
</html>
[root@localhost ~]# curl user1:123456@192.168.168.155/real/
real-virtual
4.2 搭建静态网站——基于https协议的静态网站
(1)https简介
超文本传输协议 HTTP 协议被用于在 Web 浏览器和网站服务器之间传递信息。 HTTP 协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web 浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP 协议不适合传输一些敏感信息,比如信用卡号、密码等。为了解决
HTTP 协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议 HTTPS 。
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 之间。
SSL 是 “Secure Sockets Layer” 的缩写,中文叫做 “ 安全套接层 ” 。它是在上世纪 90 年代中期,由网景公司设计的。到了1999 年, SSL 应用广泛,已经成为互联网上的事实标准。 IETF 就把 SSL 标准化。标准化之后SSL 被改为 TLS ( Transport Layer Security 传输层安全协议)。
SSL 协议分为两层:
1.SSL 记录协议 ( SSL Record Protocol ):它建立在可靠的传输协议(如 TCP )之上,为高层协议提供数据封装、压缩、加密等基本功能。
2.SSL 握手协议( SSL Handshake Protocol ):它建立在 SSL 记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
SSL 协议提供的服务:
1. 认证用户和服务器,确保数据发送到正确的客户机和服务器
2. 加密数据以防止数据中途被窃取
3. 维护数据的完整性,确保数据在传输过程中不被改变
( 2 ) https协议加密所使用的算法
HASH 是把任意长度的输入(又叫做预映射 pre-image )通过散列算法变换成固定长度的输出,该输出就是散列值。Hash 算法特别的地方在于它是一种单向算法,用户可以通过 hash 算法对目标信息生成一段特定长度的唯一hash 值,却不能通过这个 hash 值重新获得目标信息。因此 Hash 算法常用在不可还原的密码存储、信息完整性校验等。
常见的HASH 算法: MD2 、 MD4 、 MD5 、 HAVAL 、 SHA 、 SHA-1 、 HMAC 、 HMAC-MD5 、 HMACSHA1。
共享密钥加密(对称密钥加密):加密和解密使用相同密钥。
对称加密算法: DES 、 3DES 、 DESX 、 Blowfish 、 IDEA 、 RC4 、 RC5 、 RC6 和 AES 。
公开密钥加密(非对称密钥加密):公开密钥加密使用一对非对称的密钥。一把叫做私有密钥,一把叫做公开密钥。私有密钥不能让其他任何人知道,而公开密钥则可以随意发布,任何人都可以获得。使用此加密方式,发送密文的一方使用公开密钥进行加密处理,对方收到被加密的信息后,再使用自己的私有密钥进行解密。利用这种方式,不需要发送用来解密的私有密钥,也不必担心密钥被攻击者窃听盗走。
常见的非对称加密算法: RSA 、 ECC (移动设备用)、 Diffie-Hellman 、 El Gamal 、 DSA (数字签名用)。
但由于公开密钥比共享密钥要慢,所以我们就需要综合一下他们两者的优缺点,使他们共同使用,而这也是HTTPS 采用的加密方式。在交换密钥阶段使用公开密钥加密方式,之后建立通信交换报文阶段则使用共享密钥加密方式。
如何证明公开密钥本身是货真价实的公开密钥?如,正准备和某台服务器建立公开密钥加密方式下的通信时,如何证明收到的公开密钥就是原本预想的那台服务器发行的公开密钥。或许在公开密钥传输过程中,真正的公开密钥已经被攻击者替换掉了。这个时候就需要第三方公证单位来帮忙啦。
CA 就是一个公认的公证单位,你可以自行产生一把密钥且制作出必要的证书数据并向 CA 单位注册,那么当客户端的浏览器在浏览时,该浏览器会主动向CA 单位确认该证书是否为合法注册过,如果是,那么该次连接才会建立,如果不是,浏览器会发出警告信息,告知用户应避免建立连接。所以说,如此一来WWW服务器不但有公证单位的证书,用户在建立连接时也比较有保障。
(3)浏览器访问https网站的通信过程
客户端浏览器向服务器端发送如下信息
客户端支持的SSL /TLS 协议的版本号。
Cipher Suite(密钥算法套件)。
客户端产生的随机数,稍后用于生成" 对话密钥 " 。
服务器端向客户端发送如下信息
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 算法以及证书颁发机构的私钥进
行加密的数字签名。
服务器生成的随机数,稍后用于生成 " 对话密钥 "
客户端利用服务器传过来的信息验证服务器的合法性。如果合法性验证没有通过,通讯将断开;如
果合法性验证通过,则可以知道认证服务器的公开密钥的是真实有效的数字证书认证机构,并且服
务器的公开密钥是值得信赖的。(此处认证机关的公开密钥必须安全地转交给客户端。使用通信方
式时,如何安全转交是一件很困难的事,因此,多数浏览器开发商发布版本时,会事先在内部植入
常用认证机关的公开密钥。)
客户端随机产生一个用于后面通讯的对称密钥,然后用服务器的公钥对其加密,然后将加密后的对
称密钥传给服务器。
HTTPS 的安全通信工作流程可大致分为三个阶段:
认证服务器 :浏览器内置一个受信任的 CA 机构列表,并保存了这些 CA 机构的证书。第一阶段服务器会提供经CA 机构认证颁发的服务器证书,如果认证该服务器证书的 CA 机构,存在于浏览器的受信任 CA 机构列表中,并且服务器证书中的信息与当前正在访问的网站(域名等)一致,那么浏览器就认为服务端是可信的,并从服务器证书中取得服务器公钥,用于后续流程。否则,浏览器将提示用户,根据用户的选择,决定是否继续。当然,我们可以管理这个受信任 CA 机构列表,添加我们想要信任的 CA 机构,或者移除我们不信任的CA 机构。
协商会话密钥 :客户端在认证完服务器,获得服务器的公钥之后,利用该公钥与服务器进行加密通信,协商出两个会话密钥,分别是用于加密客户端往服务端发送数据的客户端会话密钥,用于加密服务端往客户端发送数据的服务端会话密钥。在已有服务器公钥,可以加密通讯的前提下,还要协商两个对称密钥的原因,是因为非对称加密相对复杂度更高,在数据传输过程中,使用对称加密,可以节省计算资源。另外,会话密钥是随机生成,每次协商都会有不一样的结果,所以安全性也比较高。
加密通讯 :此时客户端服务器双方都有了本次通讯的会话密钥,之后传输的所有 http 数据,都通过会话密钥加密。这样网路上的其它用户,将很难窃取和篡改客户端和服务端之间传输的数据,从而保证了数据的私密性和完整性。
(4)https网站配置
#https功能由ngx_http_ssl_module模块提供
[rootlocalhost ~]# nmcli connection modify ens33 +ipv4.addresses
192.168.168.156/24
[root@localhost ~]# nmcli connection up ens33
[root@localhost ~]# mkdir -pv /www/https/
[root@localhost ~]# echo https > /www/https/index.html
[root@localhost conf.d]# cd /etc/pki/tls/certs/
#key是私钥文件
[root@localhost certs]# openssl genrsa -out https.key
#crt是由证书颁发机构(CA)签名后的证书,或者是开发者自签名的证书,包含证书持有人的信息,持
有人的公钥,以及签署者的签名等信息
[root@localhost certs]# openssl req -utf8 -new -key https.key -x509 -days
100 -out https.crt
[[root@localhost ~]# cat /etc/nginx/conf.d/test_https.conf
server {# listen 80;listen 192.168.168.156:443 ssl;root /www/https;ssl_certificate /etc/pki/tls/certs/https.crt;ssl_certificate_key /etc/pki/tls/certs/https.key;location / {}}
[root@localhost ~]# systemctl restart nginx
[root@localhost ~]# curl --insecure https://192.168.168.156
https
[root@localhost ~]# curl -k https://192.168.168.156
https 4.3 搭建动态网站
动态网站并不是指具有动画功能的网站,而是指网站内容可根据不同情况动态变更的网站,一般情况下动态网站通过数据库进行架构。 动态网站除了要设计网页外,还要通过数据库和编程序来使网站具有更多自动的和高级的功能。
动态网页:使用网页脚本语言,比如 php 、 JSP 等,通过脚本将网站内容动态存储到数据库,用户访问网站是通过读取数据库来动态生成网页的方法。
[root@localhost nginx]# nmcli connection modify ens33 +ipv4.addresses
192.168.168.157/24
[root@localhost nginx]# nmcli connection up ens33
[root@localhost ~]# dnf install php php-fpm -y
[root@localhost ~]# systemctl restart nginx php-fpm
[root@ntp-server ~]# echo "<?php phpinfo(); ?>" >
/usr/share/nginx/html/index.php
#使用浏览器访问 