一、Https、SSL等的了解及流程
1、传统Http协议弊端
传统Http协议弊端是明文的,如果别人采用抓包分析可以获取到明文数据。
2、什么是Https协议
HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer),简单来讲就是加了安全的HTTP,即HTTP+SSL;我们知道HTTP通讯时,如果客户端C请求服务器S,那么可以通过网络抓包的形式来获取信息,甚至可以模拟服务器S端,来骗取与C端的通讯信息;这对互联网应用在安全领域的推广非常不利;HTTPS解决了这个问题。
3、什么是SSL协议
安全套接字(Secure Socket Layer,SSL)协议是Web浏览器与Web服务器之间安全交换信息的协议,提供两个基本的安全服务:鉴别与保密。
SSL是Netscape于1994年开发的,后来成为了世界上最著名的web安全机制,所有主要的浏览器都支持SSL协议
目前有三个版本:2、3、3.1,最常用的是第3版,是1995年发布的。
SSL协议的三个特性
① 保密:在握手协议中定义了会话密钥后,所有的消息都被加密。
② 鉴别:可选的客户端认证,和强制的服务器端认证。
③ 完整性:传送的消息包括消息完整性检查(使用MAC)。
4、Https与Http区别
1)HTTPS的服务器需要到CA申请证书,以证明自己服务器的用途;
2)HTTP信息是明文传输,HTTPS信息是密文传输;
3)HTTP与HTTPS的端口不同,一个是80端口,一个是443端口;
可以说HTTP与HTTPS是完全不同的连接方式,HTTPS集合了加密传输,身份认证,更加的安全。
在微信小程序里面都限制只能有https协议、搜索引擎排名都对https优先收录
5、https要知道的几个加密算法
1.握手的时候使用的非对称加密算法 ,用来加密握手之后的请求和应答
2.传输信息的时候使用的对称加密,
3.保证数据的完整性用的是hash算法(数字签名)
6、Https加密过程
示例图1
示例图2
示例图3
1)客户端请求服务器,发送握手消息
2)服务器返回客户端自己的加密算法、数字证书和公钥;
3)客户端验证服务器端发送来的数字证书是否与本地受信任的证书相关信息一致;如果不一致则客户端浏览器提示证书不安全如下图所示
如果验证通过,则浏览器会采用自身的随机数算法产生一个随机数,并用服务器发送来的公钥加密;发送给服务器;这里如果有人通过攻击获取了这个消息,那也没用,因为他没有解密此段消息所需要私钥;验证通过的网站在浏览器地址栏的右边会有一安全锁的标识;
3)服务器解密得到此随机数,并用此随机数作为密钥采用对称加密算法加密一段握手消息发送给浏览器;
4)浏览器收到消息后解密成功,则握手结束,后续的信息都通过此随机密钥加密传输。
以上是服务端认证的情况,如果服务端对访问的客户端也有认证需求,则客户端也需要将自己的证书发送给服务器,服务器认证不通过,通讯结束;原理同上;
另外,一般在传输过程中为了防止消息窜改,还会采用消息摘要后再加密的方式,以此保证消息传递的正确性
1.客户端发送自己支持的加密规则给服务器,代表告诉服务器要进行连接了
2.服务器从中选出一套加密算法和hash算法以及自己的身份信息(地址等)以证书的形式发送给浏览器,证书中包含服务器信息,加密公钥,证书的办法机构
3.客户端收到网站的证书之后要做下面的事情:
4.验证证书的合法性
5.如果验证通过证书,浏览器会生成一串随机数,并用证书中的公钥进行加密
6.用约定好的hash算法计算握手消息,然后用生成的密钥进行加密,然后一起发送给服务器
服务器接收到客户端传送来的信息,要求下面的事情:
用私钥解析出密码,,用密码解析握手消息,验证hash值是否和浏览器发来的一致
使用密钥加密消息,回送如果计算法hash值一致,握手成功
。
7、什么是证书呢?
证书中包含什么信息
证书信息:过期时间和序列号
所有者信息:姓名等
所有者公钥
8、为什么要有https
我们来假设几个场景:
A(浏览器)和B(服务器)发送隐私的信息 ( http是明文传输怎么搞?
就算加密了,攻击者C获得了双方加密的密钥,也能获得双方的信息呀 ( 密钥丢失了怎么办呀?
就算攻击者C没有办法获得密钥,那么C向B(服务器)发送一些数据,那么B也不知道是不是A发送的呀 ( A是不是A?
二、Nginx 配置Https,使用阿里云Https证书
1、购买免费Https证书,腾讯云、阿里云。
2、证书申请
3、填写相关信息,等待审核,10分钟左右
4、下载证书
5、复制证书到Nginx / conf / cert 目录下( cert目录自己创建)
6、Nginx.conf 配置https 证书
同时支持https 和 http ,可去掉一个server ,不支持其中一个
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# https 协议支持 以下属性中以ssl开头的属性代表与证书配置有关,其他属性请根据自己的需要进行配置。
server {
listen 443 ssl; # SSL协议访问端口号为443。此处如未添加ssl,可能会造成Nginx无法启动。
server_name www.ryao.work; # 将localhost修改为您证书绑定的域名,例如:www.example.com。
root html;
index index.html index.htm;
ssl_certificate cert/3189411_www.ryao.work.pem; # 将domain name.pem替换成您证书的文件名。
ssl_certificate_key cert/3189411_www.ryao.work.key; # 将domain name.key替换成您证书的密钥文件名。
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #使用此加密套件。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #使用该协议进行配置。
ssl_prefer_server_ciphers on;
location / {
root html; #站点目录。
index index.html index.htm;
}
}
# http 协议支持
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
7、配置成功
8、可能遇到的问题
1、nginx.pid 找不到
nginx: [error] open() “/usr/local/nginx/logs/nginx.pid” failed (2: No such file or directory)
使用指定nginx.conf文件的方式重启nginx
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
2、ssl 模块未安装
nginx: [emerg] the “ssl” parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf:15
解决办法:
安装ssl 模块即可,具体看 https://blog.csdn.net/qq_41463655/article/details/100580572
3、启动错误
[root@izwz97p1nwa0a4vjjt3fifz sbin]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
解决办法:
强制停止80端口在启动
sudo fuser -k -n tcp 80