四、Https前后端接入

3,275 阅读4分钟

概念

HTTPS是在HTTP的基础上添加了SSL层,通过传输加密和身份认证保证传输过程中数据的安全性。

原理

HTTPS = HTTP + SSL/TLS

  • HTTP,客户端和服务器通过TCP建立连接后,客户端通过HTTP协议发送请求和接收服务端返回的请求。
  • SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层TCP与应用层HTTP之间对网络连接进行加密。[百度百科]
    enter description here

安全机制

  • 证书:通过第三方权威证书颁发机构(如VeriSign)验证和担保网站的身份,防止他人伪造网站身份与不知情的用户建立加密连接。
  • 密钥交换:通过公钥(非对称)加密在网站服务器和用户之间协商生成一个共同的会话密钥。
  • 会话加密:通过机制(2)协商的会话密钥,用对称加密算法对会话的内容进行加密。
  • 消息校验:通过消息校验算法来防止加密信息在传输过程中被篡改。

缺点

  • 安全性范围有限度,不能保证绝对安全
  • SSL加密和解密增加了额计算资源消耗
  • 同样网络环境下,通信变慢

前端实现

  1. 打开前端devops配置修改为挂载https,或者通过编排文件添加参数 (enable_https_cert: true)

devops修改实例

2.修改前端nginx.config的配置文件

# 1.文件在容器对应路径下
ssl_certificate /etc/ssl/devops/https_cert_crt;
ssl_certificate_key /etc/ssl/devops/https_cert_key;
# 2. 监听的端口后面添加ssl

如图:

nginx.config的配置文件示例

4.解决不安全链接

  • 描述:经过上述操作后重新部署前端代码,出现无法通过HTTPS加载的页面启动不安全的WebSocket连接

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版本