一个天朗气清的周末,决定看一下Composer的源码,从安装文件先看起,一路顺畅,直到遇到了openssl_xxx(),什么鬼啊这是,忽然回想起在系统上安装软件的时候常常出现SSL:xxxx的错误?他们之间究竟有什么关系,听说Https和ssl也有关系,妈耶,因而有了这篇科普文。php
文章逻辑是按照笔者的思考问题的历程写下的,可能有些跳跃,你们多担待。nginx
文中大部份内容是经过维基百科和百度百科来的,可能本身有部分理解不对,环境你们提出指正。git
维基百科:OpenSSL是一个开放源代码的软件库包,应用程序可使用这个包来进行安全通讯,避免窃听,同时确认另外一端连线者的身份。github
问题来了算法
安全通讯
了?接下来,挨个来突破这些问题。浏览器
小明开发了一个多人博客网站,全部人均可以在上面发表文章,下载资源安全
小黑开发了一个多人博客网站,只容许登陆的用户在上面发表文章,下载资源bash
以前我一直觉得,用户认证的过程就是安全通讯的过程。: (服务器
如下是英文版维基百科的定义,中文版的维基百科和百度百科没有找到相关的定义。网络
Secure communication is when two entities are communicating and do not want a third party to listen in.
中文:安全通讯是指两个实体正在通讯而且不但愿第三方监听。
复制代码
为了达到上述的目标,就须要**以不易被窃听或拦截
**的方式进行通讯。
维基百科中还有一段话,附上
Other than spoken face-to-face communication with no possible eavesdropper, it is probably safe to say that no communication is guaranteed secure in this sense, although practical obstacles such as legislation, resources, technical issues (interception and encryption), and the sheer volume of communication serve to limit surveillance.
中文大体意思:除了无法监听面对面交流,理论上其余的手段只能限制监听。
复制代码
Tips:有兴趣能够阅读如下维基百科原文 en.wikipedia.org/wiki/Secure… 有一些关于安全的讨论。
OK!看完百科的定义,咱们能够get一些关键词:监听
和拦截
,安全通讯,就是围绕这两个概念展开的。
关于窃听,有两个问题。
先来看问题1
,计算机中窃听,一般指的是网络窃听,接下来,有请万能的维基百科。
在电脑网络中,窃听攻击是在网络层,利用软件,收集其余电脑送出的封包(Packet),分析其内容,以取得其中的资讯。
复制代码
get到关键词,网络层
和Packet
,对于这两个概念不熟悉的同窗,请出门右转(点击这里)
网络层提供路由与寻址功能,若是在这一层动手脚,那么源IP+端口/目标IP+端口/Packet咱们在这一层中均可以获取到,解析Packet,就能够获取到咱们所发送的内容。
再来看问题2
,理论上,大部分的公共wifi均可以被窃听,运营商的基站,甚至是一些代理。原理也比较简单,附上一个教程github
不赘述,附上百科
理论上,咱们是没法避免窃听的,由于咱们开发的应用是在应用层,远在网络层的攻击,咱们是没法避免的。咱们能作的,就是即便数据被监听了,他没法解析出来他想要的数据。
Http与Https的区别就是,Https将Http明文传输的协议进行加密,即便信息被截取,也没法破解。
Https使用的加密方式是对称加密
配置过Https的都知道,配置流程中,只须要申请pem和key文件(CA证书
),在nginx中配置规则,开启443端口便可。
那么问题来了:
(注意:客户端是没有任何配置的)
咱们去看Https的维基百科(长文预警
)。
HTTPS的主要思想是在不安全的网络上建立一安全信道,并可在使用适当的加密包和服务器证书可被验证且可被信任时,对窃听和中间人攻击提供合理的防御。
HTTPS的信任继承基于预先安装在浏览器中的证书颁发机构(如Symantec、Comodo、GoDaddy和GlobalSign等)(意即“我信任证书颁发机构告诉我应该信任的”)。所以,一个到某网站的HTTPS链接可被信任,当且仅当:
- 用户相信他们的浏览器正确实现了HTTPS且安装了正确的证书颁发机构;
- 用户相信证书颁发机构仅信任合法的网站;
- 被访问的网站提供了一个有效的证书,意即,它是由一个被信任的证书颁发机构签发的(大部分浏览器会对无效的证书发出警告);
- 该证书正确地验证了被访问的网站(如,访问https://example.com时收到了给example.com而不是其它组织的证书);
- 互联网上相关的节点是值得信任的,或者用户相信本协议的加密层(TLS或SSL)不能被窃听者破坏。
复制代码
关键词提取:预先安装在浏览器中的证书颁发机构
也就是说中,预先安装了一个叫证书颁发机构
的东西,想知道这个东西有什么用,咱们就须要了解客户端的证书颁发机构和服务器端(CA证书
)的工做原理(SSL握手过程
),如下内容来自百度百科:
感叹一声,大写的NB!!!
不理解上述步骤的,看一下个人简化版(C客户端,S服务器
):
随机数1
,用S端公匙加密,产生随机密码1
随机密码1
,获取随机数1
,此时,C端与S端使用相同的方式对随机数1
进行运算获得一个通信密码
哈哈哈,上面不当心已经解释过SSL创建链接的过程了。这里只简单说几点:
CA
SSL是协议层安全性协议 TSL是传输层安全性协议
TSL使用X.509认证(看到这里,终于知道composer安装文件中为何大量出现openssl_x509_parse,妈耶
) SSL认证方式前面已经提到
TLS工做在传输层,应用层协议能透明地运行在TLS协议之上
php中的openssl_xxx()系列的函数,只是php的一个openssl的扩展库,封装了大量的关于加密解密方面的函数。
openssl是ssl协议的相关实现。
结束。
Life is fantastic!!!