目录
什么是https?
https的利与弊?
https的原理和流程?
什么是证书/CA证书?
什么是单向SSL认证与双向SSL认证?
网站如何实现https?
网站实现https的一些补充说明
参考网页
一、什么是https
https(Secure Hypertext Transfer Protocol over Secure Socket Layer)安全超文本传输协议,基于http开发,使用安全套接字层(SSL)进行信息交换,简单来说它是http的安全版。
https使用的端口号是443,而不是http的80;https在应用层(即http)和TCP/IP层之间,加了一层SSL,主要做加解密和身份认证。
实际上,https的使用已经很广泛,如下图所示分别为百度的页面;地址栏中的地址显示,使用的协议是https,而左边绿色的小锁表名该连接是安全的;点击小锁可以显示https链接的详细信息,包括CA证书、ssl协议版本、加密算法等。
请注意:本文中提到的SSL既可能是SSL,也可能是TSL协议;实际上TSL的应用已经非常广泛,但TSL是SSL的升级版,因此仍然一般用SSL泛指SSL或TSL。
二、https的利与弊
1、安全性
信任主机:通过CA申请可以证明服务器身份的证书,可以使得客户端验证主机身份,从而信任主机【在某些情景下,服务器需要验证客户端的身份(称为双向SSL认证),这时客户端同样需要申请证书;但这种情况较少】如果一个网站A想假冒另一个网站B(如银行),那么A很难从CA申请到证书,则如果A实现了https,浏览器会提示链接不安全;但是如果A使用http,则仍然很危险!
防止数据泄露:通信数据被加密,可以防止数据泄露;http的信息是明文传播,安全性较低。
防止数据篡改:发送端对数据进行签名,接收端对数据及签名进行确认,防止数据被篡改。
2、效率
https由于需要握手(身份认证)、加解密等,消耗资源,效率较低;据ACM CoNEXT数据显示,使用https协议会使页面的加载时间延长近50%,增加10%到20%的耗电,更夸张的说https的效率仅为http的十分之一左右。
因此,如果一个网站的所有请求都使用https,效率会很低;因此很多网站只对包含敏感数据的请求采用https,普通请求仍然使用http。
3、费用
使用https的网站需要申请CA证书,CA证书由受信任的数字证书颁发机构颁发,以验证网站的身份。目前虽然有免费的证书,但只能对域名进行验证,不能验证组织机构,因此有一定局限性。
4、SEO
Google会优先考虑https,百度宣称不会主动抓取https网页(应该是暂时的吧);但https加载速度慢也会影响搜索排名。
考虑到影响SEO的因素多如牛毛,采用http还是https实在是微不足道,因此无须过多考虑。
三、https的原理和流程
https在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。TLS/SSL协议不仅仅是一套加密传输的协议,更是一件经过艺术家精心设计的艺术品,TLS/SSL中使用了非对称、对称加密以及HASH算法。握手过程的简单描述如下:
1、浏览器将自己支持的一套加密规则(包括SSL版本号、加密算法种类等众多信息)发送给网站。
2、网站从中选出一组加密规则(包括加密算法与HASH算法等),并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
3、获得网站证书之后浏览器要做以下工作:
a) 验证证书的合法性(颁发证书的机构是否合法、证书是否过期、证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。
b) 如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码,并用证书中提供的公钥加密。
c) 使用约定好的HASH计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。
4、网站接收浏览器发来的数据之后要做以下的操作:
a) 使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。
b) 使用密码加密一段握手消息,发送给浏览器。
5、浏览器解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密。
这里浏览器与网站互相发送加密的握手消息并验证,目的是为了保证双方都获得了一致的密码,并且可以正常的加密解密数据,为后续真正数据的传输做一次测试。另外,HTTPS一般使用的加密与HASH算法如下:
非对称加密算法:RSA,DSA/DSS
对称加密算法:AES,RC4,3DES
HASH算法:MD5,SHA1,SHA256
其中非对称加密算法用于在握手过程中加密生成的密码,对称加密算法用于对真正传输的数据进行加密,而HASH算法用于验证数据的完整性。由于浏览器生成的密码是整个数据加密的关键,因此在传输的时候使用了非对称加密算法对其加密。非对称加密算法会生成公钥和私钥,公钥只能用于加密数据,因此可以随意传输,而网站的私钥用于对数据进行解密,所以网站都会非常小心的保管自己的私钥,防止泄漏。
之所以同时使用了非对称加密和对称加密,是因为前者安全性高,但是计算量大效率低,因此用于加密数据量小且重要性高的秘钥;而后者恰好相反。
TLS握手过程中如果有任何错误,都会使加密连接断开,从而阻止了隐私信息的传输。
四、什么是证书/CA证书?
1、在网站和浏览器通信过程中,浏览器为了避免网站劫持,需要验证网站的身份。这个验证网站身份的东西就是证书。
2、证书既可以自己制作,也可以向负责管理签发证书的第三方结构进行申请,这个第三方结构,就是CA——Certificate Authority。一般来说,CA必须是行业和公众可以信任的,这样浏览器才能够信任该CA颁发的证书。
3、如果证书是自己制作的,或者颁发机构不是公认权威的机构,则浏览器无法确认主机蛇粉,便会有安全提示,下图所示为12036的购票页面:左侧为Chrome的风险提示,右侧为搜狗的风险提示。之所以浏览器认为连接不安全,是因为12306使用的证书颁发自SRCA,是中铁自己的认证中心,不是普遍信任的第三方机构。
4、前面提到过,https有3大功能:验证身份、加密、防篡改;如果只是用于加密和防篡改,自签发的证书是没有问题的。但是由于会有安全提示,不适合对外界用户使用,一方面用户体验差,另一方面用户会对网站的安全性产生质疑。
5、证书类型
按证书包含域名数量分为:
单域名:只针对这个域名有效,不能用在其它域名下。
多域名:只针对列出的多个域名有效。
通配符域名(wildcard):对任意子域名有小,显示的是 *.example.com。
注意:SSL所说的单个域名是一个完整的域名,一个子域名就算一个,而非一个顶级域名。如果网站有很多子域名,只需要申请真正需要的域名证书。
按验证的类别分:
域名认证(Domain Validation):认证你的域名所有权和网站,申请验证简单,几分钟即可。
组织机构认证(Organization Validation):认证的域名和公司信息,需要提交公司资料认证。
扩展认证(Extended Validation,简称EV):这种证书会在浏览器中出现“很明显”的绿色地址栏,给用户的可信度最高。有安全评估保证。
个人或小站点可用一类或二类,企业一般用二类认证,少数企业会用到EV认证。
6、证书是否收费?
对于域名认证证书,很多CA提供免费证书,如startssl、wosignssl等。收费证书比较有名的有VeriSign等。具体的申请方式可以到各个CA的官网去看。
更新(2017-04-25):startssl免费1年,1年后可续约;wosignssl的免费证书暂时关闭了。
startssl申请教程:https://www.freehao123.com/startssl-ssl/
五、什么是单向SSL认证与双向SSL认证?
前面我们提到,https的一个功能,是可以验证服务器的身份。
一般情况下,在客户端和服务器通信过程中,客户端需要认证服务器的身份,而服务器不需要认证客户端的身份;此时便是单向SSL认证。单向认证的服务器需要申请CA证书,客户端不需要。
在某些情况下,不但客户端要验证服务器的身份,服务器也要验证客户端的身份,此时便是双向SSL认证。双向SSL认证中,服务器和客户端都需要申请CA证书。双向SSL认证的情况较少,因此本文涉及的都是单向SSL认证。
六、网站如何实现https
目前,几乎所有浏览器都支持https协议,因此只要网站服务器能够支持https协议,双方便可以进行https通信。
如果网站使用自己的证书,则支持https需要包括生成证书和部署证书2个步骤;如果使用CA机构颁发的证书,则需要包括生成证书请求文件(CSR)、向CA申请证书和部署证书3个步骤。
下面以tomcat为例说明网站使用自己的证书实现https,使用CA颁发的证书的方式与之类似,不再赘述。
1、tomcat使用keytool工具生成证书;执行以下命令后会提示输入一些密码和信息
keytool -genkey -v -alias tomcat -keyalg RSA -keystore C:\Users\lizy-i\Desktop\tomcat.keystore -validity 2
其中2表示有效期为2天。
2、部署
在server.xml中找到如下代码
<!--
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
-->
干掉注释并添加一些信息,代码变为:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="C:\\Users\\lizy-i\\Desktop\\tomcat.keystore" keystorePass="123456"
truststoreFile="C:\\Users\\lizy-i\\Desktop\\tomcat.keystore" truststorePass="123456"/>
3、经过以上步骤,便可以使用https://localhost:8443,进行访问了(浏览器会提示不安全);此时服务器和客户端之间的通信便是由ssl保护的。
我在测试时遇到了一个奇怪的现象:启动服务器后,访问https://localhost:8443/正常,访问localhost:8443/会下载一个文件,莫名其妙。
七、网站实现https的一些补充说明
1、采用上述方式实现https之后,http(8080接口)仍然是可用的。
因此需要注意:如果访问localhost:8080,则会进行http访问;如果访问localhost:8443,则会进行https访问。
而在正式环境下,80和443分别是http和https的标准接口,只要指定协议,接口是可以省略的。因此在地址栏输入http://www.baidu.com,与输入www.baidu.com:80、http://www.baidu.com:80效果完全相同;输入https://www.baidu.com,与输入www.baidu.com:443、https://www.baidu.com:443效果完全相同。
2、如果想强制客户端只能使用https访问,而不能采用http,则可以在web.xml中加入以下配置。
<security-constraint>
<web-resource-collection>
<web-resource-name>securedapp</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
此时当客户端进行http访问时,服务器会自动转为https访问。它的效果就像加了一个重定向机制,拦截所有http请求到相应的https请求。
个人猜测,server.xml中的<Connector>中的redirectPort起到了一定作用。
3、如何实现一个网站部分url使用https,部分url使用http?
(1)过滤器:配置server.xml时同时开启http端口和https端口,并在程序中进行判断:对于希望使用http的url,将所有使用https进来的请求转到http;相反,对于希望使用https的url,将所有使用http进来的请求转到https。java web判断协议的方式是request.getScheme(),返回值时http、https或者ftp。
对于不做跳转处理的url,使用http或https访问都是可以的。
(2)urlrewrite配置【该方法已经验证有效】
<rule>
<condition type="scheme" operator="notequal">https</condition>
<from>^/user/index$</from>
<to type="redirect">https://cad.glodon.com/user/index</to>
</rule>
该方法的一个问题是无法获取该访问的主机名(正则表达式匹配可以获得匹配部分值,但是仅限于from中,见下例,在condition中无法使用);因此针对不同的主机(如localhost、正式域名等),需要进行不同的配置。
4、使用nginx配置部分https
(1)默认情况下,nginx会拦截https请求,进行解密等工作;然后将明文传给服务器(Tomcat);服务器处理后将响应传给nginx,nginx进行加密后传给客户端。也就是说,无论请求是http还是https,nginx与Tomcat之间总是http协议。
(2)方法1:在nginx和Tomcat中进行相应配置,使服务器可以使用getScheme()方法查询请求的协议(nginx和Tomcat之间仍然是http)。
nginx配置如下:
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
Tomcat的server.xml配置如下:
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="X-Forwarded-For"
protocolHeader="X-Forwarded-Proto"
protocolHeaderHttpsValue="https"/>
(3)方法2:在nginx中配置,对某些路径只能拦截https协议;如果是http协议不做处理。这种方式的一个缺点是,如果使用https的接口范围发生变化,需要修改nginx配置;当nginx由运维人员维护的时候,更加不便。
5、https与IE8兼容
(1)当网站从http迁到https时,在IE8下可能会存在兼容性为问题,导致显示错乱。
(2)可能的原因:当从http迁到https时,网页中对同网站资源的引用(没有加域名的部分)也会迁移,但是对其他网站上资源的引用,还是会使用原来的协议,如对js/css的引用;这可能会导致格式错乱的问题。
参考网页:
http://han.guokai.blog.163.com/blog/static/136718271201211631456811/
http://www.chinaz.com/web/2015/0320/391752.shtml
http://www.chinaz.com/special/https.shtml
http://freessl.wosign.com/https-web.html
http://kb.cnblogs.com/page/194742/
http://www.admin5.com/article/20150708/608526.shtml
http://www.oschina.net/question/12_23148?fromerr=GvhNjC3b
http://www.chinaz.com/web/2015/0318/391199.shtml
- internet协议入门
前言 劳于读书,逸于作文. 原文地址:internet协议入门 博主博客地址:Damonare的个人博客 博主之前写过一篇博客:网络协议分析,在这篇博客里通过抓包,具体的分析了不同网络协议的传送的数据 ...
- ASP.Net连接WebServer使用Https协议(证书)
ASP.Net使用Https(证书)协议连接WebService 最近使用ASP.Net连接WebService,不过走的协议是Https的,我一般用的使用都是普通的http协议.所以刚开始有点不值从 ...
- 牛客网Java刷题知识点之UDP协议是否支持HTTP和HTTPS协议?为什么?TCP协议支持吗?
不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 ...
- TCP/IP协议入门
TCP/IP协议入门 1. 简介 Transmission Control Protocol/Internet Protocol的简写,即传输控制协议/因特网互联协议.它是网络通信的一套协议集合. 先 ...
- HTTP&HTTPS协议详解之HTTP篇
一.HTTP简介 01.什么是HTTP HTTP(HyperText Transfer Protocol ,超文本传输协议),是一个基于请求与响应的,无状态的,应用层的协议,常基于TCP/IP协议传输 ...
- 网站使用https协议
了解https HTTPS 是以安全为目标的 HTTP 通道,即 HTTP 下加入 SSL 加密层.HTTPS 不同于 HTTP 的端口,HTTP默认端口为80,HTTPS默认端口为443. SSL ...
- 服务器开启https协议
开启Tomcat https服务 发布企业级应用的时候遇到一个问题,就是IOS7.1之后app的下载地址URL必须是https开头的协议,所以服务器必须支持https协议. 实验环境:Mac OSX ...
- 【转】Tomcat启用HTTPS协议配置过程
转载请注明出处: http://blog.csdn.net/gane_cheng/article/details/53001846 http://www.ganecheng.tech/blog/530 ...
- IIS同时实现网站部分使用https协议访问另一部分http访问
一:什么是https SSL(Security Socket Layer)全称是加密套接字协议层,它位于HTTP协议层和TCP协议层之间,用于建立用户与服务器之间的加密通信,确保所传递信息的安全性,同 ...
随机推荐
- phpmyadmin的初始账号密码是多少
问这个问题,是不是有点弱智,但是这个问题确实阻塞了我那么几分钟. 实际上问题很简单,初始账号是root,密码为空
- [进程管理]Linux进程状态解析之T、Z、X
Linux进程状态:T (TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态. 向进程发送一个SIGSTOP信号,它就会因响应该信号而进入 ...
- 【算法系列学习】codeforces D. Mike and distribution 二维贪心
http://codeforces.com/contest/798/problem/D http://blog.csdn.net/yasola/article/details/70477816 对于二 ...
- 关于WordPress搬家方法步骤的整理
最近准备更换自己的博客服务器,所以需要将原来服务器上的所有东西都搬到新的服务器.为了数据的安全,在网上找了很多的资料.现在整理一下整个搬家过程的操作步骤.下面进入正题: 1.测试环境这次我使用的示例服 ...
- Ubuntu14.04安装samba
Ubuntu14.04安装samba 按照惯例,首先介绍Samba.Samba是在Linux系统上实现的SMB(Server Messages Block,信息服务块)协议的一款免费软件.它实现在局域 ...
- Charles安装破解及使用
摘要 在发开过程中,追踪请求和监控请求与返回数据是我们经常会需要的一个需求,在Mac端,Charles是一款非常易用的抓包工具. Mac端的优秀抓包工具--Charles使用 一.简介 Charles ...
- OpenCV探索之路(十一):轮廓查找和多边形包围轮廓
Canny一类的边缘检测算法可以根据像素之间的差异,检测出轮廓边界的像素,但它没有将轮廓作为一个整体.所以要将轮廓提起出来,就必须将这些边缘像素组装成轮廓. OpenCV中有一个很强大的函数,它可以从 ...
- 《Android进阶》之第五篇 Fragment 的使用
http://blog.csdn.net/lmj623565791/article/details/37970961 1.Fragment的产生与介绍 Android运行在各种各样的设备中,有小屏幕的 ...
- Java基础知识二次学习--第五章 数组
第五章 数组 时间:2017年4月26日15:11:30~2017年4月26日15:15:54 章节:05章_01节 视频长度:09:30 内容:一维数组的内存分析 心得: Java中数组是引用类型 ...
- Python yield用法
yield 官方称是一种生成器,每每遇到这样包含这个关键字的代码,往往有些难读.def testyield(count): for x in xrange(count): print "te ...