首页 技术 正文
技术 2022年11月6日
0 收藏 471 点赞 398 浏览 7171 个字

目录
什么是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、SEOGoogle会优先考虑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,3DESHASH算法: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.shtmlhttp://www.chinaz.com/special/https.shtmlhttp://freessl.wosign.com/https-web.htmlhttp://kb.cnblogs.com/page/194742/http://www.admin5.com/article/20150708/608526.shtmlhttp://www.oschina.net/question/12_23148?fromerr=GvhNjC3bhttp://www.chinaz.com/web/2015/0318/391199.shtml

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,996
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,510
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,353
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,137
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,770
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,848