HTTP最后的挣扎,深度解析HTTPS的原理与使用

引言

全站HTTPS的时代已经到来:

苹果宣布2017年App Store中的所有应用都必须使用HTTPS加密连接

百度、Google等搜索引擎优先收录HTTPS页面并提升排名

百度、阿里巴巴等互联网巨头均启用全站HTTPS加密

新一代HTTP/2协议的支持需以HTTPS为基础

一. HTTP回顾

Http(Hypertexttransfer protocol):超文本传输协议,约定了浏览器和万维网服务器之间通信的规则,通信规则规定了客户端发送给服务器的内容格式,也规定了服务器发送给客户端的内容格式。客户端发送给服务器的格式叫“请求协议”;服务器发送给客户端的格式叫“响应协议”。目前我们使用的是HTTP 1.1。

补充:HTTP无状态是什么意思?[M1] 

Http协议是一个无状态的协议,同一个客户端的这次请求和上次请求没有关系。

二. HTTPS协议

2.0. https现象

绝大部分的网站都是采用HTTP协议的

但是我们发现越来越多的网站开始使用Https协议,如:百度,淘宝,京东...

2.1. https由来

Http在安全上有一定的缺陷:

1)        明文传送

2)        消息完整性检测的不足

这种安全缺陷很容易被利用以获取个人信息,如手机号、身份信息、信用卡号等。尤其是当下网上交易、支付等已经变得如此普遍。

2.2. https简介

Https(Hyper TextTransfer Protocol over Secure Socket Layer):网景Netscape公司提出,HTTPS是在TCP和HTTP之间增加了保障数据通信安全性的SSL(Secure Sockets Layer) 协议,现在SSL已经被新的TLS(TransportLayer Security)取代。

总结:Https  =  Http +  SSL/TLS

总结:HTTP协议是基于TCP/IP协议的,有时也承载于TLS/SSL协议之上,这个时候,就成了我们的HTTPS。

注意:HTTP的默认端口号为80,HTTPS的默认端口号为443。

2.3. https需要解决的问题

Ø  身份验证

l  确保通信双方身份的真实性。直白一些,A希望与B通信,A如何确认B的身份不是由C伪造的。(由C伪造B的身份与A通信,称为中间人攻击)

Ø  通信加密

l  通信的机密性、完整性依赖于算法与密钥,通信双方是如何选择算法与密钥的。

三. HTTPS核心

3.0. 基本概念

Ø  数字证书

l  数字证书是互联网通信中标识双方身份信息的数字文件,由CA签发。

Ø  CA

l  CA(certification authority)是数字证书的签发机构。作为权威机构,其审核申请者身份后签发数字证书,这样我们只需要校验数字证书即可确定对方的真实身份。

附:如何查看一个网站的数字证书(前提是该网站使用HTTPS协议!!!):

3.1. SSL协议加密方式

SSL协议既用到了对称加密也用到了非对称加密(公钥加密),在建立传输链路时,SSL首先对对称加密的密钥使用公钥进行非对称加密,链路建立好之后,SSL对传输内容使用对称加密。

Ø  对称加密

l  速度高,可加密内容较大,用来加密会话过程中的消息

Ø  非对称加密

l  加密速度较慢,但能提供更好的身份认证技术,用来加密对称加密的密钥

3.2. 认证方式

1.单向认证,就是传输的数据加密过了,但是不会校验客户端的来源

2.双向认证,如果客户端浏览器没有导入客户端证书,是访问不了web系统的,找不到地址

如何选择认证方式:

u  如果只是加密,单向就行

u  如果想要让使用系统的人没有客户端证书就访问不了系统的话,就采用双向

3.2.1 单向认证流程

3.2.2 双向认证流程

3.2.3 单向认证与双向认证区别

1)        服务器端多了一个校验客户端证书的步骤

2)        服务器端将决定的加密方式通过客户端公钥进行加密,返回给客户端

四. HTTPS配置(以单向认证为例)

4.1. 生成SSL证书

4.1.1 常见的密钥和证书管理工具

a)        OpenSSH的ssh –keygen

b)        OpenSSL

c)        Keytool

由于OpensSSL曾爆出严重的安全漏洞,而且我们jdk本身也包含了keytool,所以我们使用keytool工具来管理我们的密钥和证书。

4.1.2 keytool简介

Oracle公司提供的证书制作工具,在JDK1.4以后的版本都包含了这一工具,它的位置:<JAVA_HOME>\bin\keytool.exe

keytool命令:

4.1.3 生成keystore文件

1.进入 DOS 命令行,具体如下:开始->运行->cmd->cd 到安装jdk的目录,这里我是D:\java\jdk7\bin

2.使用keytool命令生成keystore文件

keytool -genkey -alias [keyEntry_name] -keyalg RSA -keystore[keystore_name]-keysize 2048

例:
keytool -genkey -v-alias tomcat -keyalg RSA -keystore D:\certificate_list\tomcat.keystore -keysize2048 -validity 36500

参数说明:

-v

-alias                 指定keystore文件的文件名

-keyalg               指定算法

-keystore          指定keystore文件的保存位置

-keysize             指定私钥的位数

-validity             指定证书有效期,36500表示100年,默认值是90天

 

假定目标机器的域名是“localhost”

 

A、 输入keystore密码:

l  此处需要输入大于6个字符的字符串,我们指定keystore的密码为:123456,该密码必须牢记!!!缺省密码为:changeit。

B、 您的名字与姓氏是什么?

l  这是必填项,并且必须是tomcat部署主机的域名或者IP(就是你将来要在浏览器中输入的访问地址),否则浏览器会弹出警告窗口,提示用户证书与所在域不匹配。在本地做开发测试时,应填入“localhost”。

C、 您的组织单位名称是什么?

l  可以不填,也可以填其他英文或者中文

D、 您的组织名称是什么?

l  可以不填,也可以填其他英文或者中文

必须与证明文件上的名称一致(目前我们自己制作证书,所以没有关系)

E、 您所在城市或区域名称是什么?

l  可以不填,也可以填其他英文或者中文

F、 您所在的州或者省份名称是什么?

l  可以不填,也可以填其他英文或者中文

G、 该单位的两字母国家代码是什么?

a)        中国填:CN,其他国家填其缩写

H、 在系统询问“正确吗?”时,对照输入信息,如果符合要求则使用键盘输入字母“y”,否则输入“n”重新填写上面的信息。
D、 输入<tomcat>的主密码

l  这项较为重要,会在tomcat配置文件中使用,建议输入与keystore的密码一致,设置其它密码也可以,完成上述输入后,直接回车则在你在第二步中定义的位置找到生成的文件。

生成keystore文件如下:

4.1.4 生成安全证书

keytool -export -alias tomcat -file D:/certificate_list/tomcat.cer-keystore D:\certificate_list\tomcat.keystore -validity 36500

注意:安全证书是由keystore文件生成的,所以命令中的-alias-keystore与上面的keysore文件是对应的

执行该命令,会提示让你输入keystore密码:

生成cer文件如下:

4.2. 安装安全证书

双击生成的cer后缀的安全证书,一般情况下证书会自动导入到浏览器的受信任证书列表,但是有可能出现安装失败的情况,如果出现这种情况,需要手动导入证书。

4.2.1 自动安装

 

4.2.2 手动导入(以谷歌浏览器为例)

打开设置

点击显示高级设置

找到HTTPS/SSL,点击管理证书,点到受信任的根证书颁发机构,点击导入

注意:由于我们只是生成自签名的https证书,所以证书是需要被我们安装到需要访问服务器资源的客户端的,如果需要申请CA证书,就需要生成CSR文件,并将此文件提交给相应CA机构申请CA证书。

4.2.3 CA 中心和 SSL 数字证书提供商(排名不分先后)

Verisign

GlobalSign        https://cn.globalsign.com/      使用该机构证书网站:百度,淘宝,京东

Symantec          https://www.symantec.com/zh/cn                   使用该机构证书网站:苹果

GeoTrust           https://www.geotrust.com/  

 

证书属于收费服务,所以我们才需要自己制作证书,当然,也有提供免费证书服务的机构:

Let’s Encrypt    https://letsencrypt.org/

Startssl            https://www.startcomca.com/      

 

在一些云平台,如阿里云,腾讯云上均会提供相应的证书购买服务,如阿里云:

4.3. 配置应用程序

4.3.1 配置tomcat

在Eclipse中配置一个tomcat,打开Servers项目中的server.xml

找到下面这段注释:

<!-- Define a SSL HTTP/1.1 Connector on port 8443

         This connectoruses the JSSE configuration, when using APR, the

         connector shouldbe using the OpenSSL style configuration

         described in the APR documentation-->

在注释下面插入如下代码:

<Connector SSLEnabled="true" clientAuth="false" keystoreFile="D:\certificate_list\tomcat.keystore"keystorePass="123456"maxThreads="150"port="8643"protocol="HTTP/1.1"scheme="https"secure="true"sslProtocol="TLS"/>

解释:

SSLEnabled="true"     使用SSL协议

clientAuth="false"    指定验证方式为单向认证

keystoreFile          指定keystore文件的存放位置

keystorePass          指定keystore的密码

maxThreads="150"      指定最大线程数量

port="8643"           指定端口

protocol="HTTP/1.1"      指定使用协议版本

scheme="https"        使用HTTPS协议

secure="true"         使用安全验证

sslProtocol="TLS"     指定SSL协议

启动tomcat,使用https://localhost:8643访问,页面成功打开,即tomcat下的https配置成功:

4.3.2 设置应用程序http自动跳转到https

在项目的web.xml中插入如下代码:

<security-constraint>

    <web-resource-collection>

      <web-resource-name>SSL</web-resource-name>

      <url-pattern>/*</url-pattern>

    </web-resource-collection>

    <user-data-constraint>

      <transport-guarantee>CONFIDENTIAL</transport-guarantee>

    </user-data-constraint>

 </security-constraint>

在项目pom.xml的<plugins></plugins>节点中插入如下代码:

<plugin>

         <groupId>org.apache.tomcat.maven</groupId>

         <artifactId>tomcat7-maven-plugin</artifactId>

      <configuration>

          <port>8080</port>

          <path>/</path>

          <keystoreFile>D:\home\tomcat.keystore</keystoreFile>

          <keystorePass>123456</keystorePass>

      </configuration>

</plugin>

配置完成,即使通过http去访问项目也可以成功跳转到https

7. 其他

如果你使用自建服务器、云服务器可以这样操作,但是如果你使用了负载均衡产品,如:使用阿里云负载均衡将流量分发到后端多台ECS服务器上,这时由于产品特性,可能会与上面的操作有所不同。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值