本篇飞书原文有文字颜色标注,便于阅读一些:ghcljx72eo.feishu.cn/docx/EhJmd9…
前言
如果只是日常UI开发,网络接口开发对TLS是无感知的。但理解TLS工作原理对在网络安全方面做正确的技术决策非常重要,比如:
- TLS在设计上规避了哪些安全问题
- 使用HTTPS已经是安全的了,到底要不要再做一层数据加密
- C端软件在服务器HTTPS证书过期时如何应对
下面是我学习TLS连接建立过程的记录,以及对各连接环节技术原理的理解,最后通过对这些内容的理解再回答上面的几个问题。
TLS所处网络层级位置
TLS可实现网络数据的加密传输,位于应用层与TCP之间,在网络通信层级中处于下图中的位置:
也就是说在建立TLS之前,需要先依赖TCP建立可靠连接。在建立TLS连接之后,就可以通过加密的方式收发HTTP数据。那也就表明TLS保障的是传输层安全,防止“中间人”搞破坏,至于客户端与服务器两头它并不负责。
TLS提供加密传输,采取的是对称加密传输,而其设计核心便是如何用非对称加密完成对称加密密钥的生成,并在客户端,服务端各持一份,绝不会被中间人窃取。
一张图讲清楚TLS连接过程
用时序图来表达TLS连接建立过程是一种非常好的形式,在通过分析每个时序的数据细节来呈现完整的连接建立过程。下面这张图是我上一次学习TLS时画的,里面的文字表达不太好,这次做一些优化。
整个流程很好看明白,值得注意的是其中两个关键的节点。证书信任链与非对称与对称加密密钥转换时机。
证书的信任链
当客户端收到服务器发回的证书信息时,里面包含了3组信息,分别是服务器证书信息,服务器证书签发机构信息,签发机构指定的根证书机构信息。比如下面这两张证书,分别是processon.com 与 baidu.com的证书结构:
wiki 右图根证书机构名称 :GlobalSign 是一家WebTrust认证的数字证书认证机构和SSL证书签发商,于1996年在比利时创立)。现为GMO Internet, Inc. 成员企业,在美国、中国、英国等国家或地区均设有办事处。
根证书机构通常是国家级别的机构,并由设备系统维护。而CA机构则是由根证书机构授权,所以他们信任机制在逻辑上可以这样描述:
用根证书机构的公钥校验证书签发机构的证书签名,用证书签发机构的证书签名校验证书签发机构的公钥,用证书签发机构的公钥校验服务器证书的签名,用服务器证书的签名校验服务器的公钥。
我用相同颜色标注了同名内容,不然单纯读起来真的有点儿容易眩晕。
完成了这个信任链条的校验,就确认了服务器证书的可信度,下一步客户端便可使用服务器公钥对Pre-master secret进行加密再发送给服务器,服务器再用自己的私钥解密。
这里还解决了一个常见的网络安全问题:DNS劫持。采取TLS后在DNS被劫持时,由于返回的主机名等信息与客户端请求时的不一致,就无法建立连接,客户端便不会解析返回的数据用于展示。也就是说,在没有TLS的情况下,应用层也可以规避DNS劫持,自主完成router信息校验即可。
对称加密密钥生成过程与组成
客户端随机数,服务器随机数都是对外暴露的,通过非对称加密获取的Pre-master secret 是安全的,相当于一个“盐”。这三个加一起就可以在两端算出相同的Master secret ,根据Master secret 算出相同的客户端加密密钥,服务端加密密钥这两个对称加密密钥。
值得一提的是,为什么要分别准备两对密钥,即发的时候用对方的密钥加密,对方收到后再用对应的密钥解。这是为了防止重放攻击(replay atack),朱老师举的例子太形象了:
女孩生气时用软件给男孩发一句“分手吧”的消息,结果被黑客入侵,黑客解不开但是将数据包原样又丢了回来,这样女孩就会收到一个“分手吧”,从此感情彻底破裂。
感叹设计TLS的人们真是太厉害了,同时也不免想起三体小说中的三体人,三体人之间没有秘密,他们就根本不需要加密这种东西。
在APP开发中基于对TLS的理解有哪些应用
最后试着回答开头提到的三个问题:
- TLS在设计上规避了哪些安全问题
DNS劫持,重放攻击
- 使用HTTPS已经是安全的了,到底要不要再做一层数据加密
TLS是防止中间人攻击,如果需要防止末端设备的数据安全,那么再做一层在HTTP之上的数据加密是一个可行的办法,为了保证有效需要采用非对称加密方案,其性能开销与安全性需要平衡。
- C端软件在服务期HTTPS证书过期时如何应对
1.检测错误并上报至数据平台,及时发现用户异常。对于javax.net.ssl.SSLHandshakeException,它包括诸如下面这样的描述信息,有助于分析具体原因:
1.java.security.cert.CertificateExpiredException: certificate expired
2.java.security.cert.CertificateNotYetValidException: certificate not yet valid
3.java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
4.java.security.cert.CertificateException: No subject alternative names present
2.提醒用户:可以在APP界面上弹出提示框,提醒用户该服务器证书已经过期,并建议用户不要使用该APP或不要执行敏感操作,如输入个人信息或进行支付等。
4.容灾,采用备用服务器:可以使用备用服务器或备用证书,以确保APP可以继续正常工作。备用服务器应该具有有效的证书,以确保用户数据的安全性。
5.降级:可以降低APP的一些功能,如暂停在线支付或不允许用户登录等,以减少安全风险。
6.使用私有证书:但面对APP私有证书存在更新不及时或失败的风险,同样需要做好平衡
浏览橘子树其他文章:橘子树的个人写作记录