在学习kubernetes的过程中,关于监控部署这一部分中涉及到了HTTPS方面的知识。以前曾经在Web安全实践这门课上了解过这方面的知识,如今需要再详细的梳理一下HTTPS的认证过程。
HTTP VS HTTPS
因特网早期的很多东西在设计方面都没有考虑安全方面的因素,HTTP协议就是一个鲜明的例子。HTTP采用的明文传输的,如果我们使用wireshark抓包工具,可以很轻易的嗅探一些信息。
HTTPS在HTTP的基础上增加了安全方面的考虑,主要分为2个过程。
- 使用RSA加密算法来进行身份认证以及协商加密算法和秘钥
- 使用协商后的加密算法进行数据传输
HTTPS的身份认证
这里的身份认证分为2类,大多数情况下都是客户端需要验证服务端的身份,在政府以及银行一些领域,服务端也需要验证客户端的身份,这身份认证过程中使用的是RSA加密算法。
RSA加密算法
RSA加密算法是一种非对称加密算法,加密和解密的钥匙是不同的,所以被称为非对称加密算法。它有2种秘钥,分为公钥和私钥,公钥任何人都可以查到的,而私钥属于私人保管。这种加密体系下,私钥加密的的密文只有公钥可以解开,所以私钥可以用来签名;而公钥加密的密文只有私钥可以解开,它可以用来加密传输。
在密码学中,很多加密算法都来源于一个数学难题,没错RSA算法的原理也来自于数论领域中的大数难于被质因分解的问题。它的秘钥生成过程大致如下:
- 选取2个非常大的质数 p 和 q ,而 n = p * q
- 随机选取一个数 e1 ,但要求 e1 与 (p-1) * (q-1) 互质
- 再选择 e2 ,e2 是 e1 关于 (p-1) * (q-1)的模逆
- (n, e1) 和 (n, e2) 即是我们的公私钥
注意 e1 和 e2 要相距较远,不然暴力很容易求解这一对秘钥。假如 (n, e1) 是公钥,待加密的明文为 0x4089 那么加密后的密文为 X 为:
X = 0x4089 ^ e1 mod n
解密过程为 :
X ^ e2 mod n = 0x4089
大致了解了RSA加密算法的原理,那怎么应用到HTTPS中的呢?为了进行服务端或者客户端的认证,我们需要生成一个证书。
使用OpenSSL生成证书
关于认证方面的事情一般都需要个第三者,为了验证某个人身份的合法性,我们需要向一个公信力非常强的组织求证。在HTTPS中,CA 就是这个第三者,它会给一个公司或者组织颁发一个证书,为了获取这个证书,公司或者组织往往要交一大笔费用的。
在12306的网站中,就是没有 CA 认证的证书,所以每次访问的时候,都要手动点击信任。为了测试使用,我们自己生成一个 CA ,用来认证自己颁发的证书。首先我们生成一个2048位的 CA 私钥 ca.key
# openssl genrsa -out ca.key 2048
通过私钥 ca.key 可以生成公钥 ca.csr
# openssl rsa -in ca.key -pubout -out ca.csr
然后我们用 ca.key 来颁发 CA 的证书 ca.crt
# openssl req -x509 -new -nodes -key ca.key -subj "/CN=baidu.com" -days 5000 -out ca.crt
其他人可以根据 CA 的公钥 ca.csr 来解密解密这个证书进行验证 CA 的身份。因为 CA 的证书是通过 ca.key 来颁发的,也就是说这个证书上有 CA 的签名,我们使用 CA 的公钥 ca.csr 就可以解密这个证书,来验证这个 CA 证书的有效性。
同理,为了让我们的公司或者组织可以被其他人信任,我们需要让 CA 给我们的公司或者组织颁发一个证书。首先我们先自己生成一个公私钥对
# openssl genrsa -out server.key 2048
# openssl req -new -key server.key -subj "/CN=lecury.cn" -out server.csr
我们把生成后的私钥 server.key 自己保管,公钥 server.csr 交给 CA ,为我们制作证书 server.crt
# openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 5000
HTTPS中对服务端的验证
在一些HTTPS网站中,在进行通信前,客户端和服务端的双方需要一些身份认证。大部分的情况下,客户端需要对服务端进行验证,过程如下:
- 服务端将自己的证书发给客户端(浏览器)
- 客户端(浏览器)向本地的 CA 求证服务端的证书信息是否合法,即用CA的公钥来解密服务端证书的内容
- 若验证成功之后,会提取出服务端证书中的服务端的公钥,用这个公钥来加密信息(自己支持的加密算法以及秘钥)
- 服务端收到之后,利用私钥解开,协商一种加密算法,然后利用此算法进行数据传输过程中的加密。
在HTTPS过程中RSA加密算法用来对双方身份信息的验证,因为RSA为非对称加密算法,加密效率相对低下,所以在实际进行数据传输的过程中,采用的一般是对称加密算法比如说DES等。
对客户端的认证
服务端请求对客户端身份信息的验证,这种情况一般发生在政府或者银行的网站上。一般的解决办法是网银盾或者是USBkey,客户端的证书保存在服务端那里,由服务端来验客户端身份的有效性。
总结
HTTPS是因特网安全领域的一个重要变现,它广泛的应用在了各个网站的身份认证中,了解一下它的基本原理还是非常有必要的。