前置条件:
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端口