HTTPS 原理
背景
无加密
在无加密的情况下,默认是HTTP协议,浏览器向代理服务器发送了请求后,代理服务器能够拦截浏览器的请求,从而达到伪造请求发送给Server、伪造结果发送给浏览器的目的。
加密算法
如果采用加密算法对浏览器发送的明文进行加密,将加密请求发送给Server,在这种情况下,是需要浏览器、Server服务器都拥有加密、解密算法逻辑,那么代理服务器可以通过解析浏览器网站,从中获得算法的加密、解逻辑,等同于说密文传输对代理服务器来说,依旧是透明的。
非对称加密算法
公钥加密私钥能解、私钥加密私钥能解、私钥加密公钥能解!公钥加密公钥不能解!!!
浏览器向Server服务器发起请求公钥的请求,Server返回一个公钥,但是这个公钥被代理服务器拦截了,它伪造一个假的公钥返回给浏览器,浏览器对通过假公钥对请求数据进行加密,代理服务器拦截后,使用假私钥解密数据,然后伪造请求到Server服务器中,依旧是不安全的。
非对称算法最主要的问题是浏览器无法识别公钥的真假。
对称加密算法
浏览器通过对数据进行对称加密,这个密钥如果是由浏览器随机生成的,再经过一种某种渠道传递给Server服务器,代理服务器如果无法获得这个密钥,那么加密的请求和结果代理服务器将无法进行识别。
那么最关键的问题在于如何将随机生成的密钥安全的传送给Server服务器呢?
加密,将随机生成的密钥采用非对称算法加密传送给Server,假设浏览器拥有一个正确的Server返回的公钥,简称Server.公钥,通过非对称加密算法(Server公钥+密钥) 生成密文发送,就算代理服务器拦截到了Server公钥,它也无法解密这串密文,因为公钥无法解密公钥加密的数据。
那么第二个关键问题在于如何让浏览器拥有一个正确的Server返回的公钥呢?换句话问,Server如何正确得将公钥发送给浏览器而不被串改?
先声明一个概念,只要让浏览器得到一个正确的Server.公钥,而不是一个伪造的假公钥,即使代理服务器拦截到Server.公钥也无任何意义,因为无法解密公钥加密的数据。
证书
引入一个第三方CA机构,通过非对称算法,利用Server.私钥生成Server.公钥,再将Server.公钥交付给CA机构进行加密,CA机构通过CA.私钥对Server.公钥加密,最后生成证书,下发到浏览器中。
合法的CA机构会和操作系统打交道,将CA公钥内置在操作系统中,浏览器获得证书后通过CA.公钥进行解密证书获得Server.公钥,这个步骤代理服务器没有CA.私钥,它没办法伪造一个不合格的证书。
也就是说,通过CA机构下发的合格证书,就能保证浏览器获得一个正确的Server.公钥。
HTTPS
证书生成以及自签名证书
1 | 相关概念: |
OPenSSL 自签名
下载
http://slproweb.com/products/Win32OpenSSL.html
证书中的信息
- Country Name (2 letter code) [XX]:CN #请求签署人的信息
- State or Province Name (full name) []: #请求签署人的省份名字
- Locality Name (eg, city) [Default City]:# 请求签署人的城市名字
- Organization Name (eg, company) [Default Company Ltd]:#请求签署人的公司名字
- Organizational Unit Name (eg, section) []:#请求签署人的部门名字
- Common Name (eg, your name or your server’s hostname) []:#这里一般填写请求人的的服务器域名,
服务器端证书
1.生成私钥
找到OpenSSL安装目录下的/bin目录中的OpenSSL.exe
执行命令
openssl genrsa -des3 -out c:/dev/server.key
生成私钥,需要提供一个至少4位,最多1023位的密码
2.由私钥创建待签名证书
1 | openssl.exe req -new -key c:/dev/server.key -out c:/dev/pub.csr |
需要依次输入国家,地区,城市,组织,组织单位,Common Name和Email。其中Common Name,可以写自己的名字或者域名,如果要支持https,Common Name应该与域名保持一致,否则会引起浏览器警告。
3.查看证书中的内容
openssl.exe req -text -in c:/dev/pub.csr -noout
自建CA
我们用的操作系统(windows, linux, unix ,android, ios等)都预置了很多信任的根证书,比如我的windows中就包含VeriSign的根证书,那么浏览器访问服务器比如支付宝www.alipay.com时,SSL协议握手时服务器就会把它的服务器证书发给用户浏览器,而这本服务器证书又是比如VeriSign颁发的,自然就验证通过了。
1.创建CA私钥
openssl.exe genrsa -out c:/dev/myca.key 2048
2.生成CA待签名证书
openssl.exe req -new -key c:/dev/myca.key -out c:/dev/myca.csr
3.生成CA根证书
openssl.exe x509 -req -in c:/dev/myca.csr -extensions v3_ca -signkey c:/dev/myca.key -out myca.crt
4.对服务器证书签名
openssl x509 -days 365 -req -in c:/dev/pub.csr -extensions v3_req -CAkey c:/dev/myca.key -CA c:/dev/myca.crt -CAcreateserial -out c:/dev/server.crt
Nginx配置
1 | server { |
随后在系统中安装证书,并且申请免费签名
SS安装
服务器端
1 | wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocksR.sh |
卸载
1 | ./shadowsocksR.sh uninstall |
运行状态
1 | /etc/init.d/shadowsocks status |
最后更新: 2020年11月29日 21:20