一、基本概念
1、https概念
https(全称: Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的http通道,简单讲是http的安全版。
2、为啥说http协议不安全呢?
我们用http协议往服务器发送比较私密的数据(比如银行卡、身份证等),被中间人通过抓包工具窃取,中间人把数据修改或替换,然后再发送到服务器,服务器收到数据也不知道是否来自客户端,有没有被修改或替换。
3、SSL和TLS的的区别
https在http的基础下加入SSL/TLS协议,SSL证书是老的协议,在SSL基础上发展出TLS新的协议, 目前https实际上是TLS协议。
4、建立安全的网站需要SSL证书,那么证书收费吗?
CA证书是由权威机构颁发的,权威机构是经过认证的;证书的可信性基于信任机制,权威机构需要对其颁发的证书进行信任背书,只要是权威机构颁发的证书都是合法的。权威机构会对申请信息进行审核,不同的权威机构对审核的要求也不一样,于是证书也分为免费的、便宜的和贵的。CA证书相当于人的身份证,CA机构相当于国家。每个组织都可以颁发证书,只是没有认证就不可信。银行的安全要求高,通常因为不信任其它CA机构,通过自签证书来保证安全。
5、申请证书,一定需要域名吗?
公网网站申请SSL/TLS证书,需要域名。对于内网、测试环境或某些特殊情况(如自签名证书或客户端证书),则不需要域名。
6、加密算法
https用到了非对称加密和对称加密,非对称加密生成了一对密钥(一个公钥和一个私钥),对称加密只需要一个密钥。非对称密钥加解密流程:公钥加密,私钥解密;私钥加密,公钥解密。
二、CA证书原理
1、证书申请流程
CA机构颁发数字证书,服务器向CA机构申请数字证书。申请流程如下:
(1)服务器本地生成一对非对称密钥,然后将公钥和其他信息(公司名称、域名等)发送给CA机构。
(2)CA机构用这些信息,选择一种单向的HASH算法进行加密,加密之后的东西称为摘要。
(3)CA用自己的私钥对摘要进行加密,加密之后的数据称为数字签名。
(4)CA将服务器的申请信息(包含服务器的公钥)和数字签名整合在一起,由此生成数字证书,传递给服务器。
2、数字证书和数字签名的区别?
数字证书包含数字签名,数字签名是数字证书的一部分。数字签名可以通过CA的公钥解密成摘要。
3、什么是数字证书?和SSL证书有啥区别?
所有的SSL证书都是数字证书,但是并不是所有的数字证书都是SSL证书。
数字证书是一个更广泛的概念,有更多的应用场景。而SSL证书主要用于网站加密通讯。
4、nginx配置自签名证书
(1)生成服务端私钥
openssl genrsa -des3 -out server.key
(2)由私钥创建待签名证书
openssl req -new -key server.key -out pub.csr
(3)创建CA私钥
openssl genrsa -des3 -out myca.key 2048
(4)生成CA待签名证书
openssl req -new -key myca.key -out myca.csr
(5)生成CA根证书
openssl x509 -req -in myca.csr -extensions v3_ca -signkey myca.key -out myca.crt
(6)对服务器证书签名
openssl x509 -days 365 -req -in pub.csr -extensions v3_req -CAkey myca.key -CA myca.crt -CAcreateserial -out server.crt
(7)将server.crt和server.key拷贝到nginx的conf目录下,重命名server.crt为server.pem
(8)修改nginx配置文件nginx.conf
server {listen 443 ssl;server_name 192.168.23.252;ssl_certificate server.pem;ssl_certificate_key server.key;location / {root html;index index.html index.htm;}}
(9)重启nginx,输入证书密码
(10)如果错误日志中出现:the event “ngx_master_20488” was not signaled for 5s。需要将server.key改为免密的,然后重启后可以通过https访问自签名的网站
openssl rsa -in server.key -out server.key.unsecure
三、https实现原理
一、https的加解密流程:
1、服务器获取到数字证书,客户端发送请求后,发送给客户端。
2、客户端电脑和浏览器内置了一部分权威机构的根证书,这些证书中包含了CA的公钥。证书是分级的树状结构,根证书的公钥在子级也使用。
3、客户端用CA的公钥去解密SSL证书中的数字签名。解密成功就说明证书来自合法的认证机构。解密成功,客户端就拿到了摘要。
4、客户端用SSL证书中的申请信息,用和CA机构一致的加密方式进行HASH算法加密,看加密之后的摘要和解密的摘要是否一致。一致的话,说明内容完整,没被篡改。
5、客户端生成随机的对称加密密钥,用从证书中拿到服务器的公钥进行加密,发送给服务器。
6、服务器用自己的私钥解密获取到对称密钥,然后用对称密钥加密数据,发送密文给客户端。
7、客户端用自己本地存的生成的随机密钥解密,获得明文的数据。以此类推,客户端和服务器通过对称加密的方式进行数据传输。
客户端和服务器通过非对称加密交换对称密钥,然后用对称密钥进行数据加密传输。用到了两对非对称密钥,一对是服务器生成的,一对是CA机构生成的。服务器的非对称密钥用于交换客户端和服务器的对称密钥,CA机构非对称密钥用于加密数字摘要、解密数字签名。
二、为什么需要 CA 认证机构颁发证书?
假设不存在认证机构,任何人都可以制作证书,这带来的安全风险便是经典的“中间人攻击”问题。具体过程如下:
1、客户端请求正规网站,获取证书。
2、中间人劫持了请求,伪造了自己的证书,发给客户端。同时请求获取正规网站的证书,存到中间人本地。
3、客户端生成随机数,作为对称加密的密钥。用中间人伪造证书的公钥进行加密并发送请求。
4、中间人劫获并用自己证书的私钥进行解密,获取到了对称密钥,存在本地。并用正规网站证书的公钥对解密后的密钥进行加密,发送给正规网站。
5、正规网站用自己证书的私钥进行解密,获取到对称加密的私钥。用对称加密的私钥进行数据加密,发送到中间人。
6、中间人用本地存的私钥进行解密,获取传输的明文。再用本地存的私钥进行加密,将密文返回客户端。
7、客户端用本地生成的私钥进行解密,获取明文内容。
三、https一定是安全的吗
https可以防止用户在不知情的情况下通信被监听,如果用户主动授信,是可以构建“中间人”网络,代理软件可以抓包对传输内容进行解密。https对于主动授信的抓包操作是不提供防护的,因为这个场景用户是已经对风险知情。常用的测试抓包工具如Fiddler、Charles。