web项目开发——http到https

一、背景

我们在日常web开发中,时常使用的是http协议在开发。比如时常使用tomcat、iis等做为我们的应用服务器。它们默认都是http协议传输数据。

https协议存在也好多年了,相对于http协议,https协议提供了相对更安全的数据传输方式。而且现在很多软件都是基于https制作的。如:CAS单点登录的实现,微信小程序的通讯等等。现在是时候改装你的项目为https了。

今天我们来从应用角度谈谈https到底是什么,它是如何工作的。

二、http与https区别

HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。

为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

HTTPS和HTTP的区别主要为以下四点:

一、https协议需要到ca申请证书,一般免费证书很少,需要交费。(而且,提前提一下:证书是对应域名的,域名又对应IP。所以,如果想要你的项目在公网使用https协议运行,前置条件很多的哦)

二、http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。

三、http和https使用的是完全不同的连接方式,用的端口也不一样,前者80,后者是443。

四、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。(HTTPS也是无状态的)

三、https原理

简言说:https其实就是在http应用层与tcp的IP层之间加了一层加密/身份验证。

应用层协议http,我想大家都明白也知道。它是一种无状态协议。

TCP/IP层,是网络数据传输中很重要的一层。它决定了数据的完整性。因为它经过了“三次握手”,是目前网络数据完整性的有效保证。(与其相应的协议是UDP协议,它是“尽最大努力的交付”的传输协议,本身不保证数据完整性,如:视频传输、音频传输等。想要深入学习的,推荐谢希仁教授《计算机网络》书(我的网络基础启蒙书籍呀))

加密/身份验证,这一块其实也挺杂。首先我们先需要对加密算法有个简单了解,加密分对称加密与非对称加密。导致加密/身份验证也有区别。这里我讲两种:一种是只加密数据,不做身份验证。另一种是既加密数据又加密身份。(加密算法,现在真的很多,分类也很多,希望有时间给大家整理一下)

四、http升级为https实例

1)背景

我在这里选择jdk自带工具keytool生成https安全证书,应用服务器选择tomcat。

2)软件工具

jdk1.8.0_65 apache-tomcat-7.0.53

3)单向https配置

① 生成证书

cmd命令行运行如下命令:

keytool -genkey -v -alias HttpsDemoD -keyalg RSA -validity 3650 -keystore E:\https_example\dan\HttpsDemoD.keystore

参数说明:genkey生成方式,对称或者非对称。alias定义别名(HttpsDemoD) keyalg指定加密算法 RSA(非对称加密算法)。FE:\https_example\dan\HttpsDemoD.keystore指定生成服务器证书库路径。validity证书有效期,天为单位,365为一年。(注:运行过程中需要定义密码,验证密码等操作,自己记住即可)

② 配置tomcat

打开tomcat配置文件server.xml(/conf/server.xml)文件,添加如下配置:

maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="E:\https_example\dan\HttpsDemoD.keystore" keystorePass="123456"/>

说明:这一步就是导入证书到应用服务器。密码、证书路径与上面生成的时候一致,可以看到tomcat默认https服务端口为8443.

③ 项目配置

配置运行在应用服务器上的项目,进行http到https的重定向(http仍然可以访问,因为作如下配置tomcat会对请求进行重定向)

SSL

/*

CONFIDENTIAL

4)双向https配置

①生成证书

生成服务端证书

keytool -genkey -v -alias HttpsDemoS -keyalg RSA -keystore E:\https_example\shuang\HttpsDemoS.keystore -validity 36500

生成客户端证书

keytool -genkey -v -alias mykey -keyalg RSA -storetype PKCS12 -keystore E:\https_example\shuang\HttpsDemoS.key.p12

说明:生成证书的操作类似上面单向证书生成,这里不再多说了。注意密码一定的保存好。

②证书相互认证

服务端信任客户端证书

1.由于不能直接将PKCS12格式的证书库导入,所以必须先把客户端证书导出为一个单独的CER文件。命令如下:

keytool -export -alias mykey -keystore E:\https_example\shuang\HttpsDemoS.key.p12 -storetype PKCS12 -storepass 123456 -rfc -file E:\https_example\shuang\HttpsDemoS.key.cer

注:alias的别名mykey必须与客户端证书别名一致。storepass为上述设置的密码

2.服务器信任客户端证书

keytool -import -v -file E:\https_example\shuang\HttpsDemoS.key.cer -keystore E:\https_example\shuang\HttpsDemoS.keystore

客户端信任服务端证书

keytool -keystore E:\https_example\shuang\HttpsDemoS.keystore -export -alias HttpsDemoS -file E:\https_example\shuang\HttpsDemoS.cer

③ 配置tomcat

maxThreads="150" scheme="https" secure="true"

clientAuth="false" sslProtocol="TLS"

keystoreFile="E:\https_example\shuang\HttpsDemoS.keystore" keystorePass="123456"

truststoreFile="E:\https_example\shuang\HttpsDemoS.keystore" truststorePass="123456" />

④ 配置项目web.xml

CLIENT-CERT

Client Cert Users-only Area

Authorization setting for SSL

SSL

/*

CONFIDENTIAL

说明:双向证书与单向证书配置主要区别就是客户端与服务端的认证,所以这里不再一一说明。但是需要说明的是,客户端是需要在客户端安装的,由于这里模拟的客户端与服务端在一起机器,所以直接安装即可。实际上是需要在客户端电脑安装的。

另外:项目在https协议下访问时,浏览器会警报不安全。这并非是不安全,只是我们的证书是自己制作的,并且没有得到证书认证机构认证,所以浏览器会报警告。解决办法:1就是设置浏览器使其信任,2就是上传证书到证书认证机构。

今天关于https的使用就讲到这里了。谢谢大家的支持,更新完了,非常抱歉。

还是那句话:点赞,转发,关注,留言就是对小编最好的支持。再次谢谢大家。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180514G0FM8900?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券