JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

大促期间网络安全实战 网络安全大事

wys521 2024-10-16 14:50:35 精选教程 42 ℃ 0 评论

1 网络编程安全解读与实战

1.1 HTTPS超文本传输安全协议

1.1.1 什么是HTTPS

1、HTTP协议回顾

超文本传输协议:

是一个基于请求与响应, 无状态的,应用层的协议

基 于TCP/IP 协议 传输(明文) 数据,互联网上应用 最为广泛 的一种网络协议,所有的WWW都必须遵守这个标准。

我们使用浏览器访问一个网站页面,在浏览器的地址栏中我们会看到一串URL

域名地址都很好理解,不同的域名地址表示网站中不同的页面,而通信协议,简单来说就是浏览器和服务

器之间沟通的语言。

HTTP发展历程

2、HTTPS协议

1.1.2 HTTPS与HTTP的区别

  1. https协议需要申请CA,证书,http不需要证书
  2. http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl/tls加密传输协议。
  3. ht.tp和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
  4. http的连接很简单,是无状态的;HTTPS协议是由SSL/TLS+HTTP协议构建的加密传输
  5. 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等;

特点:

  1. 发送端和接收端共享相同的密钥才能通信,一定程度上保证了安全。
  2. 对于枚举攻击,密码长度越长越难以破解

2、非对称加密

加密使用的密钥和解密使用的密钥是不相同的,分别称为:公钥、私钥,公钥和算法都是公开的,私钥是保密的。

非对称加密算法性能较低,但是安全性超强,由于其加密特性,非对称加密算法能加密的数据长度也是有限的。

例如:RSA、DSA、ECDSA、 DH、ECDHE

局限性:加密、解密运算效率较低;

非对称加密算法:RSA,DSA(有一个公匙和一个私匙)

特点:

  1. 编码密钥众所周知,但只有特定主机才知道私有解码密钥,解码密钥保密,保证了传输安全。
  2. 所有的想向主机发送报文的人都可以使用相同的编码密钥,解决了对称加密密钥数量多管理不便的问题。

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次随机数生成会话秘钥的的过程

重点在说下

三个随机数:

  1. 客户端给出协议版本号,一个随机数(client random),以及客户端支持的加密方式
  1. 服务端确认双方使用的加密方式,并给出数字证书,以及一个服务器生成的随机数(serverrandom)
  2. 客户端确认证书有效,然后生成一个新的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?

  • 全双工通讯、替代轮询

可以做什么?

  1. 即时通讯
  2. 消息推送

总结

  • Socket是传输控制层接口,WebSocket是应用层协议。
  • 与http关系: WebSocket就像HTTP一样,则是一个典型的应用层协议

2)Springboot集成WebSocket

WebSocket API 是 HTML5 标准的一部分, 但这并不代表 WebSocket 一定要用在 HTML 中,或者只能在基于浏览器的应用程序中使用

1、引入起步依赖

2、开启WebSocket支持端点

3、创建server核心类


Tips:

  1. addOnlineCount和getOnlineCount为static;表示当前这个变量是有状态的(有状态:线程间资源不被隔离),多线程共享onlineCount
  2. addOnlineCount和getOnlineCount为synchronized;表示当前这个方法如果单纯操作原子变量无需synchronized、如果方法体内使用非原子操作则无需synchronized、如果需要做方法同步需要synchronized

4、创建控制器

用户打开页面和服务端消息推送

5、创建消息发送HTML

6、单播运行效果如下

1、张三建立连接

打开效果

建立WebSocket连接

F12查看ws

该请求和普通的HTTP请求有几点不同:

  1. GET请求的地址不是类似/http/,而是以ws://开头的地址;
  2. 请求头Upgrade: websocket和Connection: Upgrade表示这个连接将要被转换为WebSocket连接;
  3. Sec-WebSocket-Key是由浏览器随机生成的,是用于标识这个连接,并非用于加密数据;
  4. 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任何配置

  1. 解决http重定向到https
  2. 解决Wss服务问题
  3. 关于Nginx版本问题 ,版本应该大于1.3

1、启动nginx

常见的错误:

  1. 端口号被占用
  2. 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设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件

访问流程:

  1. http://websocket.nginx.com/im/访问进入到 listen 80;
  2. 接着跳转到listen 443
  3. 进入到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、修改前端和配置文件

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表