SSL + Docker + SpringBoot 搭建前后端分离环境

前置条件:

1. 一个域名

2.一个前端打包项目

3.一个后端打包项目

4.一台阿里云虚拟机

5. SSL的证书文件

一、前端配置https

1、准备一个vue项目,并且打包成dist包

npm run build

2、在阿里云上申请一个域名, 并且进行ICP备案(20天内完成)

3、域名完成备案后, 申请SSL免费证书

 此处的Nginx证书下载完后得到(domainName.key, domainName.pem)这两个文件

3、准备一个nginx的docker镜像

## 1. 可以预先创建一个nginx容器, 并且通过docker cp命令将下面三个文件夹复制到本地虚拟机的/home/nginx下 (之后删除掉此容器)
/etc/nginx/nginx.conf
/usr/share/nginx/html
/var/log/nginx

## 2.将步骤3中获取的2个证书文件,保存到云服务器的/home/nginx/cert下

## 3.修改nginx.conf配置文件, 注意注释的地方修改为对应的信息
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    server {
        listen 80;
        server_name qyangy.top; ## 这边写你申请到的域名
        rewrite ^(.*)$ https://$server_name$1 permanent;
    }

    server {
        listen 443 ssl;
        server_name qyangy.top; ## 这边写你申请到的域名
        
        ssl_certificate  /etc/nginx/cert/7727316_qyangy.top.pem; ## 这里对应步骤2中的证书, 路径的地址为步骤5中准备复制到的容器地址
        ssl_certificate_key /etc/nginx/cert/7727316_qyangy.top.key; ## 这里对应步骤2中的证书, 路径的地址为步骤5中准备复制到的容器地址

        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;

		ssl_session_cache shared:SSL:1m;

        fastcgi_param  HTTPS    on;
        fastcgi_param  HTTP_SCHEME  https;

        location / {
            proxy_set_header   X-Real-IP         $remote_addr;
			proxy_set_header   Host              $http_host;
			proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
			root   /usr/share/nginx/html;
			try_files $uri $uri/ /index.html;
        }
    }

    include /etc/nginx/conf.d/*.conf;
}


## 4、将vue打包后的dist中的文件复制到/home/nginx/html文件夹下

## 5.通过以下的docker命令创建一个容器
docker run --name myNginx -it -p 443:443 -p 80:80 \
-v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro \
-v /home/nginx/conf/conf.d:/etc/nginx/conf.d:ro \
-v /home/nginx/html:/usr/share/nginx/html:rw \
-v /home/nginx/cert:/etc/nginx/cert:rw \
-v /home/nginx/logs:/var/log/nginx --privileged=true -d --restart=always nginx

4、从浏览器通过https://domainName/就可以访问https网页

二、后端配置https

1、下载SSL证书tomcat版本(domainName.pfx, pfx-password.txt)

2、准备一个springboot项目,将步骤1中的两个文件放到resources目录下,并且 在application.properties中添加下面的内容

3、通过maven的package命令打包项目为jar包

4、将jar包保存到云服务器的本地/home/java文件夹下

5、将下面的内容保存为一个Dockerfile, 并且通过这个Dockerfile创建一个jdk1.8的镜像

FROM centos:centos7
MAINTAINER qyy<461748791@qq.com>
RUN mkdir /usr/local/jdk
WORKDIR /usr/local/jdk
ADD jdk-8u311-linux-x64.tar.gz /usr/local/jdk
 
ENV JAVA_HOME /usr/local/jdk/jdk1.8.0_311
ENV JRE_HOME /usr/local/jdk/jdk1.8.0_311/jre
ENV PATH $JAVA_HOME/bin:$PATH

6、通过以下的命令创建一个对应的容器

docker run -d -p 8080:8080 -p 8443:8443 --name myJDK -it  -v /home/java:/storage  qyy/jdk1.8

7、通过docker命令进入镜像, 执行jar包

docker exec -it myJDK /bin/bash
cd /storage
java -jar xxx.jar

8、此时服务开启,可以接受https开头的请求了, 但是http的请求会提示Bad Request This combination of host and port requires TLS

9、在springboot项目中添加配置以启用http重定向到https

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.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * @author qyy
 * .Date on 2022/5/8
 * .Description
 */

/**
 * http强制跳转https
 */
@Configuration
public class Http2Https {
    @Value("${server.port}")
    private int sslPort;//https的端口

    @Value("${server.http.port}")
    private int httpPort;//http的端口

    @Bean
    public TomcatServletWebServerFactory servletContainerFactory() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                //设置安全性约束
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                //设置约束条件
                SecurityCollection collection = new SecurityCollection();
                //拦截所有请求
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        //设置将分配给通过此连接器接收到的请求的方案
        connector.setScheme("http");

        //true: http使用http, https使用https;
        //false: http重定向到https;
        connector.setSecure(false);

        //设置监听请求的端口号,这个端口不能其他已经在使用的端口重复,否则会报错
        connector.setPort(httpPort);

        //重定向端口号(非SSL到SSL)
        connector.setRedirectPort(sslPort);

        tomcat.addAdditionalTomcatConnectors(connector);
        return tomcat;
    }
}

注意: 

1. 对于启用https,需要在阿里云服务器上的安全组配置对应的端口, 前端对应80、443后端需要启用8080和8443端口

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值