目录

一句话概括:现在网站访问基本都需要使用https访问,否则浏览器就会报不安全提示,本文针对springboot+apache前后端分离的项目的https设置与部署进行说明。

1. 引言

当前访问互联网上的应用,基本都使用https了,否则浏览器会提示不安全,存在信息安全风险,还影响用户体验。最近公司需要对当前http访问的项目进行https部署,当前项目是使用前后端分离,后端使用springboot,前端使用apache,本文将对部署过程进行记录,并对https及相关知识做一下梳理,主要包括以下内容:

  • 对https、证书、openssl和keytool进行简要解释,了解相关概念。
  • 使用openssl及keytool自签证书
  • 对springboot项目添加https访问支持
  • 对apache添加https访问支持

2. 了解https、证书、openssl及keytool

2.1 https

2.1.1 什么是https

使用http已经可以完成功能,为什么还需要使用https,原因是使用http传输的内容是明文的,明文的数据传输容易被拦截,造成数据容易被修改,数据内容容易泄露的危险,如何解决这种不安全问题,当然是需要对数据进行加密传输,于是,就有了https。https是Hyper Text Transfer Protocol over Secure Socket Layer的缩写,表示安全的超文本传输协议,它基于SSL/TLS协议对传输的数据进行加密,以保证传输过程中的安全性,所以https协议=SSL/TLS+http协议

2.1.2 https解决什么问题

一般对于信息安全问题,主要需要解决三大问题:身份明确性,数据保密性,数据完整性,因此,https针对这三个问题的解决方法是(1)使用数字证书识别身份;(2)使用加密技术(对称加密和非对称加密)保证数据保密性;(3)使用数据签名防止数据被篡改;具体这里涉及到对称加密,非对称加密,数字签名,数字证书及SSL/TLS的运行原理等概念,此处不详细展开,可以参考文章《一文看懂HTTPS、证书机构(CA)、证书、数字签名、私钥、公钥》和《SSL/TLS协议运行机制的概述》。

2.2 证书

2.2.1 证书内容

刚才已经说到,https是使用数字证书来识别身份,即确定当前访问的服务器是真的。数字证书由权威的颁发机构(CA)在验证服务器身份后颁发的一种数字证书,内容包含加密后服务器的公钥、权威机构的信息、有效期,证书内容的数字签名(通过Hash函数计算得到证书数字摘要,然后用权威机构私钥加密数字摘要得到数字签名),签名计算方法以及证书对应的域名。最重要的是服务器的公钥,另外,这里所说的CA可以是商用的,也可以自建来私有使用(只是自建的CA生成的证书浏览器不公认)。

公钥、私钥是非对称加密中的概念:公钥(public key)是对外开放的,私钥(private key)是自己拥有的。公钥加密的数据,只能用私钥解密。私钥加密的数据,只能用公钥解密。

2.2.2 验证证书过程

数字证书是使用数字签名来识别身份。当客户端收到服务器的证书之后,使用CA的公钥对证书本身进行解密得到服务端的公钥和证书的数字签名,数字签名经过CA公钥解密得到证书信息摘要。然后证书签名的方法计算一下当前证书的信息摘要,与收到的信息摘要作对比,如果一样,表示证书一定是服务器下发的,没有被中间人篡改过。详细可参见《数字证书基本知识总结》、《Java 和 HTTP 的那些事(四) HTTPS 和 证书》、《一次看懂 Https 证书认证

2.2.3 证书种类

前面使用到的证书从使用者来看,分别有CA证书,服务端(server)证书和客户端(client)证书。其中,CA证书作为根证书,由它来签发server证书和client证书,也由它的公钥和私钥对server证书和client证书进行识别。server证书的公钥和私钥用于https通信过程数据加解密等操作。一般对于服务器的单向认证,只需要CA证书和服务端证书。

按证书格式分,X.509#DER二进制格式证书,常用后缀.cer .crt;X.509#PEM文本格式证书,常用后缀.pem;有的证书内容是只包含公钥(服务器的公钥),如.crt、.cer、.pem;有的证书既包含公钥又包含私钥(服务器的私钥),如.pfx、.p12

2.3 openssl

openssl 是一套密码库工具,用以支持SSL/TLS 协议的实现,可以用它生成证书,进行数据加解密,计算消息摘要等等。通过它可以进行自签名证书(把自己当作CA机构),实现https访问。本文使用的就是这种方式。一般linux已自带安装,没有安装的需要下载安装。

2.4 keytool

keytool是一个Java数据证书的管理工具 ,位置是在java安装目录下的bin目录。keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中。 注意keystore不仅可以存储数字证书,还可以存储密钥。存储在 Keystore 文件中的对象有三种类型:Certificate、PrivateKey 和 SecretKey 。Certificate 就是证书,PrivateKey 是非对称加密中的私钥,SecretKey 用于对称加密,是对称加密中的密钥。因此,对于java应用中,可以直接使用keytool即可生成相应的keystore进行https设置。

3. 自签证书

了解了基本概念后,现在开始动手进行https部署。第一步是先进行自签证书,这里使用openssl生成证书,然后使用keytool生成相应的keystore文件。

以下命令操作在linux下完成,做的是服务端单向认证

3.1 证书生成过程

3.1.1 自建CA证书

  1. # 生成根证书私钥
  2. openssl genrsa -des3 -passout pass:111111 -out ca.key 2048
  3. # 签发根证书
  4. openssl req -new -x509 -days 3650 -passin pass:111111 -key ca.key -out ca.crt -subj "/C=CN/ST=GD/L=GZ/O=test/OU=test/CN=${ip或域名}"

说明,上述操作中:

  • pass:111111 表示ca证书的密码,可以自定义,这样可以避免以交互方式输入密码,密码可以自定义。
  • 参数-subj 中,CN为根证书的域名,请根据实际情况填写。
  • 由于是自签,参数days可以随便填数量。

3.1.2 CA签发服务端证书

  1. # 生成服务器证书私钥
  2. openssl genrsa -des3 -passout pass:111111 -out server.key 2048
  3. # 生成服务器证书请求
  4. openssl req -new \
  5. -sha256 \
  6. -key server.key \
  7. -passin pass:111111 \
  8. -subj "/C=CN/ST=GD/L=GZ/O=test/OU=test/CN=${ip或域名}" \
  9. -reqexts SAN \
  10. -config <(cat /path/to/openssl.cnf \
  11. <(printf "[SAN]\nsubjectAltName=IP:${ip或域名}")) \
  12. -out server.csr
  13. # 签发服务器证书
  14. openssl ca -in server.csr \
  15. -days 3650 \
  16. -passin pass:111111 \
  17. -md sha256 \
  18. -keyfile ca.key \
  19. -cert ca.crt \
  20. -extensions SAN \
  21. -config <(cat /path/to/openssl.cnf \
  22. <(printf "[SAN]\nsubjectAltName=IP:${ip或域名}")) \
  23. -out server.crt

说明,上述操作中:

  • 参数-subj 中,CN为根证书的域名,请根据实际情况填写。
  • /path/to/openssl.cnf,请根据实际的openssl.cnf位置修改。
  • 参数[SAN]\nsubjectAltName,若使用IP,则以IP:开头,若是域名,使用DNS:开头。

3.1.3 证书存入keystore文件

  1. # 生成服务器证书转pkcs12
  2. openssl pkcs12 -export -in server.crt -passin pass:111111 -passout pass:111111 -inkey server.key -out server.pkcs12
  3. # pkcs12转keystore
  4. keytool -importkeystore -v -srckeystore server.pkcs12 -srcstoretype pkcs12 -srcstorepass 111111 -destkeystore server.jks -deststoretype jks -deststorepass 111111 -noprompt

至此,我们已经生成了后面需要使用到的ca.crtserver.keyserver.crtserver.jks

3.2 证书生成注意事项

  1. mkdir -p /etc/pki/CA
  2. cd /etc/pki/CA
  3. touch index.txt
  4. touch serial
  5. echo 01 > serial
  • 遇到类似”update database“错误,则清空index.txt内容再重新执行命令。

4. 后端springboot工程添加https访问

4.1 springboot工程添加ssl配置项

java工程使用keystore进行证书管理,先把server.jks放到springboot工程的resource目录下。然后在springboot配置文件application.properties添加以下配置:

  1. # https访问端口
  2. server.port=443
  3. server.ssl.key-store=server.jks
  4. server.ssl.key-alias=server
  5. server.ssl.enabled=true
  6. server.ssl.key-store-password=111111
  7. server.ssl.key-store-type=JKS

4.2 添加内置tomcat的http转发https

如果是使用tomcat部署,其实直接在tomcat的配置文件中进行配置https的connector即可。对于springboot,一般我们通过添加配置文件,以实现对tomcat的配置修改。新建TomcatConfig.java文件,添加以下代码:

  1. @Bean
  2. public TomcatServletWebServerFactory tomcatServletWebServerFactory(Connector connector) {
  3. TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
  4. @Override
  5. protected void postProcessContext(Context context) {
  6. SecurityConstraint securityConstraint = new SecurityConstraint();
  7. securityConstraint.setUserConstraint("CONFIDENTIAL");
  8. SecurityCollection collection = new SecurityCollection();
  9. collection.addPattern("/*");
  10. securityConstraint.addCollection(collection);
  11. context.addConstraint(securityConstraint);
  12. }
  13. };
  14. tomcat.addAdditionalTomcatConnectors(connector);
  15. return tomcat;
  16. }
  17. @Bean
  18. public Connector connector(){
  19. Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
  20. connector.setScheme("http");
  21. //http端口
  22. connector.setPort(8080);
  23. connector.setSecure(false);
  24. // https端口,即server.port
  25. connector.setRedirectPort(serverPort);
  26. return connector;
  27. }

说明,此处新建了http的Connector,并把http的访问都转发到https,这样,当用户访问http时直接跳转为https。若需要http和https同时使用,则把setRedirectPort去掉即可。

5. 前端apache添加https访问

5.1 apached.conf添加ssl支持

5.1.1 启用需要的模块

  1. LoadModule rewrite_module modules/mod_rewrite.so
  2. LoadModule ssl_module        modules/mod_ssl.so
  3. LoadModule socache_shmcb_module modules/mod_socache_shmcb.so

5.1.2 引入ssl配置

使用Include引入ssl配置,如下:

  1. Include conf/extra/httpd-ssl.conf

5.1.3 修改配置Directory

把允许重写设置为All,把AllowOverride None 改为 AllowOverride all

  1. <Directory "/root/path/">
  2. Options Indexes FollowSymLinks
  3. AllowOverride all
  4. Require all granted
  5. </Directory>

5.2 httpd-ssl.conf 添加ssl配置

前端已经引入httpd-ssl.conf文件,因此,需要对此文件进行ssl配置。如下:

  1. # 启用https端口
  2. Listen 443 https
  3. # 启用SSL并设置服务端证书及私钥
  4. SSLEngine on
  5. SSLCertificateFile "/path/to/server.crt"
  6. SSLCertificateKeyFile "/path/to/server.key"

说明:根据实际情况设置证书路径。

5.3 添加http转发https

在网站目录下创建一个.htaccess文件,写入如下规则,把全部80端口的请求都转发到本机的https对应的端口(默认443):

  1. RewriteEngine On
  2. RewriteCond %{SERVER_PORT} 80
  3. RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R,L]

5.4 访问后端接口地址添加https地址

前端需要调用后端接口,由于已经改为使用https通信,因此,调用接口需要从原来http地址,改为https访问的端口。上述全部配置完成后,重启apache即可(重启需要输入server.key对应的密码)

6. 客户端添加证书

最后,由于使用的是自签名的证书,浏览器不认识这证书,因此,需要把自签的CA证书添加到浏览器中,才能正常访问。以chrome浏览器为例,设置-》高级》隐私设置和安全性》管理证书》受信息的根证书颁发机构,导入ca.crt。这样,就可以愉快地使用https,不提示安全问题了。

7. 总结

本文通过操作实例进行了对springboot+apache前后端分离项目的https部署,先对https、证书、openssl及keytool进行初步的了解,然后通过openssl和keytool生成证书及keystore,接着对后端springboot及前端的apache分别进行配置。希望可以帮助到同样需要进行https部署的同学。

参考资料

往期文章

关注我的公众号(搜索Mason技术记录),获取更多技术记录:

springboot+apache前后端分离部署https的更多相关文章

  1. SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题

    原文链接:https://segmentfault.com/a/1190000012879279 当前后端分离时,权限问题的处理也和我们传统的处理方式有一点差异.笔者前几天刚好在负责一个项目的权限管理 ...

  2. Springboot+vue前后端分离项目,poi导出excel提供用户下载的解决方案

    因为我们做的是前后端分离项目 无法采用response.write直接将文件流写出 我们采用阿里云oss 进行保存 再返回的结果对象里面保存我们的文件地址 废话不多说,上代码 Springboot 第 ...

  3. springboot + mybatis 前后端分离项目的搭建 适合在学习中的大学生

    人生如戏,戏子多半掉泪! 我是一名大四学生,刚进入一家软件件公司实习,虽说在大学中做过好多个实训项目,都是自己完成,没有组员的配合.但是在这一个月的实习中,我从以前别人教走到了现在的自学,成长很多. ...

  4. SpringBoot+Vue前后端分离项目,maven package自动打包整合

    起因:看过Dubbo管控台的都知道,人家是个前后端分离的项目,可是一条打包命令能让两个项目整合在一起,我早想这样玩玩了. 1. 建立个maven父项目 next 这个作为父工程,next Finish ...

  5. SpringBoot +Vue 前后端分离实例

    今天下了Vue,想试一试前后端分离的实现,没想到坑还不少,这里就记录一下我遇到的坑和我的代码: 一.Vue的下载安装:从网上找就好了,没什么问题,除了下载以后,要把镜像库改成淘宝的,要不然太慢了. 二 ...

  6. SpringBoot,Vue前后端分离开发首秀

    需求:读取数据库的数据展现到前端页面 技术栈:后端有主要有SpringBoot,lombok,SpringData JPA,Swagger,跨域,前端有Vue和axios 不了解这些技术的可以去入门一 ...

  7. Jeecg-Boot 2.0 版本发布,基于Springboot+Vue 前后端分离快速开发平台

    目录 Jeecg-Boot项目简介 源码下载 升级日志 Issues解决 v1.1升级到v2.0不兼容地方 系统截图 Jeecg-Boot项目简介 Jeecg-boot 是一款基于代码生成器的智能开发 ...

  8. SpringBoot+Vue 前后端合并部署

    前后端分离开发项目 前端vue项目 服务端springboot项目 如何将vue的静态资源整合到springboot项目里,通过启动jar包的方式部署服务. 前端项目执行npm run build 命 ...

  9. VUE开发(二)nginx配合vue来实现前后端分离部署

    一.引言 由于本地是采用vue+spring boot实现的前后端分离项目,本机启动的时候先启动后场服务,再单独启动vue工程,然后可以实现全流程贯穿,但是我们要部署到服务器上的时候,一般都是打一个j ...

随机推荐

  1. F#周报2019年第45期

    新闻 邀请博客主们:2019年的F# Advent日历 宣告ML.NET 1.4 .NET Core与Jupyter笔记本 在Jupyter笔记本中使用ML.NET 用于Windows桌面的.NET ...

  2. 机器学习之scikit-learn库

    前面讲到了,这个库适合学习,轻量级,所以先学它. 安装就不讲了,简单.不过得先安装numpy和pandas库才能安装scikit-learn库. 如果安装了anaconda得话,会自带有这个库. -- ...

  3. jq实现多选框及反选

    1 效果图 2 html <div class="main"> <table> <tr> <th><input type=&q ...

  4. liunx查看日志 | 最实用命令和方法

    1.业务系统访问量不是很大的时候,使用这个,有bug的地方操作下,直接看最后操作的日志 tail  -fn100  catalina.log   查询日志尾部最后100行的日志,并且随文件;   2. ...

  5. python 基础之 模块

    Python 基础之模块 一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 就是一个python文件中定义好了类和方法,实现了一些功能,可以被别的python文 ...

  6. Python 基础 三 反射

    Python 基础 三 反射 今天我们先介绍一下反射这个概念,啥是反射?反射就是自己检测自己.在我们Python的面向对象中的反射是啥意思呢?就是通过字符串的形式操作对象相关的属性.python中的一 ...

  7. Golang stackError 补充go错误定位能力

    用过go的都知道,go的error实现很简单,errors.New实现的error类并不存储堆栈数据,这导致一个问题,就是多次error return后,或panic后recover了,找不到触发异常 ...

  8. 设置 DNS 服务器转发试验

    一.主节点的配置 1.yum install bind -y 安装 DNS 服务 2.vim /etc/named.conf 编辑 DNS 的配置文件 3. vim /etc/named.rfc191 ...

  9. Lab8:文件系统

    文件系统的概念 文件系统是操作系统中管理持久性数据的子系统,提供数据存储和访问功能 文件是具有符号名,由字节序列构成的数据项集合 文件系统的功能 分配文件磁盘空间 管理文件块(位置和顺序) 管理空闲空 ...

  10. Rio手把手教学:如何打造容器化应用程序的一站式部署体验

    11月19日,业界应用最为广泛的Kubernetes管理平台创建者Rancher Labs(以下简称Rancher)宣布Rio发布了beta版本,这是基于Kubernetes的应用程序部署引擎.它于今 ...