原文地址:https://blog.51cto.com/11883699/2160032html
众所周知,WEB服务存在http和https两种通讯方式,http默认采用80做为通信端口,对于传输采用不加密的方式,https默认采用443,对于传输的数据进行加密传输nginx
目前主流的网站基本上开始默认采用HTTPS做为通讯方式,一切的考虑都基于对安全的要求,那么如何对本身的网站配置HTTPS通讯,是本文着重介绍的web
本文的主要内容包括:https加密传输的原理、如何申请https所用的CA证书,如何配置WEB服务支持https算法
一、https原理通俗讲解数据库
https=http+ssl,顾名思义,https是在http的基础上加上了SSL保护壳,信息的加密过程就是在SSL中完成的apache
首先咱们先不谈https,先从一个简单的通信原理图讲起:浏览器
http通讯原理tomcat
客户端发送一句client hello给服务器端,服务器端返回一句serverhello给客户端,鉴于本文讨论是https的加密主题,咱们只讨论信息传输的加密问题安全
实现客户端和服务端发送的信息client hello 和server hello,即便中间的包被窃取了,也没法解密传输的内容bash
http:client hello和server hello在通信的过程当中,以明文的形式进行传输,采用wireshark抓包的效果以下图:
有没有感受这个的信息传输是彻底暴露在互联网上面,你请求的全部信息均可以被窥测到,是否是感受心一凉,不过不用担忧,咱们的安全信息如今都是采用https的传输,后面讲到https的时候你们内心会顿时轻松。但这不是最关键的,http的传输最大的隐患是信息劫持和篡改,以下图:
能够看到,http的信息传输中,信息很容易被×××给劫持,更有甚者,×××能够假装服务器将篡改后的信息返回给用户,试想一下,若是×××劫持的是你的银行信息,是否是很可怕。因此对于http传出存在的问题能够总结以下:
(1)信息篡改:修改通讯的内容
(2)信息劫持:拦截到信息通讯的内容
这些是http不安全的体现,说完http,咱们回到本文的主题https,看下人家是怎么保护信息的,全部的请求信息都采用了TLS加密,若是没有秘钥是没法解析传输的是什么信息
对于加密传输存在对称加密和非对称加密
对称加密
对称加密传输
当客户端发送Hello字符串的时候,在进行信息传输前,采用加密算法(上图中的秘钥S)将hello加密程JDuEW8&*21!@#进行传输,即便中间被×××劫持了,若是没有对应的秘钥S也没法知道传出的信息为什么物,在上图中信息的加密和解密都是经过同一个秘钥进行的,对于这种加密咱们称之为对称加密,只要A和B之间知道加解密的秘钥,任何第三方都没法获取秘钥S,则在必定条件下,基本上解决了信息通讯的安全问题。但在现实的状况下(www),实际的通信模型远比上图复杂,下图为实际的通讯模型
server和全部的client都采用同一个秘钥S进行加解密,但你们思考下,若是这样的话,无异于没有加密,请作下思考
因为server和全部的client都采用同一个秘钥S,则×××们做为一个client也能够获取到秘钥S,欲盖弥彰。因此在实际的通信中,通常不会采用同一个秘钥,而是采用不一样的秘钥加解密,以下图
经过协商的方式获取不一样的秘钥
如上图,A和server通讯采用对称加密A算法,B和server通讯采用对称秘钥B算法,所以能够很好的解决了不一样的客户端采用相同的秘钥进行通信的问题
那如今又存在问题了,A经过明文传输和server协商采用了加密算法A,但这条信息自己是没有加密的,所以×××们仍是能够窃取到秘钥的,整个的通信仍然存在风险。那该如何处理呢?有人说,把这条信息(协调秘钥的过程)再次加密,那是否是还要协商加密秘钥,如此反复,永无止境。从根本上没法解决信息通信的安全问题
如何对协商过程进行加密
非对称加密原理图
在密码学跟对称加密一块儿出现的,应用最广的加密机制“非对称加密”,如上图,特色是私钥加密后的密文,只要是公钥,均可以解密,可是反过来公钥加密后的密文,只有私钥能够解密。私钥只有一我的有,而公钥能够发给全部的人。
基于上述的特色,咱们能够得出以下结论:
(1)公钥是开放给全部人的,但私钥是须要保密的,存在于服务端
(2)服务器端server向client端(A、B.....)的信息传输是不安全的:由于全部人均可以获取公钥
(3)但client端(A、B.....)向server端的信息传输确实安全的:由于私钥只有server端存在
所以,如何协商加密算法的问题,咱们解决了,非对称加密算法进行对称加密算法协商过程。
在这里咱们作个小结:
信息通讯采用http是不安全的,存在信息劫持、篡改的风险,https是加密传输,是安全的通讯,对于https加密的过程,咱们首先介绍的对称加密,采用对称加密进行通讯存在秘钥协商过程的不安全性,所以咱们采用了非对称加密算法解决了对协商过程的加密,所以https是集对称加密和非对称加密为一体的加密过程
安全的获取公钥
细心的人可能已经注意到了若是使用非对称加密算法,咱们的客户端A,B须要一开始就持有公钥,要不无法开展加密行为啊。
这下,咱们又遇到新问题了,如何让A、B客户端安全地获得公钥?
client获取公钥最最直接的方法是服务器端server将公钥发送给每个client用户,但这个时候就出现了公钥被劫持的问题,如上图,client请求公钥,在请求返回的过程当中被×××劫持,那么咱们将采用劫持后的假秘钥进行通讯,则后续的通信过程都是采用假秘钥进行,数据库的风险仍然存在。在获取公钥的过程当中,咱们又引出了一个新的话题:如何安全的获取公钥,并确保公钥的获取是安全的, 那就须要用到终极武器了:SSL 证书(须要购买)和CA机构
如上图所示,在第 ② 步时服务器发送了一个SSL证书给客户端,SSL 证书中包含的具体内容有证书的颁发机构、有效期、公钥、证书持有者、签名,经过第三方的校验保证了身份的合法,解决了公钥获取的安全性
以浏览器为例说明以下整个的校验过程:
(1)首先浏览器读取证书中的证书全部者、有效期等信息进行一一校验
(2)浏览器开始查找操做系统中已内置的受信任的证书发布机构CA,与服务器发来的证书中的颁发者CA比对,用于校验证书是否为合法机构颁发
(3)若是找不到,浏览器就会报错,说明服务器发来的证书是不可信任的。
(4)若是找到,那么浏览器就会从操做系统中取出 颁发者CA 的公钥,而后对服务器发来的证书里面的签名进行解密
(5)浏览器使用相同的hash算法计算出服务器发来的证书的hash值,将这个计算的hash值与证书中签名作对比
(6)对比结果一致,则证实服务器发来的证书合法,没有被冒充
(7)此时浏览器就能够读取证书中的公钥,用于后续加密了
至此第一部分关于HTTPS的原理介绍已经结束了,总结一下:
HTTPS要使客户端与服务器端的通讯过程获得安全保证,必须使用的对称加密算法,可是协商对称加密算法的过程,须要使用非对称加密算法来保证安全,然而直接使用非对称加密的过程自己也不安全,会有中间人篡改公钥的可能性,因此客户端与服务器不直接使用公钥,而是使用数字证书签发机构颁发的证书来保证非对称加密过程自己的安全。这样经过这些机制协商出一个对称加密算法,就此双方使用该算法进行加密解密。从而解决了客户端与服务器端之间的通讯安全问题。
二、证书获取的方式
因为HTTPS涉及到中间机构的校验,且这个校验的过程不是无偿的,须要收费,由于须要像第三方机构申请CA证书,用来完成身份的验证过程,这个过程也就是证书申请的过程,本章节为实战,具备实际的指导意义。
CA证书获取的渠道
现现在不比之前了,云服务的概念不只从理论上深刻到了互联网应用,并且变成了一个社会的基础设施工做,世界云服务3A:亚马逊AWS、微软Azure、阿里云,阿里云做为国人的骄傲跻身世界三大云服务厂商,且在国内,阿里云的市场份过半,且阿里云的操做系统“飞天系统”为自主研发,而不是采用开源的OpenStack。所以这些云服务厂商都提供了友好的CA证书申请流程,本文只以阿里云、腾讯云、AlphaSSL进行说明申请的流程
(1)、阿里云
登陆阿里云控制台(https://www.aliyun.com/)在安全找到SSL证书,以下图:
找到购买证书,进入以下流程:
阿里云现提供4家主流的国际认证机构,其实经过阿里云进行证书的申请,能够理解为由阿里云代理,帮你申请证书。对于证书有单一域名和通配符域名证书,顾名思义,单一域名的证书,获取的证书只能验证指定的一个域名的安全性,但通配符域名(如*.aa.com)全部的以*.aa.com开始的域名均可以识别,固然这里面涉及到DV SSL 、 OV SSL 、EV SSL的概念,由于在买以前必定要知道这个概念的意义,不然钱花的会不知所然。
DV SSL证书是只验证网站域名全部权的简易型(Class 1级)SSL证书,可10分钟快速颁发,能起到加密传输的做用,但没法向用户证实网站的真实身份。
目前市面上的免费证书都是这个类型的,只是提供了对数据的加密,可是对提供证书的我的和机构的身份不作验证。
OV SSL,提供加密功能,对申请者作严格的身份审核验证,提供可信×××明。
和DV SSL的区别在于,OV SSL 提供了对我的或者机构的审核,能确认对方的身份,安全性更高。
因此这部分的证书申请是收费的~
超安=EV=最安全、最严格 超安EV SSL证书遵循全球统一的严格身份验证标准,是目前业界安全级别最高的顶级 (Class 4级)SSL证书。
金融证券、银行、第三方支付、网上商城等,重点强调网站安全、企业可信形象的网站,涉及交易支付、客户隐私信息和帐号密码的传输。
这部分的验证要求最高,申请费用也是最贵的。
根据保护域名的数量需求,SSL证书又分为:
单域名版:只保护一个域名,例如 www.abc.com 或者 login.abc.com 之类的单个域名
多域名版:一张证书能够保护多个域名,例如同时保护 www.abc.com , www.bcd.com, pay.efg.com 等
通配符版:一张证书保护同一个主域名下同一级的全部子域名,不限个数,形如 *.abc.com 。注意,通配符版只有 DVSSL 和 OVSSL 具备, EVSSL 不具备通配符版本。
阿里云目前已经不提供免费的SSL证书,即DV SSL,但目前国内能够提供免费的SSL证书的云厂商有腾讯云,至于何时收费,笔者暂时不太清楚,但至少这个时期是OK的
腾讯云
登陆腾讯云控制台(https://cloud.tencent.com),找到SSL证书,以下图:
进入购买页面,找到域名型免费性(DV),点击“免费申请”
进入域名验证环节,须要注意:通用域名必须是指定的一个明确的域名地址,不能是通配域名,其次私钥密码在申请的过程当中是选填,但在国外网站申请的时候确实必填
选在验证方式,笔者通常会经过文件的方式,直接经过nginx建立一个文件目录,进行通讯就能够完成身份的验证,具体的验证过程能够参考腾讯云的详细说明。
等待审核经过,通常在1-3小时的时间
笔者在申请的过程当中是采用的国外的网站,提及来就是一把辛酸泪,由于国外的操做习惯和国人的习惯有很大的差别,且直接走国外申请须要填写的信息不少,但也有好处,便宜。具笔者计算,一个统配域名在国外买在1800人民币的样子,但在国内购买须要2500以上。接下来重点介绍AlphaSSL购买流程
申请网址:https://www.alphassl.com/ssl-certificates/select-region/
(1):选择所在区域,此处选择other(国外没有将Asia做为一个明确的区域标识气愤,但谁让咱们技不如人呢)
(2)产品详情:此处注意购买统配的域名,这个买起来更划算。
(3)基本信息的填写,没有什么须要注意的
(4)CSR这个步骤是最容易出错,且不太能让人理解的地方,笔者在这里作个简单的普及。
CSR(证书请求文件) 包含申请证书所须要的相关信息,其中最重要的是域名,填写的域名必须是你要https方式访问的那个域名。如abc.com 或 web.abc.com,其中CSR生成的方式不少,笔者直接用了网上的一个生成网站:https://myssl.com/csr_create.html
填写好相关的信息,尤为是域名信息必定要正确,能够根据生成的方式进行生成,生成以后产生了2个文件,一个为CSR文件,用来向CA机构申请的文件,通常以CSR结尾,一个是KEY文件,这个文件必定要保存好,这个文件就是对应第一章节将的server端的私钥,这个信息首先是重要,若是这个KEY文件没有保存好,是没法找回的,由于KEY生成的过程不可逆,即便填写的过程都同样,生成的KEY是不通的,具备随机性
https://support.globalsign.com/customer/portal/articles/1223116
将生成的CRS粘贴进入第四步点击下一步就进入了付款环节,因为是国外购买,因此必须使用VISA的信用卡。通常付款以后,6小时左右证书就能够下来。固然笔者在申请的过程当中就把KEY文件给丢了,致使找客服(英文对话,核实身份),其实若是申请存在问题,7天内是能够申请退款,其次若是你把KEY文件丢失了,能够经过找客服进行更新,详细能够参考:https://support.globalsign.com/customer/portal/articles/1223116
至此,对于第二章节的SSL申请过程就讲解 完毕,是否是很详细,笔者但是走了不少的坑,但对于SSL的申请是深刻了解
三、配置WEB服务支持https
经过第一章节HTTPS的原理讲解和第二章节对申请的介绍,到了咱们在WEB服务器端配置支持HTTPS,因为笔者是采用的nginx+tomcat的架构方式,所以配置的方式以nginx+tomcat的方式进行讲解
在nginx的配置文件中,新增以下配置项,在这个地方有一个参数:ssl on,若是这个参数开启,http和https将不能共存。里面对应的信息均可以经过CA机构获取到
listen 443 ssl; ssl_certificate /iyunwen/server/ssl/20180731.cer; ssl_certificate_key /iyunwen/server/ssl/20180731.key; ssl_prefer_server_ciphers on; ssl_session_timeout 10m; ssl_session_cache shared:SSL:10m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
这里给出了阿里云SSL在主流apache、nginx的配置文档:https://help.aliyun.com/video_detail/54216.html?spm=a2c4g.11186623.4.1.WbwjQN
腾讯云SSL配置文档:https://cloud.tencent.com/document/product/400/4143
但配置nginx以后,对于tomcat须要在配置文件conf/server.xml文件中新增以下内容
<Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="X-Forwarded-For" protocolHeader="X-Forwarded-Proto" protocolHeaderHttpsValue="https"/>