一、前言
没做这个https的时候,感觉遥不可及。做了之后感觉并不是这么难。
二、聊一聊HTTP与HTTPS
此部分来源于:支持原博主,写的通俗易懂
(一)HTTP和HTTPS是什么?
我们使用浏览器访问一个网站页面,在浏览器的地址栏中我们会看到一串URL,如图:
网站的URL会分为两部分:通信协议
和域名地址
。
域名地址都很好理解,不同的域名地址表示网站中不同的页面,而通信协议,简单来说就是浏览器和服务器之间沟通的语言。网站中的通信协议一般就是HTTP协议和HTTPS协议。
1、HTTP协议
HTTP协议是一种使用明文数据传输的网络协议。一直以来HTTP协议都是最主流的网页协议,但是互联网发展到今天,HTTP协议的明文传输会让用户存在一个非常大的安全隐患。试想一下,假如你在一个HTTP协议的网站上面购物,你需要在页面上输入你的银行卡号和密码,然后你把数据提交到服务器实现购买。假如这个适合,你的传输数据被第三者给截获了,由于HTTP明文数据传输的原因,你的银行卡号和密码,将会被这个截获人所得到。现在你还敢在一个HTTP的网站上面购物吗?你还会在一个HTTP的网站上面留下你的个人信息吗?
2、HTTPS协议
HTTPS协议可以理解为HTTP协议的升级,就是在HTTP的基础上增加了数据加密。在数据进行传输之前,对数据进行加密,然后再发送到服务器。这样,就算数据被第三者所截获,但是由于数据是加密的,所以你的个人信息让然是安全的。这就是HTTP和HTTPS的最大区别。
其实如果你足够细心,你会发现现在很多大型互联网网站,如百度、淘宝、腾讯很早就已经把HTTP换成HTTPS了。
(二)HTTP和HTTPS的其他不同
数据加密传输,是HTTP和HTTPS之间的本质性区别,其实除了这个之外,HTTPS网站和HTTP网站还有其他地方不同。
当你使用Chrome浏览器访问一个HTTP网站的时候,你会发现浏览器会对该HTTP网站显示“不安全”的安全警告,提示用户当前所访问的网站可能会存在风险。
而假如你访问的是一个HTTPS网站时,情况却是完全不一样。你会发现浏览器的地址栏会变成绿色,企业名称会展示在地址栏中,地址栏上面还会出现一把“安全锁”的图标。这些都会给与用户很大的视觉上的安全体验。以下是EV证书在不同浏览器中的展现。
除了浏览器视觉上不同以外,HTTPS网站和HTTP网站还有一个很重要的区别,就是对搜索排名的提升,这也是很多站长所关注的地方。
百度和谷歌两大搜索引擎都已经明确表示,HTTPS网站将会作为搜索排名的一个重要权重指标。也就是说HTTPS网站比起HTTP网站在搜索排名中更有优势。
HTTPS网站相比起HTTP网站拥有着多种的优势,HTTP明显已经不能适应当今这个互联网时代,可以预见到HTTP在不久的将来将会全面被HTTPS所取代。
三、HTTP存在的安全性问题
- 使用明文进行通信,内容可能会被窃听;
- 不验证通信方的身份,通信方的身份有可能遭遇伪装;
- 无法证明报文的预设,报文有可能遭受纠正改。
HTTPS并不是新协议,而是让HTTP先和SSL(安全套接字层)通信,再由SSL和TCP通信,即通过HTTPS使用了隧道进行通信。
四、给SpringBoot项目配置https
https://segmentfault.com/a/1190000019976390
实战(一)使用阿里云的https证书
1、申请证书
申请证书的方法可以参考阿里云社区的一篇文章:https://yq.aliyun.com/articles/637307
2、下载申请好的证书
下载后,会是两个文件,一个pfx证书文件,一个密钥
3、SpringBoot中配置证书
首先把证书放进项目
yml文件:
#HTTPS http: port: 8080 server: port: 443 ssl: key-store: 证书名字.pfx key-store-password: 密钥 keyStoreType: PKCS12
其实这样就完事了,但是你发现了吗,当你访问http://www.baidu.com的时候会自动跳转到https://www.baidu.com
为了实现这个,咱们还需要配置自动跳转。
有很多方式,例如:通过Nginx,Apache,Tomcat之类的容器都是可以的。
下面介绍通过访问SpringBoot的8080端口自动跳转到443,也很简单
springboot2.X 在启动类中加入以下代码:
/** * 设置自动重定向http到https(80端口->443端口): * 在启动类中加入以下代码: * @return */ @Bean public ServletWebServerFactory servletContainer() { 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); } }; tomcat.addAdditionalTomcatConnectors(redirectConnector()); return tomcat; } private Connector redirectConnector() { Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL); connector.setScheme("http"); connector.setPort(8080); connector.setSecure(false); connector.setRedirectPort(443); return connector; }