一句话概括:现在网站访问基本都需要使用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设置。