1 给工程添加HTTPS支持
1.1 HTTPS简介
HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。
服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据。
1.2 解密、加密、验证原理图
-
客户端发起HTTPS请求
这个没什么好说的,就是用户在浏览器里输入一个https网址,然后连接到server的443端口。
-
服务端的配置
采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面(startssl就是个不错的选择,有1年的免费服务)。这套证书其实就是一对公钥和私钥。如果对公钥和私钥不太理解,可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。
-
传送证书
这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。
-
客户端解析证书
这部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随即值。然后用证书对该随机值进行加密。就好像上面说的,把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容。
-
传送加密信息
这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。
-
服务段解密信息
服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密。所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。
-
传输加密后的信息
这部分信息是服务段用私钥加密后的信息,可以在客户端被还原
-
客户端解密信息
客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容。整个过程第三方即使监听到了数据,也束手无策。
1.3 SSL
-
概念
- (Secure Sockets Layer,安全套接层)
- 这是一种为网络通信提供安全及数据完整性的一种安全协议,SSL在网络传输层对网络连接进行加密。
-
SSL协议可以分为两层
-
SSL记录协议(SSL Record Protocol)
- 它建立在可靠的传输协议如TCP之上,为高层协议提供数据封装、压缩、加密等基本功能支持;
-
SSL握手协议(SSL Handshake Protocol)
- 它建立在SSL记录协议之上,用于在实际数据传输开始之前,通信双方进行身份认证、协商加密算法、交换加密密钥等。
-
-
证书生成
-
使用SSL需要我们先生成一个证书,这个证书我们可以自己生成,也可以从SSL证书授权中心获得,
自己生成的不被客户端认可,从授权中心获得的可以被客户端认可,提供SSL授权证书的服务商有很多, -
使用Java命令keytool来生成证书
- 语法:keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 365
- 1.-storetype 指定密钥仓库类型
- 2.-keyalg 生证书的算法名称,RSA是一种非对称加密算法
- 3.-keysize 证书大小
- 4.-keystore 生成的证书文件的存储路径
- 5.-validity 证书的有效期
-
-
操作步骤
-
1.将生成的证书文件放置于项目的根目录下
-
2.修改application.properties文件,添加HTTPS支持
- 在application.properties中添加如下代码:
- server.ssl.key-store=keystore.p12
- server.ssl.key-store-password=111111
- server.ssl.keyStoreType=PKCS12
- server.ssl.keyAlias:tomcat
- 第一行指定签名文件,第二行指定签名密码,第三行指定密钥仓库类型,第四个是别名。
-
-
HTTP自动转向HTTPS
-
用户有可能继续使用HTTP来访问你的网站
-
需要添加HTTP自动转向HTTPS的功能,当用户使用HTTP来进行访问的时候自动转为HTTPS的方式。
-
在入口类中添加相应的转向Bean
@Bean public EmbeddedServletContainerFactory servletContainer() { TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() { @Override protected void postProcessContext(Context context) { SecurityConstraint constraint = new SecurityConstraint(); constraint.setUserConstraint("CONFIDENTIAL"); SecurityCollection collection = new SecurityCollection(); collection.addPattern("/*"); constraint.addCollection(collection); context.addConstraint(constraint); } }; tomcat.addAdditionalTomcatConnectors(httpConnector()); return tomcat; } @Bean public Connector httpConnector() { Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); connector.setScheme("http"); //Connector监听的http的端口号 connector.setPort(8080); connector.setSecure(false); //监听到http的端口号后转向到的https的端口号 connector.setRedirectPort(8443); return connector; }
-
http请求转向测试
- 访问http://localhost:8080
-
2 给tomcat添加HTTPS支持
2.1 windows平台
-
生成keystore文件
-
C:\Users\Administrator>keytool -genkey -alias tomcat -keyalg RSA
-
输入密钥库口令: 111111
-
再次输入新口令: 111111
-
您的名字与姓氏是什么?
[Unknown]: jeffrey
-
您的组织单位名称是什么?
[Unknown]: jeffreyhome
-
您的组织名称是什么?
[Unknown]: jeffreyhome1
-
您所在的城市或区域名称是什么?
[Unknown]: jeffreyhome2
-
您所在的省/市/自治区名称是什么?
[Unknown]: jeffreyhome2
-
该单位的双字母国家/地区代码是什么?
[Unknown]: cn
-
CN=tuhao, OU=tuhaojia, O=fnic, L=didu, ST=didu, C=cn是否正确?
[否]: y
-
输入 <tomcat> 的密钥口令
- (如果和密钥库口令相同, 按回车): 直接按回车
-
完毕后会在当前目录下,会产生一个:.keystore文件
-
-
1.2 导出证书
- a. 拷贝证书到tomcat的bin目录下
- b. D:\Tomcat7\bin>keytool -selfcert -alias tomcat -keystore .keystore
- c. 输入密钥库口令:(此处为上面生成证书时输入的111111)
- d. D:\Tomcat7\bin>keytool -export -alias tomcat -keystore .keystore -storepass changeit -rfc -file tomcat.cer
- e. 在D:\Tomcat7\bin>下生成tomcat.cer证书文件。
- f. 将该文件发给使用者,让他们安装该证书,并将证书安装在“受信任的根证书颁发机构”区域中。
-
1.3 配置tomcat
- 打开$CATALINA_BASE/conf/server.xml 找到“SSL HTTP/1.1 Connector” 那一块
<Connector port="8443" protocol="HTTP/1.1" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" keystoreFile="bin/.keystore" keystorePass="111111" clientAuth="false" sslProtocol="TLS" />
- 打开$CATALINA_BASE/conf/server.xml 找到“SSL HTTP/1.1 Connector” 那一块
-
linux平台
- 同上