概念
HTTPS是在HTTP的基础上添加了SSL层,通过传输加密和身份认证保证传输过程中数据的安全性。
原理
HTTPS = HTTP + SSL/TLS
- HTTP,客户端和服务器通过TCP建立连接后,客户端通过HTTP协议发送请求和接收服务端返回的请求。
- SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层TCP与应用层HTTP之间对网络连接进行加密。[百度百科]
安全机制
- 证书:通过第三方权威证书颁发机构(如VeriSign)验证和担保网站的身份,防止他人伪造网站身份与不知情的用户建立加密连接。
- 密钥交换:通过公钥(非对称)加密在网站服务器和用户之间协商生成一个共同的会话密钥。
- 会话加密:通过机制(2)协商的会话密钥,用对称加密算法对会话的内容进行加密。
- 消息校验:通过消息校验算法来防止加密信息在传输过程中被篡改。
缺点
- 安全性范围有限度,不能保证绝对安全
- SSL加密和解密增加了额计算资源消耗
- 同样网络环境下,通信变慢
前端实现
- 打开前端devops配置修改为挂载https,或者通过编排文件添加参数 (enable_https_cert: true)
2.修改前端nginx.config的配置文件
# 1.文件在容器对应路径下
ssl_certificate /etc/ssl/devops/https_cert_crt;
ssl_certificate_key /etc/ssl/devops/https_cert_key;
# 2. 监听的端口后面添加ssl
如图:
4.解决不安全链接
- 描述:经过上述操作后重新部署前端代码,出现无法通过HTTPS加载的页面启动不安全的WebSocket连接
- 解决方案
a.创建新的conf文件
server {
listen 3335 ssl;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_ssl_certificate /etc/ssl/devops/https_cert_crt;
proxy_ssl_certificate_key /etc/ssl/devops/https_cert_key;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
location / {
proxy_pass http://$host:2225;
}
location ^~ /structure/overview/ {
proxy_pass http://$host:2228;
}
}
b.前端创建websocket 连接
- ws修改成wss
- 前端端口号映射成3335
c.目前docker使用的网络模式是桥接模式,所以部署时注意将3335端口映射出来
后端实现
场景解读
- 使用http协议访问接口,最大的问题就是用抓包工具,直接就能看到明文的访问url,参数列表和参数值。
- 随意抓数据,产品很轻松被山寨。
- 随意修改请求中的参数值可能攻击和破解的后端接口,找到侵入点,进行攻击。
将http请求改造为https请求
- 要有一个SSL证书
- 在spring boot中启用HTTPS
- 将HTTP重定向到HTTPS(可选)
ssl证书 PEM、CER、JKS、PKCS12
Java Key Storage,很容易知道这是 JAVA 的专属格式,利用 JAVA 的一个叫 keytool 的工具可以进行格式转换。一般用于 Tomcat 服务器。
2.如何生成证书
- 通过keytool生成;
keytool -genkey -alias tomcat -dname "CN=Andy,OU=kfit,O=kfit,L=HaiDian,ST=BeiJing,C=CN" -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 365
-genkey:生成key;
-alias:key的别名;
-dname:指定证书拥有者信息
-storetype:密钥库的类型为JCEKS。常用的有JKS(默认),JCEKS(推荐),PKCS12,BKS,UBER。每个密钥库只可以是其中一种类型。
-keyalg:DSA或RSA算法(当使用-genkeypair参数),DES或DESede或AES算法(当使用-genseckey参数);
-keysize:密钥的长度为512至1024之间(64的倍数)
-keystore:证书库的名称
-validity:指定创建的证书有效期多少天
dname的值详解:
  CN(Common Name名字与姓氏)
  OU(Organization Unit组织单位名称)
  O(Organization组织名称)
  L(Locality城市或区域名称)
  ST(State州或省份名称)
- 通过证书授权机构购买
3.证书存放路径:src->main->resource下,注意springboot和springcloud的版本
网关层改造
1.gateway->application.properties
#https端口号.
server.port: 1101
#证书的路径.
server.ssl.key-store: classpath:keystore.p12
#证书密码,请修改为您自己证书的密码.
server.ssl.key-store-password: 123456
#秘钥库类型
server.ssl.keyStoreType: PKCS12
#证书别名
server.ssl.keyAlias: tomcat
2.postman调用需要设置https证书,注意postman版本