网站首页 > 精选教程 正文
1 网络编程安全解读与实战
1.1 HTTPS超文本传输安全协议
1.1.1 什么是HTTPS
1、HTTP协议回顾
超文本传输协议:
是一个基于请求与响应, 无状态的,应用层的协议
基 于TCP/IP 协议 传输(明文) 数据,互联网上应用 最为广泛 的一种网络协议,所有的WWW都必须遵守这个标准。
我们使用浏览器访问一个网站页面,在浏览器的地址栏中我们会看到一串URL
域名地址都很好理解,不同的域名地址表示网站中不同的页面,而通信协议,简单来说就是浏览器和服务
器之间沟通的语言。
HTTP发展历程
2、HTTPS协议
1.1.2 HTTPS与HTTP的区别
- https协议需要申请CA,证书,http不需要证书
- http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl/tls加密传输协议。
- ht.tp和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
- http的连接很简单,是无状态的;HTTPS协议是由SSL/TLS+HTTP协议构建的加密传输
- http直接与四层交互,https先给安全层交互,然后在与四层交互
1.2 加密原理与算法剖析
1.2.1 加密原理介绍
简单理解
如上图所示 HTTPS 相比 HTTP 多了一层 SSL/TLS
TLS(Transport Layer Security,传输层安全):
其前身是 SSL,它最初的几个版本(SSL 1.0、SSL 2.0、SSL 3.0)由网景公司开发
1999年从 3.1 开始被 IETF 标准化并改名,发展至今已经有 TLS 1.0、TLS 1.1、TLS 1.2 三个版本。
TLS 1.3 改动会比较大,目前还未大规模推广, 目前使用最广泛的是TLS 1.2
1.2.2 加密后通信流程
客户端在使用HTTPS方式与Web服务器通信时的步骤
访问 www.taobao.com
1.2.3 加密算法剖析
要建立一个密码体制,需要由五个空间组成,分别是:
- 明文M:加密前或解密后的信息;
- 密文C:明文加密后的信息;
- 密钥K:由加密密钥和解密密钥组成;
- 加密E:从明文到密文的变换;
- 解密D:从密文到明文的变换
1、对称加密:
或者也叫单钥加密,是指加密密钥和解密密钥相同的加密方式。
对称加密的主要优势是:加密、解密运算速度快,效率高;
代表算法:AES算法、DES算法、RC4,3DES 、Triple-DES, RC2等;
特点:
- 发送端和接收端共享相同的密钥才能通信,一定程度上保证了安全。
- 对于枚举攻击,密码长度越长越难以破解
2、非对称加密
加密使用的密钥和解密使用的密钥是不相同的,分别称为:公钥、私钥,公钥和算法都是公开的,私钥是保密的。
非对称加密算法性能较低,但是安全性超强,由于其加密特性,非对称加密算法能加密的数据长度也是有限的。
例如:RSA、DSA、ECDSA、 DH、ECDHE
局限性:加密、解密运算效率较低;
非对称加密算法:RSA,DSA(有一个公匙和一个私匙)
特点:
- 编码密钥众所周知,但只有特定主机才知道私有解码密钥,解码密钥保密,保证了传输安全。
- 所有的想向主机发送报文的人都可以使用相同的编码密钥,解决了对称加密密钥数量多管理不便的问题。
3、散列算法(或音译为哈希)
Hash算法特别的地方在于它是一种单向(输出不依赖于输入)算法,用户可以通过hash算法对目标信息生成一段特定长度的唯一hash值,却不能通过这个hash值重新获得目标信息。
因此Hash算法常用在不可还原的密码存储、信息完整性校验等。
将任意长度的信息转换为较短的固定长度的值,通常其长度要比信息小得多,且算法不可逆。
例如:MD5、SHA-1、SHA-2、SHA-256 等
信息-摘要算法
MD5 ("ADSFASFA")=SSSSSS
把一个不定长的数据通过摘要算法处理成一个定长的数据
1.2.4 HTTPS协议SSL加密解密流程
1、加密解密流程
2、会话密钥生成流程详解(重要)
以上第1、2、4部分【生成的key或者随机值】是核心中的核心
也就是3次随机数生成会话秘钥的的过程
重点在说下
三个随机数:
- 客户端给出协议版本号,一个随机数(client random),以及客户端支持的加密方式
- 服务端确认双方使用的加密方式,并给出数字证书,以及一个服务器生成的随机数(serverrandom)
- 客户端确认证书有效,然后生成一个新的46字节随机数(称为预备主密钥premastersecret),使用数字证书的公钥加密这个随机数,发送给服务端
总结:
- 服务端用非对称加密算法RSA生成 公钥 和 私钥 ,把公钥放在证书里发送给客户端,私钥自己保存
- 客户端接收到 公钥 后,首先向一个 权威的服务器 检查 证书的合法性 ,如果证书合法,客户端产生一段随机数,这个随机数就作为通信的密钥,我们称之为 对称密钥 ,用公钥加密这段 随机数 ,然后发送到服务器
- 服务器用 密钥 解密获取 对称密钥 ,然后,双方就已对称密钥进行加密解密通信了
3、CA证书
公钥被截取了怎么办
CA证书
- CA证书顾名思义就是由CA(Certification Authority,也叫“证书授权中心”)机构发布的数字证书
编码格式
- X.509规范中一般推荐使用PEM格式来存储证书相关的文件。证书文件的文件名后缀一般为 .crt 或 .cer
- 对应私钥文件的文件名后缀一般为 .key。证书请求文件的文件名后綴为 .csr 。有时候也统一用pem作为文件名后缀
编码格式总结:
- X.509 标准DER(Distinguished Encoding Rules)编码,后缀为:.der .cer .crt
- X.509 BASE64编码(PEM格式),后缀为:.pem .cer .crt
CA证书具体包括以下内容
- 颁发者
- 使用者
- 版本
- 签名算法
- 签名哈希算法
- 使用者
- 公钥
- 指纹
- 指纹算法
证书策略
由对象标识符和限定符组成,这些对象标识符说明证书的颁发和使用策略有关
X509v3 Certificate Policies:
- Policy: 1.3.6.1.4.1.4146.1.20
- CPS: https://www.globalsign.com/repository/
- Policy: 2.23.140.1.2.2
版本号(Version Number):CA证书一个规范的版本号,目前为版本3,值为0x2;
序列号(Serial Number):由CA维护的,为它所发的每个证书分配一个序列号,用来追踪和撤销证书。只要拥有签发者信息和序列号,就可以唯一标识一个证书,最大不能过20个字节;
签名算法(Signature Algorithm):数字签名所采用的算法,如:
sha256-with-RSA-Encryption
ccdsa-with-SHA2S6;
颁发者(Issuer):发证书单位的标识信息,如 ” C=CN,ST=Beijing, L=Beijing,O=org.example.com,CN=ca.org。example.com ”;
有效期(Validity): 证书的有效期很,包括起止时间。
服务器提供服务器的公钥给ca机构,生成证书,证书一般包含以下内容:
- Issuer (证书的发布机构)
- Valid from , Valid to (证书的有效期)
- Public key (公钥)
- Subject (主题,使用者)
- Signature algorithm (签名所使用的算法)
- Thumbprint, Thumbprint algorithm (指纹以及指纹算法)
生成证书的过程一般是:把Issuer (证书的发布机构),Public key (公钥),Subject (主题),Valid from,Validto(证书的有效期)等信息以明文的形式写到证书里面作为内容,然后用一个指纹算法(淘宝是sha1)计算出这些数字证书内容的一个指纹(也就是签名),并把指纹和指纹算法用自己的私钥进行加密,然后生成证书
1.3 SSL/TLS实战与开发
1.3.1 WebSocket实战与应用
1、发送连接请求
客户端通过一个格式为:ws://host:port/的请求地址发起WebSocket连接请求,并由JavaScript实现WebSocket API与服务器建立WebSocket连接,其中host为服务器主机IP地址或域名,port为端口。
2、握手
当服务器收到请求后,会解析请求头信息,根据升级后的协议判断该请求为WebSocket请求,并取出请求信息中的Sec-WebSocket-Key字段的数据按照某种算法重新生成一个新的字符串序列放入响应头Sec-WebSocket-Accept中Sec-WebSocket-Accept:服务器接受客户端HTTP协议升级的证明
3、WebSocket建立连接
客户端接收服务器的响应后,同样会解析请求头信息,取出请求信息中的Sec-WebSocket-Accept字段,并用服务器内部处理Sec-WebSocket-Key字段的算法处理之前发送的Sec-WebSocket-Key,把处理得到的结果与Sec-WebSocket-Accept进行对比,数据相同则表示客户端与服务器成功建立WebSocket连接,反之失败
传统HTTP客户端与服务器请求响应模式如下图所示
上图对比可以看出,相对于传统HTTP每次请求-应答都需要客户端与服务端建立连接的模式WebSocket是类似Socket的TCP长连接通讯模式。一旦WebSocket连接建立后,后续数据都以帧序列的形式传输。
WebSocket与HTTP的关系
WebSocket就像HTTP一样,则是一个典型的应用层协议。
Socket是传输控制层接口,WebSocket是应用层协议。
WebSocket在建立握手时,数据是通过HTTP传输的。但是建立之后,在真正传输时候是不需要HTTP协议的。
在WebSocket中,只需要服务器和浏览器通过HTTP协议进行一个握手的动作,然后单独建立一条TCP的通信通道进行数据的传送。
为什么需要 WebSocket?
- 全双工通讯、替代轮询
可以做什么?
- 即时通讯
- 消息推送
总结
- Socket是传输控制层接口,WebSocket是应用层协议。
- 与http关系: WebSocket就像HTTP一样,则是一个典型的应用层协议
2)Springboot集成WebSocket
WebSocket API 是 HTML5 标准的一部分, 但这并不代表 WebSocket 一定要用在 HTML 中,或者只能在基于浏览器的应用程序中使用
1、引入起步依赖
2、开启WebSocket支持端点
3、创建server核心类
Tips:
- addOnlineCount和getOnlineCount为static;表示当前这个变量是有状态的(有状态:线程间资源不被隔离),多线程共享onlineCount
- addOnlineCount和getOnlineCount为synchronized;表示当前这个方法如果单纯操作原子变量无需synchronized、如果方法体内使用非原子操作则无需synchronized、如果需要做方法同步需要synchronized
4、创建控制器
用户打开页面和服务端消息推送
5、创建消息发送HTML
6、单播运行效果如下
1、张三建立连接
打开效果
建立WebSocket连接
F12查看ws
该请求和普通的HTTP请求有几点不同:
- GET请求的地址不是类似/http/,而是以ws://开头的地址;
- 请求头Upgrade: websocket和Connection: Upgrade表示这个连接将要被转换为WebSocket连接;
- Sec-WebSocket-Key是由浏览器随机生成的,是用于标识这个连接,并非用于加密数据;
- Sec-WebSocket-Version指定了WebSocket的协议版本
General是一个 http 请求以及响应,这里的 general 可以理解成为 http 请求 和 响应 的请始行 的一个公共部分
101 状态码表示服务器已经理解了客户端的请求,并将通过 Upgrade 消息头通知客户端采用不同的协议来完成这个请求;
2、李四建立连接
首页打开效果
建立WebSocket连接
3、张三对话李四
查看李四窗口是否收到消息
4、李四回复张三
张三接收消息
5、服务端消息推送
接收消息
1.3.2 自签名证书HTTPS开发
1)SSL证书生成
密钥库
1) 生成keystore证书
JDK中keytool是一个证书管理工具,可以生成自签名证书
查看生成结果
命令解释:
2)springboot集成SSL
将xxx.keystore拷贝到项目src/java/resources目录下.配置application.properties
2、将czbk.keystore放到classpath下面
3、增加配置类
4、https安全验证
3) Nginx代理SSL
springboot程序不加入ssl任何配置
- 解决http重定向到https
- 解决Wss服务问题
- 关于Nginx版本问题 ,版本应该大于1.3
1、启动nginx
常见的错误:
- 端口号被占用
- nginx文件夹路径含中文
使用 Nginx 反向代理来解决 WebSocket 的 wss 服务问题,即客户端通过 Wss 协议连接 Nginx 然后Nginx 通过 Ws 协议和 Server 通讯
也就是说 Nginx 负责通讯加解密,Nginx 到 Server 是明文的
map指令的作用:
- 该作用主要是根据客户端请求中$http_upgrade 的值,来构造改变$connection_upgrade的值,即根据变量$http_upgrade的值创建新的变量$connection_upgrade,
- 创建的规则就是{}里面的东西。其中的规则没有做匹配,因此使用默认的,即 $connection_upgrade的值会一直是 upgrade。然后如果 $http_upgrade为空字符串的话,那值会是 close
核心配置
- ssl_certificate 证书 其实是个公钥,它会被发送到连接服务器的每个客户端
- ssl_certificate_key 私钥 是用来解密的,所以它的权限要得到保护但nginx的主进程能够读取。
- ssl_session_timeout : 客户端可以重用会话缓存中 ssl参数的过期时间
ssl_protocols指令用于支持加密协议
ssl_ciphers选择加密套件 ,不同的浏览器所支持的套件(和顺序)可能会不同。这里指定的是OpenSSL库能够识别的写法,你可以通过 openssl -v cipher 'RC4:HIGH:!aNULL:!MD5'(后面是你所指定的套件加密算法) 来看所支持算法。
加密套件 之间用冒号分隔,加密套件 前有感叹号的表示必须废弃。
ssl_prefer_server_ciphers on设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件
访问流程:
- http://websocket.nginx.com/im/访问进入到 listen 80;
- 接着跳转到listen 443
- 进入到443后分别(wss或者http)进行跳转
重载 Nginx 服务
2、安装kse-543-setup
目的:将kestore转p12
桌面打开快捷方式,导入kestore
生成p12
通过P12生成crt和key文件 (Nginx使用openssl的crt和key)
1、安装Win64OpenSSL-1_1_0i
3、设置配置文件
4、进入C:\OpenSSL-Win64\bin
打开cmd窗口 查看版本
5、生成key文件
6、生成crt文件
7、修改hosts文件
9、修改前端和配置文件
猜你喜欢
- 2024-10-16 web前端程序员,面试必备9种跨域产生原因和解决方案,附资料
- 2024-10-16 使用 Kubernetes Agent Server 实现 GitOps
- 2024-10-16 详解 WebSocket 原理,附完整的聊天室实战 Demo
- 2024-10-16 小程序开发教程的汇集 小程序实战开发教程
- 2024-10-16 Workerman的使用 workerman event
- 2024-10-16 如何快速搭建高可用的IM系统?只需要2小时!我前后看了三遍。
- 2024-10-16 Ubuntu 下 Janus Server 搭建笔记
- 2024-10-16 解锁远程办公自由:FRP快速实现本地服务远程调用
- 2024-10-16 开发者都在寻找的微信小程序系统宝典
- 2024-10-16 vue3+vite+ts+pinia 后台管理项目总结
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)