HTTPS知识点梳理

1,349 阅读14分钟

一、算法

1、对称加密算法

用途:信息加密。

  • AES:Advanced Encryption Standard
  • DES:Data Encryption Standard

2、非对称加密算法

用途:信息加密、数字签名。

  • RSA:常用非对称加密算法。基于一个十分简单的数论事实:将两个大素数相乘十分容易,但想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,即公钥,而两个大素数组合成私钥。公钥是可发布的供任何人使用,私钥则为自己所有,供解密之用。
  • ECC:Elliptic Curves Cryptography,椭圆曲线密码编码学。
  • DH:Diffie-Hellman。
  • DSA:Digital Signature Algorithm,数字签名算法,和 RSA 不同的是 DSA 仅能用于数字签名,不能进行数据加密解密,其安全性和RSA相当,但其性能要比RSA快。
  • ECDSA:Elliptic Curve Digital Signature Algorithm,椭圆曲线签名算法,是ECC和 DSA 的结合。

3、哈希算法

用途:生成摘要,防止信息篡改。

  • SHA1/SHA128/SHA256/SHA384:Secure Hash Algorithm。
  • MD5:Message Digest Algorithm 5。

二、HTTP->HTTPS

1、HTTP

HTTP(Hypertext Transfer Protocol)采用明文传输信息,存在信息窃听、信息篡改和信息劫持的风险。

2、HTTPS

HTTPS (Secure Hypertext Transfer Protocol)安全超文本传输协议,是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息。它使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版,是使用TLS/SSL加密的HTTP协议。

HTTPS=HTTP+TLS

HTTP与HTTPS的区别

  • HTTPS加密传输;HTTP明文传输
  • HTTPS需要证书
  • HTTPS对搜索引擎更友好,利于SEO
  • 标准端口不一样,HTTPS443;HTTP80

3、如何做到安全传输

方案一:对称加密

通信双方通过约定的对称加密方式,对通信数据加密后传输。对称加密的问题:密钥需要在网络中传输,如果首次密钥泄露给中间人,后续加密传输名存实亡。

方案二:非对称加密

非对称加密部分解决了对称加密的问题,只将公钥在网络中传输,私钥只有服务端持有,保证Client给Server的数据不会被泄露。但是Server给Client的报文仍然会泄露,因为公钥是在网络中传输的。

此外,中间人如果截获服务器公钥,可以将自己伪装成Server参与双方通信。也就是说,Client与Server的报文都会泄露,并且会被篡改。

方案三:SSL/TLS

  • 使用非对称加密,要防止中间人伪造公钥。Server将数字证书传递给Client,在证书中存放服务器公钥。此外证书上需要有数字签名,保证这个证书信息是没有篡改过的。证书需要权威CA机构颁发,根证书是Client操作系统内置的。
  • 如果所有数据传输都使用非对称加密,效率低,所以使用对称加密。这个密钥称为会话密钥
  • 会话密钥不能泄露,也就是说不能在网络中直接传输会话密钥。不直接传输密钥,协商出会话密钥的过程,称为密钥协商
  • 可以简单认为:通过密钥协商得到会话密钥,会话密钥用于后续报文加密传输。而密钥协商,需要用到证书中的服务器公钥,加密密钥协商过程中的报文。

三、概念

  • SSL:Secure Socket Layer,安全套接字层。位于可靠的面向连接的网络层协议(TCP)和应用层协议(HTTP)之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。
  • TLS:Transport Layer Security,传输层安全协议。是IETF(Internet Engineering Task Force,Internet工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。TLS的主要目标是使SSL更安全,并使协议的规范更精确和完善。

  • CA:证书颁发机构(Certificate Authority)即颁发数字证书的机构。是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。
  • 数字证书:数字证书由CA机构颁发,证书上的内容包括:颁发证书的上级CA机构、Server端的公钥、数字签名、证书主体信息(主体地址、常用名称(往往是域名))、有效期等。
  • 证书链:证书与证书关联形成证书链。最顶层的证书称为根证书是可信的,为下级证书生成数字签名,下级再为下下级生成数字签名。客户端验证服务器证书,需要将证书链都验证通过,服务器证书才是可信的。根证书是内置在客户端操作系统中的,根证书是自签证书(由于没人能验证根证书的合法性,只能自己给自己签名)。

  • 数字签名(指纹):为保证服务器传输给客户端的数字证书没有经过篡改,需要使用数字签名。

    • 数字签名使用算法:哈希算法+非对称加密算法
      • 哈希算法:SHA
      • 非对称加密算法:RSA、ECDSA
    • 生成签名:对证书信息做哈希运算(如SHA)生成摘要,上级CA机构使用自己的私钥进行非对称加密(如RSA)。
    • 验证签名:对证书信息做哈希运算生成摘要A,使用Server证书的上级证书上的公钥,对Server证书上的签名解密得到摘要B。如果A等于B则验证通过。(上级证书需要先验证通过,否则使用上级证书的公钥解密是不可信的)。
  • 密钥协商:通过client_random、server_random、pre_master_key计算得到master_key(会话密钥)的过程。其中pre_master_key基于非对称加密算法。

    • RSA:client生成随机数作为pre_master_key,通过server端证书上的公钥加密传输给server端,server端使用证书公钥对应私钥解密得到pre_master_key。
    • ECDHE(ECC+DH):ECC椭圆曲线算法(EC)与DH算法结合,最后一个E代表着「短暂的」,是指交换的密钥是暂时的动态的,而不是固定的静态的。client和server需要相互传递自己的一个DH参数,然后双方通过两个DH参数计算得到pre_master_key。
  • OpenSSL:SSL的一个开源实现。

  • X.509:一种证书标准,主要定义了证书中应该包含哪些内容。

  • 证书编码格式:X.509证书,可能有不同的编码格式,目前有以下两种编码格式。

    • PEM:Privacy Enhanced Mail,以"-----BEGIN..."开头,以"-----END..."结尾,内容是BASE64编码。
    • DER:Distinguished Encoding Rules,二进制格式,不可读。
  • 文件扩展名

    • .pem:表示这是PEM格式的文件,可能是私钥也可能是证书。
    • .der:同.pem,表示文件格式。
    • .crt:certificate,表明这是个证书,格式可能是pem也可能是der。
    • .cer:certificate,表明这是个证书,格式可能是pem也可能是der。
    • .key:密钥,表明这是个公钥或私钥,格式可能是pem也可能是der。
    • .csr:Certificate Signing Request,证书签名请求,是向权威证书颁发机构获得签名证书的申请,其核心内容是Server公钥、域名等主体信息。
    • .p12:将证书与私钥合并存放的一个文件,生成和取出证书、私钥都需要输入密码。
  • 前向安全:前向安全性或前向保密性,有时也被称为完美前向安全,是密码学中通讯协议的安全属性,指的是长期使用的主密钥泄漏不会导致过去的会话密钥泄漏。

四、TLS1.2握手

TLS的目标:身份认证,协商会话密钥用于后续的数据加密。

TLS/SSL的功能实现主要依赖于三类基本算法:

  • 非对称加密:实现身份认证和密钥协商
  • 对称加密:采用协商的密钥,对数据(Application Data)加密
  • 哈希:验证数据完整性(没有篡改)

TLS/SSL握手根据密钥协商算法不同,流程稍有不同,针对TLS1.2,总体分为以下几个阶段:

  • 确定握手使用加密套件:ClientHello、ServerHello
  • Client验证Server端身份:Certificates
  • 密钥协商:Client/Server Key Exchange、计算会话密钥
  • 确认会话密钥:Change Cipher Spec、Encrypted Handshake Message

使用RSA密钥交换算法的流程图如下:

使用ECDHE密钥交换算法的流程图如下:

简单来说,TLS/SSL(1.2)握手如下面流程所示:

1、Client Hello

ClientHello的目的是告知Server端,Client支持的加密算法套件和签名算法。此外如果要继续上次会话,会带上SessionID,减少重复握手造成的性能损耗。

  • Random:客户端随机数(client_random)。
  • Cipher Suites:告诉服务端,客户端支持的所有加密套件。
  • Extension signature_algorithms:告诉服务端,客户端支持的签名算法。

2、Server Hello

ServerHello的目的是告知Client本次握手使用的加密算法套件。

  • Random:服务端随机数(server_random)。
  • Cipher Suite:告诉客户端,本次TLS握手使用的加密算法套件。
  • Extension ec_point_formats:如果使用ECDHE密钥协商协议,这里提供椭圆曲线相关信息。

加密套件格式:密钥协商算法 + 数字签名非对称加密算法 + 会话密钥对称加密算法 + 摘要哈希算法

例如: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

  • ECDHE:密钥协商算法。
  • RSA:数字签名使用的非对称加密算法。
  • AES_256_GCM:会话密钥使用的对称加密算法。
  • SHA384:哈希算法。

3、Certificates

Server将证书发送给Client,包含Server证书和签发Server证书的机构的证书(证书链)。

服务器证书包含:

  • 主体信息:域名等信息。浏览器会校验。
  • 服务器公钥:Server向ca机构发起证书申请时,提供自己生成的公钥(RSA)。这个公钥会存放在证书中。
  • 数字签名:证书发给Client后,Client要验证这个数字签名。签名和验签见上面的第三部分。

4、Server Key Exchange

ServerKeyExchange的目的是携带密钥交换的额外数据,报文内容对于不同的协商算法套件都会存在差异。

在某些场景中,服务器不需要发送任何内容,这意味着在这些场景中根本不会发送ServerKeyExchange消息

  • 对于使用DHE/ECDHE非对称密钥协商算法的SSL握手,将发送该类型报文。
  • RSA算法不会继续该握手流程。

ECDHE密钥交换

发送EC Diffie-Hellman Server Params给客户端。

经过椭圆曲线计算(EC),得到密钥协商(DH)的服务端(Server)参数(Params),将这个参数发送给客户端。

  • Pubkey:DH服务端参数。
  • Signature Algorithm: 签名算法选择rsa_pkcs1_sha256,这是从Client Hello报文中选择客户端支持的签名算法其中之一。
  • Signature:签名。对Pubkey使用sha256做哈希,然后使用rsa加密。需要Client验证Pubkey是否被篡改(哈希),报文的发送方是否是Server(非对称加密)。Client使用Server证书上的rsa公钥解密得到A,对Pubkey做hash256得到B,验证A等于B。(验签方式与证书验签是一样的)

5、Server Hello Done

ServerHelloDone消息表明服务器已经将所有预计的握手消息发送完毕。在此之后,服务器会等待客户端发送消息。

6、Client Key Exchange

ECDHE密钥交换

发送EC Diffie-Hellman Client Params给服务端。

经过椭圆曲线计算(EC),得到密钥协商(DH)的客户端(Client)参数(Params),将这个参数发送给服务端。

  • Pubkey:DH客户端参数。

RSA密钥交换

客户端生成随机数(pre_master_key),使用服务端证书上的公钥加密,发送给服务端。

7、双方计算会话密钥

  • Hello阶段得到client_random和server_random(明文传输)。
  • KeyExchange阶段得到其他必要参数(密文传输),计算得到pre_master_key(预主密钥)。
    • ECDHE:利用客户端DH参数和服务端DH参数,进行椭圆曲线相关计算。计算逻辑参考:xz.aliyun.com/t/2526
    • RSA:对于client,pre_master_key是自己生成的;对于server,需要将Client Key Exchange阶段client密文传输给自己的报文,通过自己的私钥解密得到pre_master_key。
  • 计算master_key=func(client_random,server_random,pre_master_key)。
  • 这个master_key即为后续对称加密使用的会话密钥。

8、Change Cipher Spec

Client和Server如果计算好了master_key(会话密钥),双方都会发出这个报文,表示后续的报文用master_key进行对称加密,对称加密算法使用ServerHello约定的加密套件中的算法。

9、Encrypted Handshake Message

Client和Server发送完Change Cipher Spec报文后,最后都会发出Encrypted Handshake Message报文。这个报文对握手过程中的数据做哈希运算后,使用会话密钥加密。双方收到对方的Encrypted Handshake Message报文后验证无误,进入正式的数据传输过程,后续都会使用会话密钥对称加密数据传输。

五、会话恢复

1、基于Session ID

每次会话都有一个编号Session ID。如果对话中断,下次重连的时候,只要客户端给出这个编号,而且服务器有这个编号的记录,双方就可以重新使用已有的会话密钥进行加密通信,而不必重新生成。

缺点:SessionID只存在于一台服务器上,如果客户端请求到另一台服务器,就无法恢复会话。

2、基于Session Ticket

服务端首次会话时,会密文传给客户端一个Session Ticket。这个Session Ticket包含会话密钥,只有服务端能解密。每个服务器都能够解密Session Ticket得到会话密钥

六、TLS1.3握手

TLS1.2需要两次往返(2-RTT)才能完成握手,而TLS1.3只需要一次往返(1-RTT)就可以完成握手。TLS1.3不再支持RSA密钥交换,可以使用前向安全的ECDHE密钥交换。

TLS1.3的最大变化是取消了KeyExchange消息,这些信息被包含在Hello消息的Extension中。

1、Client Hello

2、Server Hello

七、OpenSSL

1、非对称加密

原文

echo '123' > msg.txt

生成RSA私钥

openssl genrsa -out private.key 2048

生成RSA公钥

openssl rsa -pubout -in private.key -out public.key

公钥加密

openssl rsautl -encrypt -inkey public.key -pubin -in msg.txt -out enc.msg.txt

私钥解密

openssl rsautl -decrypt -inkey private.key -in enc.msg.txt -out dec.msg.txt

2、签名

未签名文本

echo '......' > content.txt

生成RSA私钥

私钥用于制作签名

openssl genrsa -out private.key 2048

生成RSA公钥

公钥用于验证签名

openssl rsa -pubout -in private.key -out public.key

用私钥制作签名

openssl dgst -sign private.key -sha256 -out sign.content.txt content.txt

用公钥验证签名

openssl dgst -verify public.key -sha256 -signature sign.content.txt content.txt

3、证书

3-1、CA证书

模拟一个CA机构的证书,用于后续签发服务器证书。

生成CA私钥

openssl genrsa -out ca.private.key 2048

创建CA自签证书

openssl req -new -x509 -key ca.private.key -out ca.crt -days 365 -subj /C=CN/ST=Shanghai/L=Shanghai/O=ca/OU=ca/CN=www.ca.com
  • x509 证书标准
  • key ca私钥
  • out 输出为ca证书
  • days 证书有效时长
  • subj 主体信息
    • C/ST/L:国家城市
    • O/OU:机构
    • CN:CommonName,通用名称
  • CN 域名

3-2、服务器申请证书

生成私钥

openssl genrsa -out server.private.key 2048

向ca申请请证书Certificate Signing Request

openssl req -new -key server.private.key -out server.csr -days 365 -subj /C=CN/ST=Shanghai/L=Shanghai/O=xx/OU=xx/CN=localhost
  • key 服务器私钥
  • subj 主体信息
    • CN 域名
  • out 输出为CertificateSigningRequest,发送给CA

3-3、CA为服务器颁发证书

openssl x509 -req -days 365 -CA ca.crt -CAkey ca.private.key -CAcreateserial -in server.csr -out server.crt
  • CA 指定ca证书
  • CAkey 指定ca私钥
  • CAcreateserial 生成ca序列号
  • in 输入为服务器的Certificate Signing Request文件
  • out 输出为服务器的证书

查看证书

openssl x509 -in server.crt -noout -text

3-4、证书的格式

  • pem:base64编码,以...END结尾(默认格式)
  • der:二进制格式,不可读

pem格式转换为der格式:

openssl x509 -in server.crt -outform der -out server.der.crt

查看der格式证书

openssl x509 -in server.der.crt -noout -text -inform der

3-5、p12证书文件

使用证书和私钥合成p12文件,需要输入密码。后续导出证书和私钥需要再次输入。

$ openssl pkcs12 -export -clcerts -in server.crt -inkey server.private.key -out server.p12
Enter Export Password:123456
Verifying - Enter Export Password:123456

p12导出证书

openssl pkcs12 -clcerts -nokeys -out server.bak.crt -in server.p12

p12导出私钥

openssl pkcs12 -nocerts -nodes -out server.bak.private.key -in server.p12

八、Nginx配置证书

server {
	listen	443 ssl;
	server_name localhost;
	
	ssl_certificate conf.d/local/server.crt;
	ssl_certificate_key conf.d/local/server.private.key;

	location / {
		root html;
		index index.html;
	}
}