目录
- 密钥&加密算法
- CA & 数字证书
- https流程连接流程
- springboot项目启动https
- wireshark分析https流程
密钥&加密算法
密钥:通常是一个字符串或数字,进行加密/解密算法时使用。公钥和私钥都是密钥,只不过一般公钥是对外开放的,加密时使用;私钥是不公开的,解密时使用。
非对称加密算法原理:
加密明文时采用公钥加密,解密密文时使用私钥才能完成,而且发信方(加密者)知道收信方的公钥,只有收信方(解密者)才是唯一知道自己私钥的人。不对称加密算法的基本原理是,如果发信方想发送只有收信方才能解读的加密信息,发信方必须首先知道收信方的公钥,然后利用收信方的公钥来加密原文;收信方收到加密密文后,使用自己的私钥才能解密密文。显然,采用不对称加密算法,收发信双方在通信之前,收信方必须将自己早已随机生成的公钥送给发信方,而自己保留私钥。由于不对称算法拥有两个密钥,因而特别适用于分布式系统中的数据加密。广泛应用的不对称加密算法有RSA算法和美国国家标准局提出的DSA。
对称加密算法
对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高。
不足之处是,交易双方都使用同样钥匙,安全性得不到保证。此外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一钥匙,这会使得发收信双方所拥有的钥匙数量呈几何级数增长,密钥管理成为用户的负担。对称加密算法在分布式网络系统上使用较为困难,主要是因为密钥管理困难,使用成本较高。而与公开密钥加密算法比起来,对称加密算法能够提供加密和认证却缺乏了签名功能,使得使用范围有所缩小。在计算机专网系统中广泛使用的对称加密算法有DES和IDEA等。美国国家标准局倡导的AES即将作为新标准取代DES。
对称加密算法的优点在于加解密的高速度和使用长密钥时的难破解性。假设两个用户需要使用对称加密方法加密然后交换数据,则用户最少需要2个密钥并交换使用,如果企业内用户有n个,则整个企业共需要n×(n-1) 个密钥,密钥的生成和分发将成为企业信息部门的恶梦。对称加密算法的安全性取决于加密密钥的保存情况,但要求企业中每一个持有密钥的人都保守秘密是不可能的,他们通常会有意无意的把密钥泄漏出去——如果一个用户使用的密钥被入侵者所获得,入侵者便可以读取该用户密钥加密的所有文档,如果整个企业共用一个加密密钥,那整个企业文档的保密性便无从谈起。
CA & 数字证书
CA认证,即电子认证服务 ,是指为电子签名相关各方提供真实性、可靠性验证的活动。
证书颁发机构(CA, Certificate Authority)即颁发数字证书的机构。是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。
数字证书是指在互联网通讯中标志通讯各方身份信息的一个数字认证,人们可以在网上用它来识别对方的身份。
数字证书的基本工作原理主要体现在:
第一,发送方在发送信息前,需先与接收方联系,同时利用公钥加密信息,信息在进行传输的过程当中一直是处于密文状态,包括接收方接收后也是加密的,确保了信息传输的单一性,若信息被窃取或截取,也必须利用接收方的私钥才可解读数据,而无法更改数据,这也有利保障信息的完整性和安全性。
第二,数字证书的数据签名类似于加密过程,数据在实施加密后,只有接收方才可打开或更改数据信息,并加上自己的签名后再传输至发送方,而接收方的私钥具唯一性和私密性,这也保证了签名的真实性和可靠性,进而保障信息的安全性。
https流程连接流程
第一步:客户端向服务端发起请求(客户端https准备访问,但是双方此时都不清楚对方)
- 客户端生成随机数R1 发送给服务端;
- 告诉服务端自己支持哪些加密算法;
第二步:服务器向客户端发送数字证书(相当于服务端告诉客户端自己的电子身份,以及能通过怎样的密钥与我对话)
- 服务端生成随机数R2;
- 客户端支持的加密算法中选择一种双方都支持的加密算法(此算法用于后面的会话密钥生成)
- 服务端生成把证书、随机数R2、会话密钥生成算法,一同发给客户端;
第三步:客户端验证数字证书。(客户端确认服务端身份,然后发送自己的电子身份给服务端,并告知能通过怎样的密钥与我对话)
- 验证证书的可靠性,先用CA的公钥解密被加密过后的证书,能解密则说明证书没有问题,然后通过证书里提供的摘要算法进行对数据进行摘要,然后通过自己生成的摘要与服务端发送的摘要比对。
2. 验证证书合法性,包括证书是否吊销、是否到期、域名是否匹配,通过后则进行后面的流程
3. 获得证书的公钥、会话密钥生成算法、随机数R2
4. 生成一个随机数R3。
5. 根据会话秘钥算法使用R1、R2、R3生成会话秘钥。
6. 用服务端证书的公钥加密随机数R3并发送给服务端。
第四步:服务器得到会话密钥(服务端确认客户端身份,然后双方都知晓三次的随机数和秘钥算法,后续能正常加密对话了)
- 服务器用私钥解密客户端发过来的随机数R3
- 根据会话秘钥算法使用R1、R2、R3生成会话秘钥
第五步:客户端与服务端进行加密会话
-
客户端发送加密数据给服务端
发送加密数据:客户端加密数据后发送给服务端。
-
服务端响应客户端
解密接收数据:服务端用会话密钥解密客户端发送的数据; 加密响应数据:用会话密钥把响应的数据加密发送给客户端。
-
客户端解密服务端响应的数据
解密数据:客户端用会话密钥解密响应数据;
————————————————
版权声明:本文为CSDN博主「purpleFairyx」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_46364778/article/details/124884079
————————————————
版权声明:本文为CSDN博主「purpleFairyx」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_46364778/article/details/124884079
springboot项目启动https
baidu/google:
证书生成:
keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650
重要配置
import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Author mubi
* @Date 2023/7/17 23:09
*/
@Configuration
public class ServletWebServerConfiguration {
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
// Due to CONFIDENTIAL and /*, this will cause Tomcat to redirect every request to HTTPS.
// You can configure multiple patterns and multiple constraints if you need more control over what is and is not redirected.
SecurityConstraint constraint = new SecurityConstraint();
constraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
constraint.addCollection(collection);
context.addConstraint(constraint);
}
};
tomcat.addAdditionalTomcatConnectors(httpConnector());
return tomcat;
}
@Bean
public Connector httpConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http"); // 使用http协议
connector.setPort(8080); // HTTP监听端口
// if connector.setSecure(true),the http use the http and https use the https
// else if connector.setSecure(false),the http redirect to https;
connector.setSecure(true);
// redirectPort The redirect port number (non-SSL to SSL)
connector.setRedirectPort(8449); // 重定向端口
return connector;
}
}
application.properties如下
#https
server.port=8449
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-password=123456
server.ssl.keyStoreType=PKCS12
server.ssl.keyAlias=tomcat
启动成功如下:
当直接http访问https端口的时候,报错如下
https第一次访问会出现如下
继续前往,正确访问得到结果:
可以看到本地自己生成的证书如下:
安全的证书,类似baidu如下
wireshark分析https流程
http和https的区别:
ssl/tls协议流程
如下是访问b站的抓包
握手完成后传输的都是加密数据