一、https是什么(相关概念简述)?
超文本传输安全协议(英语:Hypertext Transfer Protocol Secure,缩写:HTTPS,常称为HTTP over TLS,HTTP over SSL或HTTP Secure)是一种通过计算机网络进行安全通信的传输协议。 —— 维基百科
1.对称加密和非对称加密
对称加密:需要对加解密的数据采用相同的密钥的加密算法。
优点:加密算法公开,计算量小,加密速度快,通常用在消息发送方加密大量数据的时候使用
缺点:需要消息传递的双方约定加密的密钥,一旦一方的密钥泄漏,信息就变得不安全了
非对称加密:需要两个密钥(公钥和私钥)来进行加密和解密,公钥解密私钥的加密数据、私钥解密公钥的加密数据,私钥一般存储在服务器端不会外漏
优点:相对于对称加密更安全,即使公钥泄漏也没办法解密
缺点:加解密花费时间长,只适合小数据量的加解密。
2.https的加解密方式
https采用的是非对称加密和对称加密混合的方式进行加密的。
使用非对称加密的方式加密传递对称加密的密钥,随后使用对称加密进行通讯。
HTTP 建立 TCP 链接需要进行三次握手
HTTPS 在 TCP 之上又加上了 TLS 的握手过程,在握手过程中确定双方传输数据的密码信息。
SSL/TLS 握手是为了安全的协商出一份对称加密的密钥
3.对称加密与非对称加密
对称加密算法在加密和解密时使用的是同一个秘钥;
而非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。
与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。
公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。
因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
4.https TLS握手过程
1 | 1.浏览器发送一个消息:包含一个随机数Random1,支持的加密套件,TLS版本号(被叫做ClientHello请求) |
握手结束之后,之后所有的通信数据将由浏览器之前生成的随机密码并利用对称加密算法进行加密
ps:之前浏览器与服务端互相发送加密的握手消息验证,目的是为了保证双方都获得了一致的对称加解密的密码,并且验证双方可以正常的加解密数据,为后面的真正数据传输做一次测试。
5.https session Key
https建立连接是一个比较复杂的过程,如果连接断开之后需要重新进行建立连接。
重连有两种方式:sessionID和session ticket
如果对话中断,客户端可以发送之前的session重连对话,如果服务端存在这个sessionId就可以重新建立连接。
session ID是目前所有浏览器都支持的方法,但是它的缺点在于session ID往往只保留在一台服务器上。
所以,如果客户端的请求发到另一台服务器,就无法恢复对话。session ticket就是为了解决这个问题而诞生的,目前只有Firefox和Chrome浏览器支持。
6.openssl是什么?
是一个开源程序的套件,这个套件有三个部分组成:一是libcryto,这是一个具有通用功能的加密库,里面实现了众多的加密库;二是libssl,这个是实现ssl机制的,它是用于实现TLS/SSL的功能;三是openssl,是个多功能命令行工具,它可以实现加密解密,甚至还可以当CA来用,可以让你创建证书、吊销证书。
二、为什么要使用https
1.数据加密,提高安全性。
2.证书保证,防止冒充
3.校验数据,防止被篡改
三、如何使用https
1.使用openssl生成本地证书
1)准备工作
创建一个存放证书的目录,如/sshkey:
1 | cd ~ |
在sskkey目录下创建demoCA子目录
1 | cd sshkey |
2)正式生成
制作CA证书:
第一步:生成ca.key CA私钥
1 | openssl genrsa -des3 -out ca.key 2048 |
第二步:生成ca.crt CA根证书(公钥):
1 | openssl req -new -x509 -days 7305 -key ca.key -out ca.crt |
生成网站的证书,并用CA签名认证(假设网站域名为 example.com)
第三步:生成 example.com证书私钥:
1 | openssl genrsa -des3 -out example.com.pem 1024 |
第四步:制作解密后的 example.com证书私钥:
1 | openssl rsa -in example.com.pem -out example.com.key |
ps:在common name中填入网站域名,如 example.com 即可生成改站点的证书(这里一定要填入common name,不然生成的东西为空)
第五步:生成签名请求:
1 | openssl req -new -key example.com.pem -out example.com.csr |
第六步:用CA进行签名:
1 | openssl ca -policy policy_anything -days 1460 -cert ca.crt -keyfile ca.key -in example.com.csr -out example.com.crt |
如果一切顺利,生成完成之后在demoCA下应该会看到如下子目录
1 | ls |
遇到的问题
如果遇到如下报错
1 | Using configuration from /private/etc/ssl/openssl.cnf |
解决办法:将openssl安装目录下的openssl.cnf 拷贝到配置目录
1 | cp /usr/local/etc/openssl/openssl.cnf /private/etc/ssl/openssl.cnf |
并修改其中的配置文件的dir的文件路径为之前创建的demoCA文件路径
1 | dir >> = /learn/epoos/sshkey/demoCA/ > > |
至此,使用openssl生成本地证书的过程就结束了,接下来就只需要在nginx中配置一番就可以看到一个https的网站了。
2.生成证书之后nginx配置如下
1 | 1 server # 使用nginx做普通http代理 |
相关链接
使用openssl创建https证书
HTTPS为什么安全 &分析 HTTPS 连接建立全过程
ruanyifeng 图解SSL/TLS协议
ruanyifeng SSL/TLS协议运行机制的概述