一、算法
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协议。
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;
}
}