[TOC]
原文地址: HTTPS原理介绍以及证书签名的申请配置 (https://mp.weixin.qq.com/s/S-ZgJ3tFhmU4qvt80QwKqw)
0x00 前言介绍
什么是 HTTP/HTTPS 协议?
- HTTP协议全称Hyper Text Transfer Protocol-超文本传输协议,位于TCP/IP四层模型当中的应用层。
- HTTP协议通过请求/响应的方式,在客户端和服务端之间进行通信。
- 缺点:传输不够安全容易被拦截和篡改(HTTP协议的信息传输完全以明文方式,不做任何加密,相当于是在网络上“裸奔”)容易导致中间人攻击;
- HTTPS协议全称Hypertext Transfer Protocol Secure,超文本传输安全协议,实际上是在HTTP协议的基础之上增加了SSL安全层(下面介绍的一系列认证流程就是在SSL层中完成),这是一套使用公钥/私钥机制的加密系统
- 保护了交换数据隐私和完整性,提供对网站服务器身份认证的功能,简单来说它就是安全版的 HTTP。
- 最新推出的TLS协议是SSL 3.0协议的升级版,和SSL协议的大体原理是相同的(简单的记就是TLS是SSL的升级版本)
HTTP/HTTPS处于层次 TCP/IP层次 | 说明 —|— 应用层(HTTP[HTTPS]/FTP) | HTTPS在HTTP基础上构建 SSL安全层,经过发展已经推出了TLS协议; 传输层(TCP/UDP) | 网络层(IP/ARP) | 数据链路层 |
WeiyiGeek.层次
HTTPS 主要用途有三个:
- 一是通过证书等信息确认网站的真实性;
- 二是建立加密的信息通道;
- 三是数据内容的完整性。
HTTPS相比较于HTTP协议的一些关键点:
- 成本问题:HTTPS要比HTTP更加消耗资源,SSL握手需要更多的数据包,加密解密也需要额外的运算。
- HTTPS的证书需要专门的机构颁发,大机构颁发的证书不是免费的每年都得交几百几千块钱才能申请到证书
- 因为某些颁发证书的机构会滥发证书,甚至会制造假证书,假证书可以用来进行中间人攻击;
0x01 HTTPS原理
描述:在讲解HTTPS原理前面先来听听一个小故事; 在读小学的时候那时候不懂什么叫爱只知道喜欢和不喜欢,某一天上课我给我喜欢的女生写了一封告白信给她,不想在传递的过程之中被老师拦截并当场叫我宣读了,当时那是很尴尬也亲手藏送了我的爱情; 我当时在想如果上天愿意给我一个机会,我会将这封信加密后给她(并附上密码本),这样才凸显情调即使被老师拦截也不怕(因为她看不懂),说不定还能成功呢;
为什么要出现HTTPS协议? 答:打个比方小灰是客户端,小灰的同事小红是服务端,有一天小灰试图给小红发送请求,但是由于传输信息是明文,这个信息有可能被某个中间人恶意截获甚至篡改
WeiyiGeek.
所以为了解决这个问题我们提出了对数据进行加密传输处理,但是如何进行加密呢?以及如何选用加密方式?
常见的对称加密与非对称加密方式: 对称加密:对称加密是指加密与解密的使用同一个密钥的加密算法。比如上面案例的(密码本)使用了同一套加密密码,所以我用的加密算法就是对称加密算法。
- 目前常见的加密算法有:DES、AES、IDEA 等
非对称加密使用的是两个密钥,公钥与私钥,我们会使用公钥对网站账号密码等数据进行加密,再用私钥对数据进行解密。公钥会发给查看网站的所有人,而私钥是只有网站服务器自己拥有的
。
- 目前常见非对称加密算法:RSA,DSA,DH等。
通过下面的方式的演变可以看到HTTPS协议的发展扩充
方式1:采用对称加密方式 描述:小灰和小红可以事先约定一种对称加密方式,并且约定一个随机生成的密钥。 后续的通信中,信息发送方都使用密钥对信息加密,而信息接收方通过同样的密钥对信息解密。 该种方式缺陷: 因为第一次约定加密方式和密钥的通信仍然是明文,如果第一次通信就已经被拦截了,那么密钥就会泄露给中间人中间人仍然可以解密后续所有的通信内容。
WeiyiGeek.
为了解决这种方式我们采用非对称加密
,为密钥的传输做一层额外的保护。
方式2:采用非对称加密
描述:非对称加密的一组秘钥对中包含一个公钥public和一个私钥private。
原理:明文既可以用公钥加密,用私钥解密
;也可以用私钥加密,用公钥解密。在通信过程中,即使中间人在一开始就截获了公钥Key1,由于不知道私钥是什么也无从解密(但也不是绝对安全)。
步骤流程:
- 1.在小灰和小红建立通信的时候,小红首先把自己的公钥Key1发给小灰:
- 2.收到小红的公钥以后,小灰自己生成一个用于对称加密的密钥Key2,并且用刚才接收的公钥Key1对Key2进行加密(这里有点绕)发送给小红:
- 3.小红利用自己非对称加密的私钥,解开了公钥Key1的加密,获得了Key2的内容。从此以后两人就可以利用Key2进行对称加密的通信了。
但是这时候攻击手法又发生了更新,是什么坏主意呢?
- 中间人虽然不知道小红的私钥是什么,但是第一次通讯中截获了小红的公钥Key1之后,却可以偷天换日,自己另外生成一对公钥私钥把自己的公钥Key3发送给小灰。
- 通信再次被中间人截获,中间人先用自己的私钥解开了Key3的加密,获得Key2然后再用当初小红发来的Key1重新加密再发给小红。
- 两个人后续的通信尽管用Key2做了对称加密,但是中间人已经掌握了Key2所以可以轻松进行解密。
WeiyiGeek.
又为了解决这样的攻击方式,我们有必要引入第三方,一个权威的证书颁发机构(CA)来解决。
方式3:证书颁发机构(CA) 描述:签发证书的 CA 中心会发布一种权威性的电子文档—数字证书,它可以通过加密技术(对称加密与非对称加密)对我们在网上传输的信息进行加密,使用了SSL证书保证了网站的唯一性与真实性。 比如我在 github 上输入:
代码语言:javascript复制账号:cbssfaw
密码:123djaosid
#可是这个数据被黑客拦截盗窃了,那么加密后,黑客得到的数据可能就是这样的:
账号:çµø…≤¥ƒ∂ø†®∂˙∆¬
密码:∆ø¥§®†ƒ©®†©˚¬
最后一个就是验证数据的完整性,当数据包经过无数次路由器转发后会发生数据劫持,黑客将数据劫持后进行篡改比如植入羞羞的小广告。开启HTTPS后黑客就无法对数据进行篡改,就算真的被篡改了我们也可以检测出问题。
那到底什么是证书呢? 基于证书系统的公钥
- 一方面保证用户连接的是正确的网站,
- 另一方面结合私钥,可以保证网络数据不会被窃听。
WeiyiGeek.
流程如下:
- 作为服务端的小红,首先把自己的公钥发给证书颁发机构,向证书颁发机构申请证书。
- 证书颁发机构自己也有一对公钥私钥。机构利用自己的私钥来加密Key1,并且通过服务端网址等信息生成一个证书签名同样经过机构的
私钥加密
。证书制作完成后机构把证书发送给了服务端小红。 - 当小灰向小红请求通信的时候,小红不再直接返回自己的公钥,而是把自己申请的证书返回给小灰。
- 小灰收到证书以后验证证书的真伪。需要说明的是各大浏览器和操作系统已经维护了所有权威证书机构的名称和公钥。所以小灰只需要知道是
哪个机构颁布的证书,就可以从本地找到对应的机构公钥,解密出证书签名
。 - 接下来小灰按照同样的签名规则,自己也生成一个证书签名,如果两个签名一致,说明证书是有效的。验证成功后小灰就可以放心地再次利用机构公钥,解密出服务端小红的公钥Key1。
- 小灰利用服务端公钥Key1生成自己的对称加密密钥Key2,并且用服务端公钥Key1加密Key2发送给小红。
- 最后小红用自己的私钥解开加密,得到对称加密密钥Key2。于是两人开始用Key2进行对称加密的通信。
WeiyiGeek.
这时候就算中间人自己也向权威机构申请一个证书,并把小红发的证书偷偷换成自己的证书也没什么用;因为证书的签名是又服务端网址等信息生成的,并且经过权威机构(CA)私钥加密, 中间人也无法篡改,所以发给小灰的假证书是无法通过验证的(但是需要防止某些CA滥发证书,甚至会制造假证书,假证书可以用来进行钓鱼攻击);
各大浏览器例如Chrome、Firefox等,会时不时宣布吊销某些机构证书的决定,所以对付假证书的最好办法,就是把颁发假证书的机构删掉。
0x02 证书申请配置
首先了解一下SSL证书:
SSL证书用于加密HTTP协议也就是HTTPS。它分为三种类型,域名型SSL证书(DV SSL)、企业型SSL证书(OVSSL)、增强型SSL证书(EVSSL)
。
1.SSL证书三种类型 1.1 域名型 SSL 证书(DV SSL - Domain Validation SSL)
- 即证书颁布机构只对域名的所有者进行在线检查,通常是验证域名下某个指定文件的内容,或者验证与域名相关的某条 TXT 记录; 比如访问 [http|https]://www.weiyigeek.top/.../test.txt,文件内容: 2016082xxxxxmimvpcom2016 或添加一条 TXT 记录:www.weiyigeek.top –> TXT –> 20170xxxxxmimvpcom2066
1.2 企业型 SSL 证书(OV SSL - Organization Validation SSL)
- 是要购买者提交组织机构资料和单位授权信等在官方注册的凭证,证书颁发机构在签发 SSL 证书前,不仅仅要检验域名所有权,还必须对这些资料的真实合法性进行多方查验,只有通过验证的才能颁发 SSL 证书。
1.3 增强型 SSL 证书(EV SSL - Extended Validation SSL)
- 与其他 SSL 证书一样,都是基于 SSL/TLS 安全协议,但是验证流程更加具体详细,验证步骤更多,这样一来证书所绑定的网站就更加的可靠、可信。它跟普通 SSL 证书的区别也是明显的,安全浏览器的地址栏变绿,如果是不受信的 SSL 证书则拒绝显示,如果是钓鱼网站,地址栏则会变成红色,以警示用户。
2.推荐申请的SSL证书的网站:
- 2.1.腾讯云的SSL证书申请地址(推荐)https://cloud.tencent.com/product/ssl
- 2.2.Let’s Encrypt是国外一个公共的免费SSL项目(推荐)https://letsencrypt.org
- 2.3.CloudFlare SSL https://www.cloudflare.com/ssl/
- 2.4.sslforfree https://www.sslforfree.com/
3.为网站配置SSL证书 描述:在腾讯云申请后就能下载到一个压缩文件,里面存放了各个WEB应用服务器如何进行配置SSL; 也可以参考:https://cloud.tencent.com/doc/product/400/证书安装指引
(1) nginx为服务的配置方法,
首先你需要将解压出来的Nginx下的两个文件拷贝到你nginx.conf的目录下(例如:/usr/local/nginx/conf目录下),然后为nginx.conf添加以下的配置(如果已经有监听443端口的server则作出对应的修改即可),443端口跟80端口一样,只是80被http使用,443是https使用,当然这只是我的理解。
代码语言:javascript复制server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name weiyigeek.top;
# HSTS (ngx_http_headers_module is required) 应该只使用 HTTPS 而不是使用 HTTP 通信
add_header Strict-Transport-Security "max-age=31536000;includeSubDomains;preload" always;
# XXS-Protection
add_header X-XSS-Protection "1; mode=block";
# MIME 模拟探测
add_header X-Content-Type-Options nosniff;
# Frame 安全控制
add_header X-Frame-Options ALLOW-FROM music.163.com;
# Spider Robots 爬取策略限制
add_header X-Robots-Tag none;
# 开启 SSL ,如果想http 与 https 公用一个配置则可以将其注释( the "ssl" directive is deprecated )
# ssl on;
# 配置证书链与证书密钥
ssl_certificate /etc/nginx/ssl/fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/weiyigeek.top.key;
# ssl会话复用超时时间以及会话复用缓存大小
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
# 配置双证书时开启否则应该关闭
ssl_session_tickets off;
## OCSP stapling
ssl_stapling on;
ssl_stapling_verify on;
# 使用根 CA 和中间证书验证 OCSP 响应的信任链
ssl_trusted_certificate /etc/nginx/ssl/ca.cer;
# 仅使用ECDH是不用配置ssl_dhparam的否则你应该为它配置上
# curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam
ssl_dhparam /path/to/dhparam;
# 兼容性较为通用的SSL协议与加密算法套件
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE:ECDH:AES:HIGH:EECDH CHACHA20:EECDH CHACHA20-draft:EECDH AES128:RSA AES128:EECDH AES256:RSA AES256:EECDH 3DES:RSA 3DES:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:!NULL:!aNULL:!eNULL:!EXPORT:!PSK:!ADH:!DH:!DES:!MD5:!RC4;
# 安全配置: ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE;
# 证书常规握手加密算法方式共十八个,ECDHE、DHE、AES开头分别6个
; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:HIGH:!NULL:!aNULL:!eNULL:!EXPORT:!PSK:!ADH:!DES:!MD5:!RC4;
# 为了兼容性推荐服务器自动选择要使用的算法套件
ssl_prefer_server_ciphers on;
# replace with the IP address of your resolver
resolver 223.6.6.6 8.8.8.8 192.168.12.254;
}
配置完成后重启你的nginx服务,你就可以在浏览器上使用https访问你的网站了,浏览器会识别你的网站为安全网站,效果如下
WeiyiGeek.
(2) Apache 2.x 证书部署 2.1 获取证书:
- Apache文件夹内获得证书文件
1_root_bundle.crt,2_www.domain.com_cert.crt 和私钥文件 3_www.domain.com.key
。 - 1_root_bundle.crt 文件包括一段证书代码 “—–BEGIN CERTIFICATE—–” 和 “—–END CERTIFICATE—–”,
- 2_www.domain.com_cert.crt 文件包括一段证书代码 “—–BEGIN CERTIFICATE—–” 和 “—–END CERTIFICATE—–”,
- 3_www.domain.com.key 文件包括一段私钥代码 “—–BEGIN RSA PRIVATE KEY—–” 和 “—–END RSA PRIVATE KEY—–”。
2.2 编辑 Apache 根目录下 conf/httpd-ssl.conf 文件,修改成如下内容:
代码语言:javascript复制<VirtualHost _default_:443>
DocumentRoot "/var/www/html"
ServerName www.weiyi.top:443
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA:!RC4:!DH4
SSLCertificateFile /usr/local/httpd/cert/2_sss.club.crt
SSLCertificateKeyFile /usr/local/httpd/cert/3_sss.club.key
SSLCertificateChainFile /usr/local/httpd/cert/1_root_bundle.crt
WeiyiGeek.
最后查看网站的证书情况(以我的blog.weiyigeek.top网站为例), 下面club是我的旧域名
代码语言:javascript复制ID:RrmgT13e
证书类型:TrustAsia TLS RSA CA(1年)
通用名称:weiyigeek.github.io
证书密匙:weiyegeek.cTOP
WeiyiGeek.
0x03 补充证书申请
1.SSL-FOR-FREE
Let’s Encrypt 宣称将继续清除 Web 上采用 HTTPS 的障碍,让每个网站轻松获取管理证书。 网站地址:https://www.sslforfree.com/
时间节点:[2020年4月27日 16:41:33]
1.输入您需要申请通配符的免费证书,然后点击按钮 Create Free SSL Certificate
2.点击按钮进行DNS手动验证,按照要求在您的域名解析商后台进行设置txt记录此处我采用的是cloudflare
WeiyiGeek.
3.认证之后您可以采用它给的CSR或者自己提供的CSR文件证书签名请求文件
,然后点击下载即可;
WeiyiGeek.
4.注意事项:
- (1) 输入自己提供的CSR文件的时候不带
-----BEGIN NEW CERTIFICATE REQUEST-----
以及-----END NEW CERTIFICATE REQUEST-----
; - (2) 如果是自己提供的证书则下载的时候不包括密钥,因为在您生成csr文件过程中就会产生密钥文件(
注意文件的保存
)
0x04 总结
描述:通过上文我们已经知道,HTTPS 就是在 HTTP 传输协议的基础上对网站进行认证,给予它独一无二的身份证明再对网站数据进行加密,并对传输的数据进行完整性验证。HTTPS 作为一种加密手段不仅加密了数据,还给了网站一张身份证。
- HTTPS=数据加密 网站认证 完整性验证 HTTP
后述:如果让我回到十年前,那么我一定会这样跟我的女朋友传纸条: 先准备一张独一无二的纸条,并在上面签上我的大名(CA颁发证书-确定是否是本人),然后用只有我女朋友可以解密的方式进行数据加密,最后写完后用胶水封起来(防篡改)),防止隔壁桌的小王偷看修改小纸条内容。