HTTPS SSL
问题描述
小程序中,网络请求,需要时https
spring boot 部署ssl
证书知识点
远古时代
不加密
上古时代
出现中间人攻击,于是加密出现。双方使用相同的密钥进行加密,被称为对称加密算法
密钥的确定不能通过网络,需要线下商定,否则可能会被截取。
密钥可能会被暴力破解,于是密钥的长度变长
DES (Data Encryption Standard) 56bits
triple-DES 168
AES 256
现代 非对称加密
最著名的算法:RSA算法
public key: 用来加密
private key: 用来解密
具体过程
A 有 public key, private key
B 有 public key, private key
private 保留在本地,public key发给对方
A 给 B发数据
1、A使用private key 加密数据的hash值
2、A使用B的public key加密数据。
3、A将加密的hash值和加密的数据再加上一些其他信息,发给B
4、B收到之后,使用private key 解密数据,运行得到hash值
5、使用A的public key解密hash值
6、对比hash值,以检验数据的完整性
非堆成加密仍然存在隐患
中间人 拦截双方的public key,换成自己的public key,然后在中间解密、加密
为了确保public key不被拦截,还需要线下传送public key
CA (Certificate Authority)
使得不用线下见面传送public key
流程:
1、B 将自己的public key(和一些其他信息)交给CA
2、CA用自己的private key加密这些 信息,得到数字证书
3、 现在B向A传递的public key 变为:B向A传送数字证书
4、 A收到以后,使用CA发布的CA证书(包含CA的public key),解密B的数字证书,得到B的public key
CA的安全性
CA证书 如果被劫持,换成攻击人自己伪造的CA证书,那么也可能被劫持
但是CA证书 时集成在浏览器 和操作系统 里的,不是通过网络获取的。
中间人可以拦截A和B的数字证书,也可以使用CA证书获得A和B的public key,但是中间人无法伪造出一个可以通过CA认证的数字证书
实际使用
1、非对称加密复杂,处理速度慢,所有消息都使用非对称加密的话,效率会很低
2、所以非对称加密只会用来传递一条消息,就是用于对称加密的密钥
3、对称加密的密钥确定了,A、B还是可以通过对称加密进行网络通信。
所以,在现代,A和B之间要进行安全,省心的网络通信,需要经过以下几个步骤
- 通过CA体系交换public key
- 通过非对称加密算法,交换用于对称加密的密钥
- 通过对称加密算法,加密正常的网络通信
这基本就是SSL/TLS的工作过程了。
symmetric key 对称密钥
Asymmetric key 非对称密钥
keytool
keystore
1、密钥库
2、包含密钥 和 数字证书
3、密钥库有一个密码
spring boot部署ssl
properties.yaml
server:
port: 8443 # 指定端口
ssl:
key-store: classpath:tql.zone.jks # 指定密钥库
key-store-password: wuxiaolan@2 # 密钥库密码
keyStoreType: JKS # 密钥库类型
自动跳转
package com.example.smarttext.config;
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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class HttpsConfig {
/**
* spring boot 2.0
* @return
*/
@Bean
public TomcatServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
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");
//Connector监听的http的端口号
connector.setPort(8080);
connector.setSecure(false);
//监听到http的端口号后转向到的https的端口号
connector.setRedirectPort(8443);
return connector;
}
}