目录
HTTPS
一,https在参考模型中的位置
二,什么是HTTPS
三,什么是SSL
1,SSL 协议分为两层:
2,SSL 协议提供的服务:
四,HTTPS的加密方式
1,常见的加密算法
2,X.509
3,PKI
4,X.509 通用的证书格式包含三个文件:key,csr,crt。
五,TTL四次握手
六,HTTPS实验
实验一:
自己创建ca机构,利用自己生成server.crt来完成通过https来访问网站
实验二:
基于虚拟目录和用户控制的 web 网站
HTTPS
一,https在参考模型中的位置
tcp/ip: https
应用层: http http
安全套接字层: ssl/tls
传输层:tcp/udp tcp
网络层
数据链路层 -》物理层
物理层
二,什么是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
SSL 是“Secure Sockets Layer”的缩写,中文叫做“安全套接层”。它是在上世纪 90 年代中期,由网景公司设计的。到了 1999 年,SSL 应用广泛,已经成为互联网上 的事实标准。IETF 就把 SSL 标准化。标准化之后 SSL 被改为 TLS(Transport Layer Security 传输层安全协议)。
1,SSL 协议分为两层:
• SSL 记录协议 (SSL Record Protocol):它建立在可靠的传输协议(如 TCP)
之上,为高层协议提供数据封装、压缩、加密等基本功能。
• SSL 握手协议(SSL Handshake Protocol):它建立在 SSL 记录协议之上,用
于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加
密密钥等。
2,SSL 协议提供的服务:
1)认证用户和服务器,确保数据发送到正确的客户机和服务器
2)加密数据以防止数据中途被窃取
3)维护数据的完整性,确保数据在传输过程中不被改变。
四,HTTPS的加密方式
由于公开密钥比共享密钥要慢,所以我们就需要综合一下他们两者的优缺点,使他
们共同使用,而这也是 HTTPS 采用的加密方式。在交换密钥阶段使用公开密 钥加
密方式,之后建立通信交换报文阶段则使用共享密钥加密方式。
如何证明公开密钥本身是货真价实的公开密钥?如,正准备和某台服务器建立公
开密钥加密方式下的通信时,如何证明收到的公开密钥就是原本预想的那台服务器
发行的公开密钥。或许在公开密钥传输过程中,真正的公开密钥已经被攻击者替换
掉了。这个时候就需要第三方公证单位来帮忙啦。
CA (certificate authority)就是一个公认的公证单位,你可以自行产生一把密钥且制作出必要的证书数据 并向 CA 单位注册,那么当客户端的浏览器在浏览时,该浏览器会主动向 CA 单位 确认该证书是否为合法注册过,如果是,那么该次连接才会建立,如果不是,浏览 器会发出警告信息,告知用户应避免建立连接。所以说,如此一来 WWW 服务器 不但有公证单位的证书,用户在建立连接时也比较有保障。
1,常见的加密算法
hash算法:MD2、MD4、MD5、HAVAL、SHA、SHA-1、HMAC、HMAC- MD5、
HMAC-SHA1。
对称加密算法:DES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6 和 AES。
非对称加密算法:RSA、DSA、ECDSA 安全,慢
2,X.509
X.509 标准规定数字证书应包含标准化信息。具体地说,X.509 版本 3
证书包含下列字段:
• 版本号 证书所遵循的 X.509 标准的版本。
• 序列号 唯一标识证书且由证书颁发机构颁发的编号。
• 签名算法 CA 用于对证书进行数字签名的 hash 算法。
• 颁发者名称 实际颁发该证书的证书颁发机构的标识。
• 有效期 数字证书保持有效的时间段,并包含起始日期和过期日期。
• 使用者名称 数字证书所有者的姓名。
• 使用者公钥信息 与数字证书所有者关联的公钥以及与该公钥关联的特
定公钥算法。
• 颁发者唯一标识符 可以用来唯一标识数字证书颁发者的信息。
• 使用者唯一标识符 可以用来唯一标识数字证书所有者的信息。
• 扩充信息 与证书的使用和处理有关的其他信息。
• 证书颁发机构的数字签名 使用指纹算法中指定的 HASH 算法以及证书
颁发机构的私钥进行加密的数字签名。
3,PKI
PKI(Public Key Infrastructure)公钥基础设施是提供公钥加密和数字签名服务的 系统或平台,目的是为了管理密钥和证书。一个机构通过采用 PKI 框架管理密钥和 证书可以建立一个安全的网络环境。PKI 主要包括四个部分:X.509 格式的证书(X.509 V3)和证书废止列表 CRL(X.509 V2);CA 操作协议;CA 管理协议;CA 政策制定。
Ls -l /etc/pki
lrwxrwxrwx. 1 root root 49 Jun 23 2020 cert.pem -> /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
drwxr-xr-x. 2 root root 74 Nov 29 21:28 certs
-rw-r--r--. 1 root root 412 Jul 20 2020 ct_log_list.cnf
drwxr-xr-x. 2 root root 6 Jul 20 2020 misc
-rw-r--r--. 1 root root 11225 Jul 20 2020 openssl.cnf
drwxr-xr-x. 2 root root 26 Nov 29 21:28 private
.pem: 证书
.crt: 证书
.key: 私钥
.csr: 服务器向第三方机构申请证书,.csr: 申请文件
4,X.509 通用的证书格式包含三个文件:key,csr,crt。
1、CRT
CRT 应该是 certificate 的三个字母,其实还是证书的意思。常见于 UNIX 系统,有可能是 PEM 编码,也有可能是 DER 编码,大多数应该是 PEM 编码,相信你已经知道怎么辨别。
2、CER
还是 certificate,还是证书。常见于 Windows 系统,同样的可能是 PEM 编码,也可能是 DER 编码,大多数应该是 DER 编码。
3、KEY
通常用来存放一个公钥或者私钥,并非 X.509 证书。编码同样的,可能是 PEM,也可能是 DER。
查看 KEY 的办法:openssl rsa -in mykey.key -text -noout 。
如果是 DER 格式的话,同理应该这样了:openssl rsa -in mykey.key -text -noout -inform der 。
4、CSR
Certificate,Signing Request,即证书签名请求。这个并不是证书,而是向权威证书颁发机构获得签名证书的申请,其核心内容是一个公钥(当然还附带了一些别的信息)。在生成这个申请的时候,同时也会生成一个私钥,私钥要自己保管好。做过 iOS APP 的朋友都应该知道是,怎么向苹果申请开发者证书的吧。
查看的办法:openssl req -noout -text -in my.csr (如果是 DER 格式的话照旧加上 -inform der,这里不写了)。
CA颁发证书中有一个数字签名:CA机构的公钥对签名进行解密:-》 HASH(INFO) -》 能拿出来INFO(不能)
就不能对HASH(INFO)进行更改
INFO:明文信息进行更改:-》 INFO信息改变了 -》 HASH(NEW_INFO) == HASH(INFO) -> 不相等
123456 -》 aaabbbb
123457 -> aaaccccc
五,TTL四次握手
TLS四次握手
tcp连接:tcp三次握手
ssl握手协议
浏览器 -》 web服务器
clienthello ->
随机数:client_random
会话ID: session_id
加密套件:cipher suite TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_
ECDHE_ECDSA: 密钥交换算法
AES_128: 对称加密的算法
GCM_SHA256: HASH算法(完整性校验的算法)
压缩算法:null
扩展数据: extend
服务器-》 浏览器
serverhello:
tls的版本
随机数:server_random
会话ID: session_id: null
加密套件:Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)
客户端刚才加密套件有16个,服务器只有一个(协商之后的结果,告诉使用的加密套件是哪一个)
结果:协商使用的TLS的版本,以及使用的加密套件
第一个阶段:
clienthello
第二个阶段
serverhello
certificate: 发送证书
Certificate: 308206323082051aa003020102020c3e35a8ccf6deb780d152a595300d06092a864886f7… (id-at-commonName=*.ax1x.com)
Certificate: 3082044d30820335a003020102020b040000000001444ef03631300d06092a864886f70d… (id-at-commonName=AlphaSSL CA - SHA256 - G2,id-at-organizationName=GlobalSign nv-sa,id-at-countryName=BE)
server key exchange: 密钥交换, 服务器向客户端发送自己密钥交换的参数
公钥,签名算法,签名
certificate request: 服务器可以要求浏览器来提供证书验证身份(做了这个设置有这个报文,如果没做这个设置是不会有这个报文的)
serverhello done: 通知消息来告诉客户端,第二阶段完成了
第三个阶段:
certificate: 如果在第二个阶段有certificate request报文的话:意味着服务器要验证客户端的身份
那么在第三个阶段就会有certificate报文
client key exchange: 提供客户端密钥交换的参数:ecdh
Pubkey: aec4f086e8dadd557f26bb417f65fa5f7cf56dfb5e5b7fb143c9829a5bb70c3f
使用公钥加密的随机数 -》 pre-master-key: 预备主密钥
产生了几个随机数?
client_random -> clienthello 客户端将client-random发送到服务器
server_random -》serverhello 服务器将server_randome 发送给客户端
pre_master_key -> 客户端会将这个随机数发往服务器
服务器和客户端是各自都掌握了三个随机数
certificate verify:证书验证,验证证书的正确性
change cipher spec:通知消息:改变加密的一个通知
encrypt handshake message:加密的握手消息(加密前边通信过程数据,hash算法进行加密)
new session ticket: 新的会话票据
change ciper spec: 改变编码的通知:通知对端后面传输的数据要进行加密了
encrypted handshage messages: 需要校验:客户端发送过来的encrypted handshake messages, 服务器也把自己之前和客户端的消息进行hash散列,拿到一个加密之后的字符串,发送客户端
客户端收到change cipher和encrypted handshake messages: 也要校验消息的完整性:校验成功了之后才去传输数据(对称加密,密钥:master secret)
certificate verify:证书验证,验证证书的正确性: 只有客户端发送了自己的证书才有这个数据包,
一个签名,对从第一条消息以来的所有握手消息的HMAC值(用master_secret)进行签名。
六,HTTPS实验
安装模块
Yum install mod_ssl -y
安装完成后tree /etc/httpd下面会产生一个ssl.conf文件
或者ls -l /etc/httpd/conf.d
使用命令vim /etc/httpd/conf.d/ssl.conf打开文件
1,Listen 443 https 监听443端口,使用https协议
2,会话缓存,会话超时时间
3,Ssl 使用的加密设备 内件
4,虚拟主机的配置
5, 错误日志。传输日志,访问日志,日志级别
6,在虚拟主机上启动或者关闭ssl
7,使用的ssl 版本; sslv3就是tls
ssl代理的版本
反向代理提供负载均衡的功能
8,有16个加密条件,启动后会选择最优的加密条件
9,查看加密的策略
加密条件,使用的是系统的
代理的加密条件
(加密条件可以使用系统的额,亦可以指定固定的加密条件)
10,证书
11,私钥
没重启服务之前,/etc/pki/tls/目录下没有localhost.crt和localhost.key文件
重启服务后,系统会自动生成两个文件(证书)
访问浏览器时,也会从无法访问变成不安全
之前没有证书,重启服务后才有
实验一:
自己创建ca机构,利用自己生成server.crt来完成通过https来访问网站
安装命令openssl
创建目录 mkdir ca_learning
切换到目录下面 cd ca_learning/
一,搭建CA服务器
使用openssl生成自签名证书:
1.生成私钥(ca机构的私钥)
[root@wangjingjing ca_learning]# openssl genrsa -out ca.key 2048
2.得有证书(CA机构自己的证书)
生成公钥:openssl rsa -in ca.key -pubout out ca.pub
[root@wangjingjing ca_learning]# openssl rsa -in ca.key -pubout -out ca.pub
生成证书:[root@wangjingjing ca_learning]# openssl req -new -x509 -days 36500 -key ca.key -out ca.crt (此命令为交互式命令)
第一步和第二步:搭建一个CA机构(私有的,你自己的,不是权威的)
# 一步生成私钥和证书
openssl req -newkey rsa:2048 -nodes -keyout rsa_private.key -x509 -days 36500 -out cert.crt
# 生成证书(非交互式的)
openssl req -newkey rsa:2048 -nodes -keyout rsa_private.key -x509 -days 36500 -out cert.crt -subj "/C=CN/ST=GuangDong/L=ShenZhen/O=SunFoBank/OU=IT Dept/CN=sunfobank.com/emailAddress=admin@sunfobank.com"
3.为服务器去签发证书
服务器得先产生公钥和私钥
提交证书申请文件.csr
CA签发证书-> crt证书
生成私钥:
[root@wangjingjing ca_learning]# openssl genrsa -out server.key 2048
生成申请文件:.csr(已经生成了公钥)
openssl req -new -key server.key -out server.csr
[root@wangjingjing ca_learning]# openssl req -new -key server.key -out server.csr
将申请文件提交给CA机构(ca.key, ca.crt), 让ca机构去签发证书
[root@wangjingjing ca_learning]# openssl x509 -req -days 36500 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
.srl序列号文件
x509: 签发509证书
-req: 说明输入是一个证书申请文件
-in: 指定申请文件
-CA: 指定CA机构的证书
-CAkey: 指定CA结构的私钥
-CAcreateserial: CA创建序列号:唯一标识
-out: 输出证书
二,利用自己生成server.crt来完成通过https来访问网站
1, 添加一个ip(使用已有ip 192.168.206.131)
2, 新建网站的目录(/www/ssl),
3, 新建首页文件(echo "this page is for ssl by https" > /www/ssl/index.html
4,去在conf.d目录,去新建配置文件:myssl.conf
5,Vim /etc/httpd/conf.d/myssl.conf
6,重启服务
7,结果:
实验二:
基于虚拟目录和用户控制的 web 网站
虚拟目录 alias 别名
alias:别名: 针对的是:浏览器中输入URL, URL的路径path的那一部分映射到Linux上真正的目录:
DocumentRoot /www/ip/155 -> http://192.168.233.155 -> /www/ip/155
http://192.168.233.155/foo/path/test.html -> /www/ip/155/foo/path/test.html
alias /foo/path -> /www/ip/155
http://192.168.233.155/foo/path/test.html -> /www/ip/155/test.html
http://192.168.233.155/foo/path/test.html -> DocumentRoot /www/ip/155 -> URL -> /www/ip/155/foo/path/test.html
http://192.168.233.155/foo/path/test.html -> Alias /www/ip/155/foo -> URL -> /www/ip/155/foo/test.html
用户控制
用来设置密码
htpasswd
ht-> http passwd
1.访问网站需要登录:
肯定要有登录的用户名和密码
2. 在配置文件中配置:用户认证
-c Create the passwdfile. If passwdfile already exists, it is rewritten and truncated.: 创建密码文件;若存在,覆盖
1,创建一个目录用来存放密码文件
[root@wangjingjing ca_learning]# cd /usr/local/
[root@wangjingjing local]# mkdir http_dir
2,创建用户名xixi和密码123456
[root@wangjingjing local]# htpasswd -c /usr/local/http_dir/mypasswd xixi
3,在目录里面进行配置
AuthType Basic 基本认证类型(账号)
AuthName “Please login:” 提示信息,双引号必须有,可以更换为其它提示信息
AuthUserFile /etc/httpd/mymima 用户认证文件的用户名和密码指定的文件所在位置
Require user xiaoming xiaohong 指定这两个用户可以访问该服务器
4,重启服务
5,在浏览器访问192.168.206.133
针对网站访问的目录做的权限设置:使用用户基础认证的方式
注意登录的配置是配置在目录中的